|
|
@ -79,6 +79,10 @@ import com.google.android.material.snackbar.Snackbar;
|
|
|
|
import com.google.android.material.tabs.TabLayout;
|
|
|
|
import com.google.android.material.tabs.TabLayout;
|
|
|
|
import com.jaredrummler.cyanea.Cyanea;
|
|
|
|
import com.jaredrummler.cyanea.Cyanea;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.jsoup.Jsoup;
|
|
|
|
|
|
|
|
import org.jsoup.nodes.Document;
|
|
|
|
|
|
|
|
import org.jsoup.nodes.Element;
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.ArrayList;
|
|
|
@ -852,111 +856,114 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
|
|
|
|
boolean fetchSharedMedia = sharedpreferences.getBoolean(getString(R.string.SET_RETRIEVE_METADATA_IF_URL_FROM_EXTERAL), true);
|
|
|
|
boolean fetchSharedMedia = sharedpreferences.getBoolean(getString(R.string.SET_RETRIEVE_METADATA_IF_URL_FROM_EXTERAL), true);
|
|
|
|
boolean fetchShareContent = sharedpreferences.getBoolean(getString(R.string.SET_SHARE_DETAILS), true);
|
|
|
|
boolean fetchShareContent = sharedpreferences.getBoolean(getString(R.string.SET_SHARE_DETAILS), true);
|
|
|
|
if (url[0] != null && count == 1 && (fetchShareContent || fetchSharedMedia)) {
|
|
|
|
if (url[0] != null && count == 1 && (fetchShareContent || fetchSharedMedia)) {
|
|
|
|
if (!url[0].trim().equalsIgnoreCase(sharedText.trim())) {
|
|
|
|
String originalUrl = url[0];
|
|
|
|
Bundle b = new Bundle();
|
|
|
|
new Thread(() -> {
|
|
|
|
b.putString(Helper.ARG_SHARE_TITLE, sharedSubject);
|
|
|
|
if (!url[0].matches("^https?://.*")) url[0] = "http://" + url[0];
|
|
|
|
b.putString(Helper.ARG_SHARE_DESCRIPTION, sharedText);
|
|
|
|
Matcher matcherPattern = Patterns.WEB_URL.matcher(url[0]);
|
|
|
|
CrossActionHelper.doCrossShare(BaseMainActivity.this, b);
|
|
|
|
String potentialUrl = null;
|
|
|
|
} else {
|
|
|
|
while (matcherPattern.find()) {
|
|
|
|
new Thread(() -> {
|
|
|
|
int matchStart = matcherPattern.start(1);
|
|
|
|
if (url[0].startsWith("www."))
|
|
|
|
int matchEnd = matcherPattern.end();
|
|
|
|
url[0] = "http://" + url[0];
|
|
|
|
if (matchStart < matchEnd && url[0].length() >= matchEnd)
|
|
|
|
Matcher matcherPattern = Patterns.WEB_URL.matcher(url[0]);
|
|
|
|
potentialUrl = url[0].substring(matchStart, matchEnd);
|
|
|
|
String potentialUrl = null;
|
|
|
|
}
|
|
|
|
while (matcherPattern.find()) {
|
|
|
|
// If we actually have a URL then make use of it.
|
|
|
|
int matchStart = matcherPattern.start(1);
|
|
|
|
if (potentialUrl != null && potentialUrl.length() > 0) {
|
|
|
|
int matchEnd = matcherPattern.end();
|
|
|
|
|
|
|
|
if (matchStart < matchEnd && url[0].length() >= matchEnd)
|
|
|
|
|
|
|
|
potentialUrl = url[0].substring(matchStart, matchEnd);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// If we actually have a URL then make use of it.
|
|
|
|
|
|
|
|
if (potentialUrl != null && potentialUrl.length() > 0) {
|
|
|
|
|
|
|
|
Pattern titlePattern = Pattern.compile("<meta [^>]*property=[\"']og:title[\"'] [^>]*content=[\"']([^'^\"]+?)[\"'][^>]*>");
|
|
|
|
|
|
|
|
Pattern descriptionPattern = Pattern.compile("<meta [^>]*property=[\"']og:description[\"'] [^>]*content=[\"']([^'^\"]+?)[\"'][^>]*>");
|
|
|
|
|
|
|
|
Pattern imagePattern = Pattern.compile("<meta [^>]*property=[\"']og:image[\"'] [^>]*content=[\"']([^'^\"]+?)[\"'][^>]*>");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
OkHttpClient client = new OkHttpClient.Builder()
|
|
|
|
|
|
|
|
.connectTimeout(10, TimeUnit.SECONDS)
|
|
|
|
|
|
|
|
.writeTimeout(10, TimeUnit.SECONDS)
|
|
|
|
|
|
|
|
.proxy(Helper.getProxy(getApplication().getApplicationContext()))
|
|
|
|
|
|
|
|
.readTimeout(10, TimeUnit.SECONDS).build();
|
|
|
|
|
|
|
|
Request request = new Request.Builder()
|
|
|
|
|
|
|
|
.url(potentialUrl)
|
|
|
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
client.newCall(request).enqueue(new Callback() {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void onFailure(@NonNull Call call, @NonNull IOException e) {
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
|
|
runOnUiThread(() -> Toasty.warning(BaseMainActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void onResponse(@NonNull Call call, @NonNull final Response response) {
|
|
|
|
try {
|
|
|
|
if (response.isSuccessful()) {
|
|
|
|
OkHttpClient client = new OkHttpClient.Builder()
|
|
|
|
try {
|
|
|
|
.connectTimeout(10, TimeUnit.SECONDS)
|
|
|
|
String data = response.body().string();
|
|
|
|
.writeTimeout(10, TimeUnit.SECONDS)
|
|
|
|
Matcher matcherTitle;
|
|
|
|
.proxy(Helper.getProxy(getApplication().getApplicationContext()))
|
|
|
|
matcherTitle = titlePattern.matcher(data);
|
|
|
|
.readTimeout(10, TimeUnit.SECONDS).build();
|
|
|
|
Matcher matcherDescription = descriptionPattern.matcher(data);
|
|
|
|
Request request = new Request.Builder()
|
|
|
|
Matcher matcherImage = imagePattern.matcher(data);
|
|
|
|
.url(potentialUrl)
|
|
|
|
String titleEncoded = null;
|
|
|
|
.build();
|
|
|
|
String descriptionEncoded = null;
|
|
|
|
client.newCall(request).enqueue(new Callback() {
|
|
|
|
if (fetchShareContent) {
|
|
|
|
@Override
|
|
|
|
while (matcherTitle.find())
|
|
|
|
public void onFailure(@NonNull Call call, @NonNull IOException e) {
|
|
|
|
titleEncoded = matcherTitle.group(1);
|
|
|
|
e.printStackTrace();
|
|
|
|
while (matcherDescription.find())
|
|
|
|
runOnUiThread(() -> Toasty.warning(BaseMainActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show());
|
|
|
|
descriptionEncoded = matcherDescription.group(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
String image = null;
|
|
|
|
@Override
|
|
|
|
if (fetchSharedMedia) {
|
|
|
|
public void onResponse(@NonNull Call call, @NonNull final Response response) {
|
|
|
|
while (matcherImage.find())
|
|
|
|
if (response.isSuccessful()) {
|
|
|
|
image = matcherImage.group(1);
|
|
|
|
try {
|
|
|
|
|
|
|
|
String data = response.body().string();
|
|
|
|
|
|
|
|
Document html = Jsoup.parse(data);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Element titleEl = html.selectFirst("meta[property='og:title']");
|
|
|
|
|
|
|
|
Element descriptionEl = html.selectFirst("meta[property='og:description']");
|
|
|
|
|
|
|
|
Element imageUrlEl = html.selectFirst("meta[property='og:image']");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String title = "";
|
|
|
|
|
|
|
|
String description = "";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(titleEl != null) {
|
|
|
|
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
|
|
|
|
|
|
title = Html.fromHtml(titleEl.attr("content"), Html.FROM_HTML_MODE_LEGACY).toString();
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
title = Html.fromHtml(titleEl.attr("content")).toString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
String title = null;
|
|
|
|
}
|
|
|
|
String description = null;
|
|
|
|
|
|
|
|
|
|
|
|
if(descriptionEl != null) {
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
|
|
if (titleEncoded != null)
|
|
|
|
description = Html.fromHtml(descriptionEl.attr("content"), Html.FROM_HTML_MODE_LEGACY).toString();
|
|
|
|
title = Html.fromHtml(titleEncoded, Html.FROM_HTML_MODE_LEGACY).toString();
|
|
|
|
|
|
|
|
if (descriptionEncoded != null)
|
|
|
|
|
|
|
|
description = Html.fromHtml(descriptionEncoded, Html.FROM_HTML_MODE_LEGACY).toString();
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
if (titleEncoded != null)
|
|
|
|
description = Html.fromHtml(descriptionEl.attr("content")).toString();
|
|
|
|
title = Html.fromHtml(titleEncoded).toString();
|
|
|
|
|
|
|
|
if (descriptionEncoded != null)
|
|
|
|
|
|
|
|
description = Html.fromHtml(descriptionEncoded).toString();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
String finalImage = image;
|
|
|
|
|
|
|
|
String finalTitle = title;
|
|
|
|
|
|
|
|
String finalDescription = description;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
runOnUiThread(() -> {
|
|
|
|
|
|
|
|
Bundle b = new Bundle();
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_URL, url[0]);
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_URL_MEDIA, finalImage);
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_TITLE, finalTitle);
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_DESCRIPTION, finalDescription);
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_SUBJECT, sharedSubject);
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_CONTENT, sharedText);
|
|
|
|
|
|
|
|
CrossActionHelper.doCrossShare(BaseMainActivity.this, b);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
|
|
|
|
runOnUiThread(() -> Toasty.warning(BaseMainActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show());
|
|
|
|
String imageUrl = "";
|
|
|
|
|
|
|
|
if(imageUrlEl != null) {
|
|
|
|
|
|
|
|
imageUrl = imageUrlEl.attr("content");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
StringBuilder titleBuilder = new StringBuilder();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!originalUrl.trim().equalsIgnoreCase(sharedText.trim())) {
|
|
|
|
|
|
|
|
// If the shared text is not just the URL, add it to the top
|
|
|
|
|
|
|
|
String toAppend = sharedText.replaceAll("\\s*" + Pattern.quote(originalUrl) + "\\s*", "");
|
|
|
|
|
|
|
|
titleBuilder.append(toAppend);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (title.length() > 0) {
|
|
|
|
|
|
|
|
// OG title fetched from source
|
|
|
|
|
|
|
|
if(titleBuilder.length() > 0) titleBuilder.append("\n\n");
|
|
|
|
|
|
|
|
titleBuilder.append(title);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String finalImage = imageUrl;
|
|
|
|
|
|
|
|
String finalTitle = titleBuilder.toString();
|
|
|
|
|
|
|
|
String finalDescription = description;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
runOnUiThread(() -> {
|
|
|
|
|
|
|
|
Bundle b = new Bundle();
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_URL, url[0]);
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_URL_MEDIA, finalImage);
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_TITLE, finalTitle);
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_DESCRIPTION, finalDescription);
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_SUBJECT, sharedSubject);
|
|
|
|
|
|
|
|
b.putString(Helper.ARG_SHARE_CONTENT, sharedText);
|
|
|
|
|
|
|
|
CrossActionHelper.doCrossShare(BaseMainActivity.this, b);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
runOnUiThread(() -> Toasty.warning(BaseMainActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
});
|
|
|
|
Toasty.warning(BaseMainActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show();
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
}
|
|
|
|
Toasty.warning(BaseMainActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}).start();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}).start();
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
Bundle b = new Bundle();
|
|
|
|
Bundle b = new Bundle();
|
|
|
|
b.putString(Helper.ARG_SHARE_TITLE, sharedSubject);
|
|
|
|
b.putString(Helper.ARG_SHARE_TITLE, sharedSubject);
|
|
|
|