From cb438852a793e5a21def28b9a2876f8f08a484e1 Mon Sep 17 00:00:00 2001 From: Thomas <tschneider.ac@gmail.com> Date: Thu, 16 Apr 2020 17:56:32 +0200 Subject: [PATCH] Fix issue #11 --- .../activities/TransformActivity.java | 238 ++---------------- .../fedilab/nitterizeme/helpers/Utils.java | 150 ++++++++++- app/src/main/res/values/styles.xml | 1 + 3 files changed, 169 insertions(+), 220 deletions(-) diff --git a/app/src/main/java/app/fedilab/nitterizeme/activities/TransformActivity.java b/app/src/main/java/app/fedilab/nitterizeme/activities/TransformActivity.java index 3f9b45c..128d298 100644 --- a/app/src/main/java/app/fedilab/nitterizeme/activities/TransformActivity.java +++ b/app/src/main/java/app/fedilab/nitterizeme/activities/TransformActivity.java @@ -62,19 +62,18 @@ import static app.fedilab.nitterizeme.activities.MainActivity.SET_BIBLIOGRAM_ENA import static app.fedilab.nitterizeme.activities.MainActivity.SET_EMBEDDED_PLAYER; import static app.fedilab.nitterizeme.activities.MainActivity.SET_INVIDIOUS_ENABLED; import static app.fedilab.nitterizeme.activities.MainActivity.SET_NITTER_ENABLED; +import static app.fedilab.nitterizeme.helpers.Utils.ampExtract; +import static app.fedilab.nitterizeme.helpers.Utils.bibliogramAccountPattern; +import static app.fedilab.nitterizeme.helpers.Utils.bibliogramPostPattern; +import static app.fedilab.nitterizeme.helpers.Utils.maps; +import static app.fedilab.nitterizeme.helpers.Utils.nitterPattern; +import static app.fedilab.nitterizeme.helpers.Utils.transformUrl; +import static app.fedilab.nitterizeme.helpers.Utils.youtubePattern; public class TransformActivity extends Activity { - final Pattern youtubePattern = Pattern.compile("(www\\.|m\\.)?(youtube\\.com|youtu\\.be|youtube-nocookie\\.com)/(((?!([\"'<])).)*)"); - final Pattern nitterPattern = Pattern.compile("(mobile\\.|www\\.)?twitter.com([\\w-/]+)"); - final Pattern bibliogramPostPattern = Pattern.compile("(m\\.|www\\.)?instagram.com(/p/[\\w-/]+)"); - final Pattern bibliogramAccountPattern = Pattern.compile("(m\\.|www\\.)?instagram.com(((?!/p/).)+)"); - final Pattern maps = Pattern.compile("/maps/place/[^@]+@([\\d.,z]{3,}).*"); - final Pattern extractPlace = Pattern.compile("/maps/place/(((?!/data).)*)"); - final Pattern ampExtract = Pattern.compile("amp/s/(.*)"); - private Thread thread; private ArrayList<String> notShortnedURLDialog; @@ -112,80 +111,11 @@ public class TransformActivity extends Activity { unshortenAlertBuilder.setIcon(R.mipmap.ic_launcher); unshortenAlertBuilder.setPositiveButton(R.string.open, (dialog, id) -> { if (notShortnedURLDialog.size() > 0) { - URL url_1; - String realHost = null; - try { - url_1 = new URL(notShortnedURLDialog.get(notShortnedURLDialog.size() - 1)); - realHost = url_1.getHost(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - if (Arrays.asList(twitter_domains).contains(realHost)) { - boolean nitter_enabled = sharedpreferences.getBoolean(SET_NITTER_ENABLED, true); - if (nitter_enabled) { - Intent delegate = new Intent(Intent.ACTION_VIEW); - String transformedURL = transformUrl(url); - if (transformedURL != null) { - delegate.setData(Uri.parse(transformUrl(url))); - delegate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - if (delegate.resolveActivity(getPackageManager()) != null) { - startActivity(delegate); - finish(); - } - } else { - forwardToBrowser(intent); - } - } else { - forwardToBrowser(intent); - } - } - //Maps URLs (containing /maps/place like Google Maps links) - else if (url.contains("/maps/place")) { - boolean osm_enabled = sharedpreferences.getBoolean(MainActivity.SET_OSM_ENABLED, true); - if (osm_enabled) { - Intent delegate = new Intent(Intent.ACTION_VIEW); - String transformedURL = transformUrl(url); - if (transformedURL != null) { - delegate.setData(Uri.parse(transformUrl(url))); - delegate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - if (delegate.resolveActivity(getPackageManager()) != null) { - startActivity(delegate); - finish(); - } - } else { - forwardToBrowser(intent); - } - } else { - forwardToBrowser(intent); - } - } - //YouTube URLs - else if (Arrays.asList(youtube_domains).contains(realHost)) { //Youtube URL - boolean invidious_enabled = sharedpreferences.getBoolean(SET_INVIDIOUS_ENABLED, true); - if (invidious_enabled) { - Intent delegate = new Intent(Intent.ACTION_VIEW); - String transformedURL = transformUrl(url); - if (transformedURL != null) { - delegate.setData(Uri.parse(transformUrl(url))); - delegate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - if (delegate.resolveActivity(getPackageManager()) != null) { - startActivity(delegate); - finish(); - } - } else { - forwardToBrowser(intent); - } - } else { - forwardToBrowser(intent); - } - } else { - Intent delegate = new Intent(Intent.ACTION_VIEW); - delegate.setData(Uri.parse(notShortnedURLDialog.get(notShortnedURLDialog.size() - 1))); - delegate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - if (delegate.resolveActivity(getPackageManager()) != null) { - startActivity(delegate); - finish(); - } + Intent delegate = new Intent(Intent.ACTION_VIEW); + delegate.setData(Uri.parse(notShortnedURLDialog.get(notShortnedURLDialog.size() - 1))); + delegate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (delegate.resolveActivity(getPackageManager()) != null) { + startActivity(delegate); } } dialog.dismiss(); @@ -204,7 +134,7 @@ public class TransformActivity extends Activity { public void run() { notShortnedURLDialog = new ArrayList<>(); notShortnedURLDialog.add(url); - Utils.checkUrl(notShortnedURLDialog); + Utils.checkUrl(TransformActivity.this, notShortnedURLDialog); Handler mainHandler = new Handler(Looper.getMainLooper()); Runnable myRunnable = () -> { positiveButton.setEnabled(true); @@ -235,9 +165,9 @@ public class TransformActivity extends Activity { boolean nitter_enabled = sharedpreferences.getBoolean(SET_NITTER_ENABLED, true); if (nitter_enabled) { Intent delegate = new Intent(Intent.ACTION_VIEW); - String transformedURL = transformUrl(url); + String transformedURL = transformUrl(TransformActivity.this, url); if (transformedURL != null) { - delegate.setData(Uri.parse(transformUrl(url))); + delegate.setData(Uri.parse(transformUrl(TransformActivity.this, url))); delegate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (delegate.resolveActivity(getPackageManager()) != null) { startActivity(delegate); @@ -254,9 +184,9 @@ public class TransformActivity extends Activity { boolean bibliogram_enabled = sharedpreferences.getBoolean(SET_BIBLIOGRAM_ENABLED, true); if (bibliogram_enabled) { Intent delegate = new Intent(Intent.ACTION_VIEW); - String transformedURL = transformUrl(url); + String transformedURL = transformUrl(TransformActivity.this, url); if (transformedURL != null) { - delegate.setData(Uri.parse(transformUrl(url))); + delegate.setData(Uri.parse(transformUrl(TransformActivity.this, url))); delegate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (delegate.resolveActivity(getPackageManager()) != null) { startActivity(delegate); @@ -274,9 +204,9 @@ public class TransformActivity extends Activity { boolean osm_enabled = sharedpreferences.getBoolean(MainActivity.SET_OSM_ENABLED, true); if (osm_enabled) { Intent delegate = new Intent(Intent.ACTION_VIEW); - String transformedURL = transformUrl(url); + String transformedURL = transformUrl(TransformActivity.this, url); if (transformedURL != null) { - delegate.setData(Uri.parse(transformUrl(url))); + delegate.setData(Uri.parse(transformUrl(TransformActivity.this, url))); delegate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (delegate.resolveActivity(getPackageManager()) != null) { startActivity(delegate); @@ -313,9 +243,9 @@ public class TransformActivity extends Activity { boolean invidious_enabled = sharedpreferences.getBoolean(SET_INVIDIOUS_ENABLED, true); if (invidious_enabled) { Intent delegate = new Intent(Intent.ACTION_VIEW); - String transformedURL = transformUrl(url); + String transformedURL = transformUrl(TransformActivity.this, url); if (transformedURL != null) { - delegate.setData(Uri.parse(transformUrl(url))); + delegate.setData(Uri.parse(transformUrl(TransformActivity.this, url))); delegate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (delegate.resolveActivity(getPackageManager()) != null) { startActivity(delegate); @@ -455,130 +385,6 @@ public class TransformActivity extends Activity { } - /** - * Transform the URL to a Nitter, Invidious or OSM ones - * - * @param url String original URL - * @return String transformed URL - */ - private String transformUrl(String url) { - SharedPreferences sharedpreferences = getSharedPreferences(MainActivity.APP_PREFS, Context.MODE_PRIVATE); - String newUrl = null; - - URL url_; - String host = null; - try { - url_ = new URL(url); - host = url_.getHost(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - if (Arrays.asList(twitter_domains).contains(host)) { - boolean nitter_enabled = sharedpreferences.getBoolean(SET_NITTER_ENABLED, true); - if (nitter_enabled) { - String nitterHost = sharedpreferences.getString(MainActivity.SET_NITTER_HOST, MainActivity.DEFAULT_NITTER_HOST).toLowerCase(); - assert host != null; - if (host.compareTo("pbs.twimg.com") == 0 || host.compareTo("pic.twitter.com") == 0) { - try { - newUrl = "https://" + nitterHost + "/pic/" + URLEncoder.encode(url, "utf-8"); - } catch (UnsupportedEncodingException e) { - newUrl = "https://" + nitterHost + "/pic/" + url; - } - } else if (url.contains("/search?")) { - newUrl = url.replace(host, nitterHost); - } else { - Matcher matcher = nitterPattern.matcher(url); - while (matcher.find()) { - final String nitter_directory = matcher.group(2); - newUrl = "https://" + nitterHost + nitter_directory; - } - } - return newUrl; - } else { - return url; - } - } else if (Arrays.asList(instagram_domains).contains(host)) { - boolean bibliogram_enabled = sharedpreferences.getBoolean(SET_BIBLIOGRAM_ENABLED, true); - if (bibliogram_enabled) { - Matcher matcher = bibliogramPostPattern.matcher(url); - while (matcher.find()) { - final String bibliogram_directory = matcher.group(2); - String bibliogramHost = sharedpreferences.getString(MainActivity.SET_BIBLIOGRAM_HOST, MainActivity.DEFAULT_BIBLIOGRAM_HOST).toLowerCase(); - newUrl = "https://" + bibliogramHost + bibliogram_directory; - } - matcher = bibliogramAccountPattern.matcher(url); - while (matcher.find()) { - final String bibliogram_directory = matcher.group(2); - String bibliogramHost = sharedpreferences.getString(MainActivity.SET_BIBLIOGRAM_HOST, MainActivity.DEFAULT_BIBLIOGRAM_HOST).toLowerCase(); - if (bibliogram_directory != null && bibliogram_directory.compareTo("privacy") != 0) { - newUrl = "https://" + bibliogramHost + "/u" + bibliogram_directory; - } else { - newUrl = "https://" + bibliogramHost + bibliogram_directory; - } - } - return newUrl; - } else { - return url; - } - } else if (url.contains("/maps/place")) { - boolean osm_enabled = sharedpreferences.getBoolean(MainActivity.SET_OSM_ENABLED, true); - if (osm_enabled) { - Matcher matcher = maps.matcher(url); - while (matcher.find()) { - final String localization = matcher.group(1); - assert localization != null; - String[] data = localization.split(","); - if (data.length > 2) { - String zoom; - String[] details = data[2].split("\\."); - if (details.length > 0) { - zoom = details[0]; - } else { - zoom = data[2]; - } - - String osmHost = sharedpreferences.getString(MainActivity.SET_OSM_HOST, MainActivity.DEFAULT_OSM_HOST).toLowerCase(); - boolean geo_uri_enabled = sharedpreferences.getBoolean(MainActivity.SET_GEO_URIS, false); - if (!geo_uri_enabled) { - newUrl = "https://" + osmHost + "/#map=" + zoom + "/" + data[0] + "/" + data[1]; - } else { - newUrl = "geo:0,0?q=" + data[0] + "," + data[1] + ",z=" + zoom; - } - } - } - if (newUrl == null && url.contains("/data=")) { - matcher = extractPlace.matcher(url); - while (matcher.find()) { - final String search = matcher.group(1); - newUrl = "geo:0,0?q=" + search; - } - } - return newUrl; - } else { - return url; - } - } else if (Arrays.asList(youtube_domains).contains(host)) { //Youtube URL - boolean invidious_enabled = sharedpreferences.getBoolean(SET_INVIDIOUS_ENABLED, true); - if (invidious_enabled) { - Matcher matcher = youtubePattern.matcher(url); - while (matcher.find()) { - final String youtubeId = matcher.group(3); - String invidiousHost = sharedpreferences.getString(MainActivity.SET_INVIDIOUS_HOST, MainActivity.DEFAULT_INVIDIOUS_HOST).toLowerCase(); - if (Objects.requireNonNull(matcher.group(2)).compareTo("youtu.be") == 0) { - newUrl = "https://" + invidiousHost + "/watch?v=" + youtubeId + "&local=true"; - } else { - newUrl = "https://" + invidiousHost + "/" + youtubeId + "&local=true"; - } - } - return newUrl; - } else { - return url; - } - } - return null; - } - - /** * Transform URL inside the shared content without modifying the whole content * @@ -709,7 +515,7 @@ public class TransformActivity extends Activity { @Override public void run() { notShortnedURLDialog.add(finalUrl); - Utils.checkUrl(notShortnedURLDialog); + Utils.checkUrl(TransformActivity.this, notShortnedURLDialog); URL url_; String host = null; diff --git a/app/src/main/java/app/fedilab/nitterizeme/helpers/Utils.java b/app/src/main/java/app/fedilab/nitterizeme/helpers/Utils.java index 78f7ca3..d3cdcdd 100644 --- a/app/src/main/java/app/fedilab/nitterizeme/helpers/Utils.java +++ b/app/src/main/java/app/fedilab/nitterizeme/helpers/Utils.java @@ -17,12 +17,16 @@ package app.fedilab.nitterizeme.helpers; import android.app.DownloadManager; import android.content.Context; +import android.content.SharedPreferences; import android.net.Uri; import android.os.Environment; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.InetAddress; +import java.net.MalformedURLException; import java.net.URL; +import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -30,18 +34,33 @@ import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.net.ssl.HttpsURLConnection; +import app.fedilab.nitterizeme.activities.MainActivity; + import static android.content.Context.DOWNLOAD_SERVICE; +import static app.fedilab.nitterizeme.activities.CheckAppActivity.instagram_domains; import static app.fedilab.nitterizeme.activities.CheckAppActivity.shortener_domains; +import static app.fedilab.nitterizeme.activities.CheckAppActivity.twitter_domains; +import static app.fedilab.nitterizeme.activities.CheckAppActivity.youtube_domains; +import static app.fedilab.nitterizeme.activities.MainActivity.SET_BIBLIOGRAM_ENABLED; +import static app.fedilab.nitterizeme.activities.MainActivity.SET_INVIDIOUS_ENABLED; +import static app.fedilab.nitterizeme.activities.MainActivity.SET_NITTER_ENABLED; public class Utils { + public static final Pattern youtubePattern = Pattern.compile("(www\\.|m\\.)?(youtube\\.com|youtu\\.be|youtube-nocookie\\.com)/(((?!([\"'<])).)*)"); + public static final Pattern nitterPattern = Pattern.compile("(mobile\\.|www\\.)?twitter.com([\\w-/]+)"); + public static final Pattern bibliogramPostPattern = Pattern.compile("(m\\.|www\\.)?instagram.com(/p/[\\w-/]+)"); + public static final Pattern bibliogramAccountPattern = Pattern.compile("(m\\.|www\\.)?instagram.com(((?!/p/).)+)"); + public static final Pattern maps = Pattern.compile("/maps/place/[^@]+@([\\d.,z]{3,}).*"); + public static final Pattern ampExtract = Pattern.compile("amp/s/(.*)"); public static final String RECEIVE_STREAMING_URL = "receive_streaming_url"; - + private static final Pattern extractPlace = Pattern.compile("/maps/place/(((?!/data).)*)"); private static final String[] UTM_PARAMS = { "utm_\\w+", "ga_source", @@ -80,7 +99,7 @@ public class Utils { * * @param urls ArrayList<String> URL to check */ - public static void checkUrl(ArrayList<String> urls) { + public static void checkUrl(Context context, ArrayList<String> urls) { URL url; String newURL = null; String comingURl; @@ -102,7 +121,7 @@ public class Utils { Matcher matcher = urlPattern.matcher(entry.toString()); if (matcher.find()) { newURL = remove_tracking_param(matcher.group(1)); - urls.add(newURL); + urls.add(transformUrl(context, newURL)); } } } @@ -114,7 +133,7 @@ public class Utils { String protocol = redirectURL.getProtocol(); if (protocol != null && host != null) { if (Arrays.asList(shortener_domains).contains(host)) { - checkUrl(urls); + checkUrl(context, urls); } } } @@ -123,6 +142,129 @@ public class Utils { } } + + /** + * Transform the URL to a Nitter, Invidious or OSM ones + * + * @param url String original URL + * @return String transformed URL + */ + public static String transformUrl(Context context, String url) { + SharedPreferences sharedpreferences = context.getSharedPreferences(MainActivity.APP_PREFS, Context.MODE_PRIVATE); + String newUrl = null; + URL url_; + String host = null; + try { + url_ = new URL(url); + host = url_.getHost(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + if (Arrays.asList(twitter_domains).contains(host)) { + boolean nitter_enabled = sharedpreferences.getBoolean(SET_NITTER_ENABLED, true); + if (nitter_enabled) { + String nitterHost = sharedpreferences.getString(MainActivity.SET_NITTER_HOST, MainActivity.DEFAULT_NITTER_HOST).toLowerCase(); + assert host != null; + if (host.compareTo("pbs.twimg.com") == 0 || host.compareTo("pic.twitter.com") == 0) { + try { + newUrl = "https://" + nitterHost + "/pic/" + URLEncoder.encode(url, "utf-8"); + } catch (UnsupportedEncodingException e) { + newUrl = "https://" + nitterHost + "/pic/" + url; + } + } else if (url.contains("/search?")) { + newUrl = url.replace(host, nitterHost); + } else { + Matcher matcher = nitterPattern.matcher(url); + while (matcher.find()) { + final String nitter_directory = matcher.group(2); + newUrl = "https://" + nitterHost + nitter_directory; + } + } + return newUrl; + } else { + return url; + } + } else if (Arrays.asList(instagram_domains).contains(host)) { + boolean bibliogram_enabled = sharedpreferences.getBoolean(SET_BIBLIOGRAM_ENABLED, true); + if (bibliogram_enabled) { + Matcher matcher = bibliogramPostPattern.matcher(url); + while (matcher.find()) { + final String bibliogram_directory = matcher.group(2); + String bibliogramHost = sharedpreferences.getString(MainActivity.SET_BIBLIOGRAM_HOST, MainActivity.DEFAULT_BIBLIOGRAM_HOST).toLowerCase(); + newUrl = "https://" + bibliogramHost + bibliogram_directory; + } + matcher = bibliogramAccountPattern.matcher(url); + while (matcher.find()) { + final String bibliogram_directory = matcher.group(2); + String bibliogramHost = sharedpreferences.getString(MainActivity.SET_BIBLIOGRAM_HOST, MainActivity.DEFAULT_BIBLIOGRAM_HOST).toLowerCase(); + if (bibliogram_directory != null && bibliogram_directory.compareTo("privacy") != 0) { + newUrl = "https://" + bibliogramHost + "/u" + bibliogram_directory; + } else { + newUrl = "https://" + bibliogramHost + bibliogram_directory; + } + } + return newUrl; + } else { + return url; + } + } else if (url.contains("/maps/place")) { + boolean osm_enabled = sharedpreferences.getBoolean(MainActivity.SET_OSM_ENABLED, true); + if (osm_enabled) { + Matcher matcher = maps.matcher(url); + while (matcher.find()) { + final String localization = matcher.group(1); + assert localization != null; + String[] data = localization.split(","); + if (data.length > 2) { + String zoom; + String[] details = data[2].split("\\."); + if (details.length > 0) { + zoom = details[0]; + } else { + zoom = data[2]; + } + + String osmHost = sharedpreferences.getString(MainActivity.SET_OSM_HOST, MainActivity.DEFAULT_OSM_HOST).toLowerCase(); + boolean geo_uri_enabled = sharedpreferences.getBoolean(MainActivity.SET_GEO_URIS, false); + if (!geo_uri_enabled) { + newUrl = "https://" + osmHost + "/#map=" + zoom + "/" + data[0] + "/" + data[1]; + } else { + newUrl = "geo:0,0?q=" + data[0] + "," + data[1] + ",z=" + zoom; + } + } + } + if (newUrl == null && url.contains("/data=")) { + matcher = extractPlace.matcher(url); + while (matcher.find()) { + final String search = matcher.group(1); + newUrl = "geo:0,0?q=" + search; + } + } + return newUrl; + } else { + return url; + } + } else if (Arrays.asList(youtube_domains).contains(host)) { //Youtube URL + boolean invidious_enabled = sharedpreferences.getBoolean(SET_INVIDIOUS_ENABLED, true); + if (invidious_enabled) { + Matcher matcher = youtubePattern.matcher(url); + while (matcher.find()) { + final String youtubeId = matcher.group(3); + String invidiousHost = sharedpreferences.getString(MainActivity.SET_INVIDIOUS_HOST, MainActivity.DEFAULT_INVIDIOUS_HOST).toLowerCase(); + if (Objects.requireNonNull(matcher.group(2)).compareTo("youtu.be") == 0) { + newUrl = "https://" + invidiousHost + "/watch?v=" + youtubeId + "&local=true"; + } else { + newUrl = "https://" + invidiousHost + "/" + youtubeId + "&local=true"; + } + } + return newUrl; + } else { + return url; + } + } + return url; + } + /** * Get time for reaching a domain * diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index aa5e02f..60d3140 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -43,6 +43,7 @@ <style name="Theme.AppCompat.Translucent"> + <item name="colorAccent">@color/colorAccent</item> <item name="android:textColor">@color/textColor</item> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item>