From 0040ee5cb674da9832ea1b85fdee6742d7a82a99 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 20 Oct 2017 23:41:30 +0200 Subject: [PATCH] Fix charset issue. Move Java I/O related methods to separate thread. --- .../schabi/newpipe/about/LicenseFragment.java | 73 +----------- .../newpipe/about/LicenseFragmentHelper.java | 111 ++++++++++++++++++ 2 files changed, 112 insertions(+), 72 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java 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 42e886d30..4400cac53 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java @@ -1,22 +1,15 @@ package org.schabi.newpipe.about; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; -import android.support.v7.app.AlertDialog; import android.view.*; -import android.webkit.WebView; import android.widget.TextView; - import org.schabi.newpipe.R; -import org.schabi.newpipe.util.ThemeHelper; -import java.io.BufferedReader; -import java.io.InputStreamReader; import java.util.Arrays; import java.util.Comparator; @@ -46,70 +39,7 @@ public class LicenseFragment extends Fragment { * @param license the license to show */ public static void showLicense(Context context, License license) { - if(context == null) { - throw new NullPointerException("context is null"); - } - if(license == null) { - throw new NullPointerException("license is null"); - } - AlertDialog.Builder alert = new AlertDialog.Builder(context); - alert.setTitle(license.getName()); - - WebView wv = new WebView(context); - String licenseContent = ""; - String webViewData; - try { - BufferedReader in = new BufferedReader(new InputStreamReader(context.getAssets().open(license.getFilename()), "UTF-8")); - String str; - while ((str = in.readLine()) != null) { - licenseContent += str; - } - in.close(); - - // split the HTML file and insert the stylesheet into the HEAD of the file - String[] insert = licenseContent.split(""); - webViewData = insert[0] + "" - + insert[1]; - } catch (Exception e) { - throw new NullPointerException("could not get license file:" + getLicenseStylesheet(context)); - } - wv.loadData(webViewData, "text/html", "utf-8"); - - alert.setView(wv); - alert.setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - alert.show(); - } - - public static String getLicenseStylesheet(Context context) { - return "body{padding:12px 15px;margin:0;background:#" - + getHexRGBColor(context,(ThemeHelper.isLightThemeSelected(context)) - ? R.color.light_license_background_color - : R.color.dark_license_background_color) - + ";color:#" - + getHexRGBColor(context,(ThemeHelper.isLightThemeSelected(context)) - ? R.color.light_license_text_color - : R.color.dark_license_text_color) + ";}" - + "a[href]{color:#" - + getHexRGBColor(context,(ThemeHelper.isLightThemeSelected(context)) - ? R.color.light_youtube_primary_color - : R.color.dark_youtube_primary_color) + ";}" - + "pre{white-space: pre-wrap;}"; - } - - /** - * Cast R.color to a hexadecimal color value - * @param context the context to use - * @param color the color number from R.color - * @return a six characters long String with hexadecimal RGB values - */ - public static String getHexRGBColor(Context context, int color) { - return context.getResources().getString(color).substring(3); + new LicenseFragmentHelper().execute(context, license); } @Override @@ -154,7 +84,6 @@ public class LicenseFragment extends Fragment { }); softwareComponentsView.addView(componentView); registerForContextMenu(componentView); - } return rootView; } diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java new file mode 100644 index 000000000..726e97ec2 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java @@ -0,0 +1,111 @@ +package org.schabi.newpipe.about; + +import android.content.Context; +import android.content.DialogInterface; +import android.os.AsyncTask; +import android.support.v7.app.AlertDialog; +import android.webkit.WebView; +import org.schabi.newpipe.R; +import org.schabi.newpipe.util.ThemeHelper; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class LicenseFragmentHelper extends AsyncTask { + + private Context context; + private License license; + + @Override + protected Integer doInBackground(Object... objects) { + context = (Context) objects[0]; + license = (License) objects[1]; + return 1; + } + + @Override + protected void onPostExecute(Integer result){ + String webViewData = getFormattedLicense(context, license); + AlertDialog.Builder alert = new AlertDialog.Builder(context); + alert.setTitle(license.getName()); + + WebView wv = new WebView(context); + wv.loadData(webViewData, "text/html; charset=UTF-8", null); + + alert.setView(wv); + alert.setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + alert.show(); + } + + /** + * @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(Context context, License license) { + if(context == null) { + throw new NullPointerException("context is null"); + } + if(license == null) { + throw new NullPointerException("license is null"); + } + + String licenseContent = ""; + String webViewData; + try { + BufferedReader in = new BufferedReader(new InputStreamReader(context.getAssets().open(license.getFilename()), "UTF-8")); + String str; + while ((str = in.readLine()) != null) { + licenseContent += str; + } + in.close(); + + // split the HTML file and insert the stylesheet into the HEAD of the file + String[] insert = licenseContent.split(""); + webViewData = insert[0] + "" + + insert[1]; + } catch (Exception e) { + throw new NullPointerException("could not get license file:" + getLicenseStylesheet(context)); + } + return webViewData; + } + + /** + * + * @param context + * @return String which is a CSS stylesheet according to the context's theme + */ + public static String getLicenseStylesheet(Context context) { + 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.light_license_text_color + : 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;}"; + } + + /** + * Cast R.color to a hexadecimal color value + * @param context the context to use + * @param color the color number from R.color + * @return a six characters long String with hexadecimal RGB values + */ + public static String getHexRGBColor(Context context, int color) { + return context.getResources().getString(color).substring(3); + } + +}