diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java index 0bda79fee..bc6310601 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java @@ -2,8 +2,6 @@ package org.schabi.newpipe.about; import android.app.Activity; import android.content.Context; -import android.content.Intent; -import android.net.Uri; import android.os.Bundle; import android.view.ContextMenu; import android.view.LayoutInflater; @@ -17,9 +15,9 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import org.schabi.newpipe.R; +import org.schabi.newpipe.util.ShareUtils; import java.util.Arrays; -import java.util.Comparator; /** * Fragment containing the software licenses. @@ -27,7 +25,7 @@ import java.util.Comparator; public class LicenseFragment extends Fragment { private static final String ARG_COMPONENTS = "components"; private SoftwareComponent[] softwareComponents; - private SoftwareComponent mComponentForContextMenu; + private SoftwareComponent componentForContextMenu; public static LicenseFragment newInstance(final SoftwareComponent[] softwareComponents) { if (softwareComponents == null) { @@ -46,7 +44,7 @@ public class LicenseFragment extends Fragment { * @param context the context to use * @param license the license to show */ - public static void showLicense(final Context context, final License license) { + private static void showLicense(final Context context, final License license) { new LicenseFragmentHelper((Activity) context).execute(license); } @@ -57,45 +55,34 @@ public class LicenseFragment extends Fragment { .getParcelableArray(ARG_COMPONENTS); // Sort components by name - Arrays.sort(softwareComponents, new Comparator() { - @Override - public int compare(final SoftwareComponent o1, final SoftwareComponent o2) { - return o1.getName().compareTo(o2.getName()); - } - }); + Arrays.sort(softwareComponents, (o1, o2) -> o1.getName().compareTo(o2.getName())); } @Nullable @Override public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_licenses, container, false); - ViewGroup softwareComponentsView = rootView.findViewById(R.id.software_components); + final View rootView = inflater.inflate(R.layout.fragment_licenses, container, false); + final ViewGroup softwareComponentsView = rootView.findViewById(R.id.software_components); - View licenseLink = rootView.findViewById(R.id.app_read_license); - licenseLink.setOnClickListener(new OnReadFullLicenseClickListener()); + final View licenseLink = rootView.findViewById(R.id.app_read_license); + licenseLink.setOnClickListener(v -> + showLicense(getActivity(), StandardLicenses.GPL3)); for (final SoftwareComponent component : softwareComponents) { - View componentView = inflater + final View componentView = inflater .inflate(R.layout.item_software_component, container, false); - TextView softwareName = componentView.findViewById(R.id.name); - TextView copyright = componentView.findViewById(R.id.copyright); + final TextView softwareName = componentView.findViewById(R.id.name); + final TextView copyright = componentView.findViewById(R.id.copyright); softwareName.setText(component.getName()); - copyright.setText(getContext().getString(R.string.copyright, + copyright.setText(getString(R.string.copyright, component.getYears(), component.getCopyrightOwner(), component.getLicense().getAbbreviation())); componentView.setTag(component); - componentView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(final View v) { - Context context = v.getContext(); - if (context != null) { - showLicense(context, component.getLicense()); - } - } - }); + componentView.setOnClickListener(v -> + showLicense(getActivity(), component.getLicense())); softwareComponentsView.addView(componentView); registerForContextMenu(componentView); } @@ -105,40 +92,28 @@ public class LicenseFragment extends Fragment { @Override public void onCreateContextMenu(final ContextMenu menu, final View v, final ContextMenu.ContextMenuInfo menuInfo) { - MenuInflater inflater = getActivity().getMenuInflater(); - SoftwareComponent component = (SoftwareComponent) v.getTag(); + final MenuInflater inflater = getActivity().getMenuInflater(); + final SoftwareComponent component = (SoftwareComponent) v.getTag(); menu.setHeaderTitle(component.getName()); inflater.inflate(R.menu.software_component, menu); super.onCreateContextMenu(menu, v, menuInfo); - mComponentForContextMenu = (SoftwareComponent) v.getTag(); + componentForContextMenu = (SoftwareComponent) v.getTag(); } @Override public boolean onContextItemSelected(final MenuItem item) { // item.getMenuInfo() is null so we use the tag of the view - final SoftwareComponent component = mComponentForContextMenu; + final SoftwareComponent component = componentForContextMenu; if (component == null) { return false; } switch (item.getItemId()) { case R.id.action_website: - openWebsite(component.getLink()); + ShareUtils.openUrlInBrowser(getActivity(), component.getLink()); return true; case R.id.action_show_license: - showLicense(getContext(), component.getLicense()); + showLicense(getActivity(), component.getLicense()); } return false; } - - private void openWebsite(final String componentLink) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(componentLink)); - startActivity(browserIntent); - } - - private static class OnReadFullLicenseClickListener implements View.OnClickListener { - @Override - public void onClick(final View v) { - LicenseFragment.showLicense(v.getContext(), StandardLicenses.GPL3); - } - } } diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java index 94a1532f5..1c425567f 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java @@ -3,8 +3,10 @@ package org.schabi.newpipe.about; import android.app.Activity; import android.content.Context; import android.os.AsyncTask; +import android.util.Base64; import android.webkit.WebView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; @@ -12,6 +14,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.util.ThemeHelper; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; import java.lang.ref.WeakReference; import java.nio.charset.StandardCharsets; @@ -26,28 +29,18 @@ public class LicenseFragmentHelper extends AsyncTask { weakReference = new WeakReference<>(activity); } - private static String getFinishString(final Activity activity) { - return activity.getApplicationContext().getResources().getString(R.string.finish); - } - /** * @param context the context to use * @param license the license * @return String which contains a HTML formatted license page * styled according to the context's theme */ - public static String getFormattedLicense(final Context context, final License license) { - if (context == null) { - throw new NullPointerException("context is null"); - } - if (license == null) { - throw new NullPointerException("license is null"); - } - - StringBuilder licenseContent = new StringBuilder(); - String webViewData; + private static String getFormattedLicense(@NonNull final Context context, + @NonNull final License license) { + final StringBuilder licenseContent = new StringBuilder(); + final String webViewData; try { - BufferedReader in = new BufferedReader(new InputStreamReader( + final BufferedReader in = new BufferedReader(new InputStreamReader( context.getAssets().open(license.getFilename()), StandardCharsets.UTF_8)); String str; while ((str = in.readLine()) != null) { @@ -56,13 +49,11 @@ public class LicenseFragmentHelper extends AsyncTask { in.close(); // split the HTML file and insert the stylesheet into the HEAD of the file - String[] insert = licenseContent.toString().split(""); - webViewData = insert[0] + "" - + insert[1]; - } catch (Exception e) { - throw new NullPointerException("could not get license file:" - + getLicenseStylesheet(context)); + webViewData = licenseContent.toString().replace("", + ""); + } catch (IOException e) { + throw new IllegalArgumentException( + "Could not get license file: " + license.getFilename(), e); } return webViewData; } @@ -71,21 +62,19 @@ public class LicenseFragmentHelper extends AsyncTask { * @param context * @return String which is a CSS stylesheet according to the context's theme */ - public static String getLicenseStylesheet(final Context context) { - boolean isLightTheme = ThemeHelper.isLightThemeSelected(context); - return "body{padding:12px 15px;margin:0;background:#" - + getHexRGBColor(context, isLightTheme + private static String getLicenseStylesheet(final Context context) { + final boolean isLightTheme = ThemeHelper.isLightThemeSelected(context); + return "body{padding:12px 15px;margin:0;" + + "background:#" + getHexRGBColor(context, isLightTheme ? R.color.light_license_background_color - : R.color.dark_license_background_color) - + ";color:#" - + getHexRGBColor(context, isLightTheme + : R.color.dark_license_background_color) + ";" + + "color:#" + getHexRGBColor(context, isLightTheme ? R.color.light_license_text_color - : R.color.dark_license_text_color) + ";}" - + "a[href]{color:#" - + getHexRGBColor(context, isLightTheme + : R.color.dark_license_text_color) + "}" + + "a[href]{color:#" + getHexRGBColor(context, isLightTheme ? R.color.light_youtube_primary_color - : R.color.dark_youtube_primary_color) + ";}" - + "pre{white-space: pre-wrap;}"; + : R.color.dark_youtube_primary_color) + "}" + + "pre{white-space:pre-wrap}"; } /** @@ -95,13 +84,13 @@ public class LicenseFragmentHelper extends AsyncTask { * @param color the color number from R.color * @return a six characters long String with hexadecimal RGB values */ - public static String getHexRGBColor(final Context context, final int color) { + private static String getHexRGBColor(final Context context, final int color) { return context.getResources().getString(color).substring(3); } @Nullable private Activity getActivity() { - Activity activity = weakReference.get(); + final Activity activity = weakReference.get(); if (activity != null && activity.isFinishing()) { return null; @@ -118,22 +107,22 @@ public class LicenseFragmentHelper extends AsyncTask { @Override protected void onPostExecute(final Integer result) { - Activity activity = getActivity(); + final Activity activity = getActivity(); if (activity == null) { return; } - String webViewData = getFormattedLicense(activity, license); - AlertDialog.Builder alert = new AlertDialog.Builder(activity); + final String webViewData = Base64.encodeToString(getFormattedLicense(activity, license) + .getBytes(StandardCharsets.UTF_8), Base64.NO_PADDING); + final WebView webView = new WebView(activity); + webView.loadData(webViewData, "text/html; charset=UTF-8", "base64"); + + final AlertDialog.Builder alert = new AlertDialog.Builder(activity); alert.setTitle(license.getName()); - - WebView wv = new WebView(activity); - wv.loadData(webViewData, "text/html; charset=UTF-8", null); - - alert.setView(wv); - assureCorrectAppLanguage(activity.getApplicationContext()); - alert.setNegativeButton(getFinishString(activity), (dialog, which) -> dialog.dismiss()); + alert.setView(webView); + assureCorrectAppLanguage(activity); + alert.setNegativeButton(activity.getString(R.string.finish), + (dialog, which) -> dialog.dismiss()); alert.show(); } - }