diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java index 2569f4a9404..d11978c6b74 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java @@ -146,16 +146,20 @@ public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup aboutBinding.appVersion.setText(BuildConfig.VERSION_NAME); aboutBinding.githubLink.setOnClickListener(nv -> - openUrlInBrowser(context, context.getString(R.string.github_url))); + openUrlInBrowser(context, context.getString(R.string.github_url), + false)); aboutBinding.donationLink.setOnClickListener(v -> - openUrlInBrowser(context, context.getString(R.string.donation_url))); + openUrlInBrowser(context, context.getString(R.string.donation_url), + false)); aboutBinding.websiteLink.setOnClickListener(nv -> - openUrlInBrowser(context, context.getString(R.string.website_url))); + openUrlInBrowser(context, context.getString(R.string.website_url), + false)); aboutBinding.privacyPolicyLink.setOnClickListener(v -> - openUrlInBrowser(context, context.getString(R.string.privacy_policy_url))); + openUrlInBrowser(context, context.getString(R.string.privacy_policy_url), + false)); return aboutBinding.getRoot(); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 470de3aa940..1d3d65d7295 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -16,7 +16,6 @@ import android.os.Handler; import android.os.Looper; import android.provider.Settings; -import android.text.util.Linkify; import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; @@ -97,6 +96,7 @@ import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.ImageDisplayConstants; +import org.schabi.newpipe.util.LinkHelper; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; @@ -113,8 +113,6 @@ import java.util.concurrent.TimeUnit; import icepick.State; -import io.noties.markwon.Markwon; -import io.noties.markwon.linkify.LinkifyPlugin; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.CompositeDisposable; @@ -1232,7 +1230,8 @@ private void prepareDescription(final Description description) { if (description.getType() == Description.HTML) { disposables.add(Single.just(description.getContent()) .map(descriptionText -> - HtmlCompat.fromHtml(descriptionText, + LinkHelper.createLinksFromHtmlBlock(requireContext(), + descriptionText, videoDescriptionView, HtmlCompat.FROM_HTML_MODE_LEGACY)) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) @@ -1241,15 +1240,13 @@ private void prepareDescription(final Description description) { videoDescriptionView.setVisibility(View.VISIBLE); })); } else if (description.getType() == Description.MARKDOWN) { - final Markwon markwon = Markwon.builder(requireContext()) - .usePlugin(LinkifyPlugin.create()) - .build(); - markwon.setMarkdown(videoDescriptionView, description.getContent()); + LinkHelper.createLinksFromMarkdownText(requireContext(), description.getContent(), + videoDescriptionView); videoDescriptionView.setVisibility(View.VISIBLE); } else { //== Description.PLAIN_TEXT - videoDescriptionView.setAutoLinkMask(Linkify.WEB_URLS); - videoDescriptionView.setText(description.getContent(), TextView.BufferType.SPANNABLE); + LinkHelper.createLinksFromPlainText(requireContext(), description.getContent(), + videoDescriptionView); videoDescriptionView.setVisibility(View.VISIBLE); } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index 0342bb99c75..5e92328c0eb 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -1,8 +1,6 @@ package org.schabi.newpipe.fragments.list.channel; import android.content.Context; -import android.content.Intent; -import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; @@ -205,8 +203,7 @@ public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { private void openRssFeed() { final ChannelInfo info = currentInfo; if (info != null) { - final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(info.getFeedUrl())); - startActivity(intent); + ShareUtils.openUrlInBrowser(requireContext(), info.getFeedUrl(), false); } } diff --git a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java index a4b6af2ab01..91128e728bc 100644 --- a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java +++ b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java @@ -246,11 +246,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { goToReturnActivity(); break; case R.id.menu_item_share_error: - final Intent intent = new Intent(); - intent.setAction(Intent.ACTION_SEND); - intent.putExtra(Intent.EXTRA_TEXT, buildJson()); - intent.setType("text/plain"); - startActivity(Intent.createChooser(intent, getString(R.string.share_dialog_title))); + ShareUtils.shareUrl(this, getString(R.string.error_report_title), buildJson()); break; } return false; @@ -273,10 +269,10 @@ private void openPrivacyPolicyDialog(final Context context, final String action) .putExtra(Intent.EXTRA_SUBJECT, ERROR_EMAIL_SUBJECT) .putExtra(Intent.EXTRA_TEXT, buildJson()); if (i.resolveActivity(getPackageManager()) != null) { - startActivity(i); + ShareUtils.openContentInApp(context, i); } } else if (action.equals("GITHUB")) { // open the NewPipe issue page on GitHub - ShareUtils.openUrlInBrowser(this, ERROR_GITHUB_ISSUE_URL); + ShareUtils.openUrlInBrowser(this, ERROR_GITHUB_ISSUE_URL, false); } }) 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 36f39a6e554..5c7eb4c3f92 100644 --- a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java +++ b/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java @@ -69,7 +69,8 @@ public boolean onTouch(final View v, final MotionEvent event) { handled = handleUrl(v.getContext(), (URLSpan) link[0]); } if (!handled) { - link[0].onClick(widget); + ShareUtils.openUrlInBrowser(v.getContext(), + ((URLSpan) link[0]).getURL(), false); } } else if (action == MotionEvent.ACTION_DOWN) { Selection.setSelection(buffer, diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index 1f1b945452a..2fd786ead1f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -364,8 +364,8 @@ public static void showMetaInfoInTextView(@Nullable final List metaInf } } - metaInfoTextView.setText(HtmlCompat.fromHtml(stringBuilder.toString(), - HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING)); + LinkHelper.createLinksFromHtmlBlock(context, stringBuilder.toString(), + metaInfoTextView, HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING); metaInfoTextView.setMovementMethod(LinkMovementMethod.getInstance()); metaInfoTextView.setVisibility(View.VISIBLE); metaInfoSeparator.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/schabi/newpipe/util/LinkHelper.java b/app/src/main/java/org/schabi/newpipe/util/LinkHelper.java new file mode 100644 index 00000000000..7b84b4dcad1 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/LinkHelper.java @@ -0,0 +1,68 @@ +package org.schabi.newpipe.util; + +import android.content.Context; +import android.text.SpannableStringBuilder; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.text.style.URLSpan; +import android.text.util.Linkify; +import android.view.View; +import android.widget.TextView; + +import androidx.core.text.HtmlCompat; + +import io.noties.markwon.Markwon; +import io.noties.markwon.linkify.LinkifyPlugin; + +public final class LinkHelper { + private LinkHelper() { + } + + public static SpannableStringBuilder createLinksFromHtmlBlock(final Context context, + final String htmlBlock, + final TextView textView, + final int fromHtmlOption) { + return changeIntentOfDescriptionLinks(context, HtmlCompat.fromHtml(htmlBlock, + fromHtmlOption), textView); + } + + public static void createLinksFromPlainText(final Context context, + final String plainTextBlock, + final TextView textView) { + textView.setAutoLinkMask(Linkify.WEB_URLS); + textView.setText(plainTextBlock, TextView.BufferType.SPANNABLE); + changeIntentOfDescriptionLinks(context, textView.getText(), textView); + } + + public static void createLinksFromMarkdownText(final Context context, + final String markdownBlock, + final TextView textView) { + final Markwon markwon = Markwon.builder(context).usePlugin(LinkifyPlugin.create()).build(); + markwon.setMarkdown(textView, markdownBlock); + + changeIntentOfDescriptionLinks(context, textView.getText(), textView); + } + + private static SpannableStringBuilder changeIntentOfDescriptionLinks(final Context context, + final CharSequence chars, + final TextView textView) { + final SpannableStringBuilder textBlockLinked = new SpannableStringBuilder(chars); + final URLSpan[] urls = textBlockLinked.getSpans(0, chars.length(), URLSpan.class); + + for (final URLSpan span : urls) { + final ClickableSpan clickableSpan = new ClickableSpan() { + public void onClick(final View view) { + ShareUtils.openUrlInBrowser(context, span.getURL(), false); + } + }; + textBlockLinked.setSpan(clickableSpan, textBlockLinked.getSpanStart(span), + textBlockLinked.getSpanEnd(span), textBlockLinked.getSpanFlags(span)); + textBlockLinked.removeSpan(span); + } + + textView.setText(textBlockLinked); + textView.setMovementMethod(LinkMovementMethod.getInstance()); + + return textBlockLinked; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index b45a1e7b9bc..9c7bd349007 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -247,16 +247,14 @@ public static void playOnExternalPlayer(final Context context, final String name public static void resolveActivityOrAskToInstall(final Context context, final Intent intent) { if (intent.resolveActivity(context.getPackageManager()) != null) { - context.startActivity(intent); + ShareUtils.openContentInApp(context, intent); } else { if (context instanceof Activity) { new AlertDialog.Builder(context) .setMessage(R.string.no_player_found) .setPositiveButton(R.string.install, (dialog, which) -> { - final Intent i = new Intent(); - i.setAction(Intent.ACTION_VIEW); - i.setData(Uri.parse(context.getString(R.string.fdroid_vlc_url))); - context.startActivity(i); + ShareUtils.openUrlInBrowser(context, + context.getString(R.string.fdroid_vlc_url), false); }) .setNegativeButton(R.string.cancel, (dialog, which) -> Log.i("NavigationHelper", "You unlocked a secret unicorn.")) @@ -569,27 +567,14 @@ public static Intent getIntentByLink(final Context context, return getOpenIntent(context, url, service.getServiceId(), linkType); } - private static Uri openMarketUrl(final String packageName) { - return Uri.parse("market://details") - .buildUpon() - .appendQueryParameter("id", packageName) - .build(); - } - - private static Uri getGooglePlayUrl(final String packageName) { - return Uri.parse("https://play.google.com/store/apps/details") - .buildUpon() - .appendQueryParameter("id", packageName) - .build(); - } - private static void installApp(final Context context, final String packageName) { try { // Try market:// scheme - context.startActivity(new Intent(Intent.ACTION_VIEW, openMarketUrl(packageName))); + ShareUtils.openUrlInBrowser(context, "market://details?id=" + packageName, false); } catch (final ActivityNotFoundException e) { // Fall back to google play URL (don't worry F-Droid can handle it :) - context.startActivity(new Intent(Intent.ACTION_VIEW, getGooglePlayUrl(packageName))); + ShareUtils.openUrlInBrowser(context, + "https://play.google.com/store/apps/details?id=" + packageName, false); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java index b631f19da53..b229a793dde 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.util; +import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; @@ -21,22 +22,80 @@ private ShareUtils() { * Open the url with the system default browser. *

* If no browser is set as default, fallbacks to - * {@link ShareUtils#openInDefaultApp(Context, String)} + * {@link ShareUtils#openInDefaultApp(Context, Intent)} * * @param context the context to use * @param url the url to browse + * @param httpDefaultBrowserTest the boolean to set if the + * test for the default browser will be for HTTP protocol + * or for the created intent */ + public static void openUrlInBrowser(final Context context, final String url, + final Boolean httpDefaultBrowserTest) { + final String defaultPackageName; + final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (httpDefaultBrowserTest) { + defaultPackageName = getDefaultBrowserPackageName(context); + } else { + defaultPackageName = getDefaultAppPackageName(context, intent); + } + + if (defaultPackageName.equals("android")) { + // no browser set as default (doesn't work on some devices) + openInDefaultApp(context, intent); + } else { + try { + intent.setPackage(defaultPackageName); + context.startActivity(intent); + } catch (final ActivityNotFoundException e) { + // not a browser but an app chooser because of OEMs changes + intent.setPackage(null); + openInDefaultApp(context, intent); + } + } + } + + /** + * Open the url with the system default browser. + *

+ * If no browser is set as default, fallbacks to + * {@link ShareUtils#openInDefaultApp(Context, Intent)} + *

+ * This call {@link ShareUtils#openUrlInBrowser(Context, String, Boolean)} with true + * for the boolean parameter + * + * @param context the context to use + * @param url the url to browse + **/ public static void openUrlInBrowser(final Context context, final String url) { - final String defaultBrowserPackageName = getDefaultBrowserPackageName(context); + openUrlInBrowser(context, url, true); + } - if (defaultBrowserPackageName.equals("android")) { - // no browser set as default - openInDefaultApp(context, url); + /** + * Open a content with the system default browser. + *

+ * If no app is set as default, fallbacks to + * {@link ShareUtils#openInDefaultApp(Context, Intent)} + * + * @param context the context to use + * @param intent the intent of the file to open + */ + public static void openContentInApp(final Context context, final Intent intent) { + final String defaultAppPackageName = getDefaultAppPackageName(context, intent); + + if (defaultAppPackageName.equals("android")) { + // no app set as default (doesn't work on some devices) + openInDefaultApp(context, intent); } else { - final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)) - .setPackage(defaultBrowserPackageName) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); + try { + intent.setPackage(defaultAppPackageName); + context.startActivity(intent); + } catch (final ActivityNotFoundException e) { + // not an app to open a file but an app chooser because of OEMs changes + intent.setPackage(null); + openInDefaultApp(context, intent); + } } } @@ -46,19 +105,46 @@ public static void openUrlInBrowser(final Context context, final String url) { * If no app is set as default, it will open a chooser * * @param context the context to use - * @param url the url to browse + * @param viewIntent the intent to open + */ + private static void openInDefaultApp(final Context context, final Intent viewIntent) { + final Intent intent = new Intent(Intent.ACTION_CHOOSER); + intent.putExtra(Intent.EXTRA_INTENT, viewIntent); + intent.putExtra(Intent.EXTRA_TITLE, context.getString(R.string.open_with)); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + try { + intent.setPackage("android"); + context.startActivity(intent); + } catch (final ActivityNotFoundException e) { + // falling back to OEM chooser if Android's system chooser was removed by the OEM + intent.setPackage(null); + context.startActivity(intent); + } + } + + /** + * Get the default app package name. + *

+ * If no app is set as default, it will return "android". + *

+ * Note: it doesn't return "android" on some devices because some OEMs changed the app chooser. + * + * @param context the context to use + * @param intent the intent to get default app + * @return the package name of the default app, or the app chooser if there's no default */ - private static void openInDefaultApp(final Context context, final String url) { - final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - context.startActivity(Intent.createChooser( - intent, context.getString(R.string.share_dialog_title)) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + private static String getDefaultAppPackageName(final Context context, final Intent intent) { + return context.getPackageManager() + .resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) + .activityInfo.packageName; } /** * Get the default browser package name. *

* If no browser is set as default, it will return "android" + * Note: it doesn't return "android" on some devices because some OEMs changed the app chooser. * * @param context the context to use * @return the package name of the default browser, or "android" if there's no default @@ -79,13 +165,23 @@ private static String getDefaultBrowserPackageName(final Context context) { * @param url the url to share */ public static void shareUrl(final Context context, final String subject, final String url) { - final Intent intent = new Intent(Intent.ACTION_SEND); - intent.setType("text/plain"); - intent.putExtra(Intent.EXTRA_SUBJECT, subject); - intent.putExtra(Intent.EXTRA_TEXT, url); - context.startActivity(Intent.createChooser( - intent, context.getString(R.string.share_dialog_title)) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + final Intent shareIntent = new Intent(Intent.ACTION_SEND); + shareIntent.setType("text/plain"); + shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject); + shareIntent.putExtra(Intent.EXTRA_TEXT, url); + final Intent intent = new Intent(Intent.ACTION_CHOOSER); + intent.putExtra(Intent.EXTRA_INTENT, shareIntent); + intent.putExtra(Intent.EXTRA_TITLE, context.getString(R.string.share_dialog_title)); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + try { + intent.setPackage("android"); + context.startActivity(intent); + } catch (final ActivityNotFoundException e) { + // falling back to OEM chooser if Android's system chooser was removed by the OEM + intent.setPackage(null); + context.startActivity(intent); + } } /** 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 f102206c132..79b91cb5782 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 @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.app.NotificationManager; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.graphics.Color; @@ -44,6 +45,7 @@ import org.schabi.newpipe.report.ErrorInfo; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.ShareUtils; import java.io.File; import java.net.URI; @@ -346,10 +348,9 @@ private void viewWithFileProvider(Mission mission) { if (BuildConfig.DEBUG) Log.v(TAG, "Mime: " + mimeType + " package: " + BuildConfig.APPLICATION_ID + ".provider"); - Uri uri = resolveShareableUri(mission); + final Uri uri = resolveShareableUri(mission); - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_VIEW); + Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, mimeType); intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); @@ -363,7 +364,7 @@ private void viewWithFileProvider(Mission mission) { //mContext.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); if (intent.resolveActivity(mContext.getPackageManager()) != null) { - mContext.startActivity(intent); + ShareUtils.openContentInApp(mContext, intent); } else { Toast.makeText(mContext, R.string.toast_no_player, Toast.LENGTH_LONG).show(); } @@ -372,12 +373,23 @@ private void viewWithFileProvider(Mission mission) { private void shareFile(Mission mission) { if (checkInvalidFile(mission)) return; - Intent intent = new Intent(Intent.ACTION_SEND); - intent.setType(resolveMimeType(mission)); - intent.putExtra(Intent.EXTRA_STREAM, resolveShareableUri(mission)); - intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); + final Intent shareIntent = new Intent(Intent.ACTION_SEND); + shareIntent.setType(resolveMimeType(mission)); + shareIntent.putExtra(Intent.EXTRA_STREAM, resolveShareableUri(mission)); + shareIntent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); + final Intent intent = new Intent(Intent.ACTION_CHOOSER); + intent.putExtra(Intent.EXTRA_INTENT, shareIntent); + intent.putExtra(Intent.EXTRA_TITLE, mContext.getString(R.string.share_dialog_title)); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(Intent.createChooser(intent, null)); + try { + intent.setPackage("android"); + mContext.startActivity(intent); + } catch (final ActivityNotFoundException e) { + // falling back to OEM chooser if Android's system chooser was removed by the OEM + intent.setPackage(null); + mContext.startActivity(intent); + } } /** diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c128c42149e..a6b64da7120 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -651,4 +651,5 @@ Demander à Android de personnaliser la couleur de la notification en fonction de la couleur principale de la miniature (noter que cela n’est pas disponible sur tous les appareils) Afficher la miniature Utiliser la miniature pour l\'arrière-plan de l’écran de verrouillage et les notifications + Ouvrir avec \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c70b56e9762..bc78b004c4b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,6 +11,7 @@ https://f-droid.org/repository/browse/?fdfilter=vlc&fdid=org.videolan.vlc Open in browser Open in popup mode + Open with Share Download Download stream file diff --git a/checkstyle-suppressions.xml b/checkstyle-suppressions.xml index 0a5190b295d..8314f86dbd7 100644 --- a/checkstyle-suppressions.xml +++ b/checkstyle-suppressions.xml @@ -12,21 +12,20 @@ lines="253,325"/> + files="ListHelper.java" + lines="281,313"/> + files="ContentSettingsFragment.java" + lines="227,245"/> - + files="WebMWriter.java" + lines="156,158"/> + files="VideoPlayerImpl.java"/> + files="VideoDetailFragment.java"/>