fedilab-Android-App/app/src/main/java/app/fedilab/android/mastodon/activities/CustomSharingActivity.java

263 lines
11 KiB
Java

package app.fedilab.android.mastodon.activities;
/* Copyright 2022 Thomas Schneider
*
* This file is a part of Fedilab
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with Fedilab; if not,
* see <http://www.gnu.org/licenses>. */
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.Html;
import android.text.TextUtils;
import android.view.MenuItem;
import android.widget.Toast;
import androidx.preference.PreferenceManager;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import app.fedilab.android.R;
import app.fedilab.android.databinding.ActivityCustomSharingBinding;
import app.fedilab.android.mastodon.client.entities.api.Attachment;
import app.fedilab.android.mastodon.client.entities.api.Emoji;
import app.fedilab.android.mastodon.client.entities.api.Status;
import app.fedilab.android.mastodon.client.entities.api.Tag;
import app.fedilab.android.mastodon.client.entities.app.CachedBundle;
import app.fedilab.android.mastodon.helper.Helper;
import app.fedilab.android.mastodon.helper.customsharing.CustomSharingAsyncTask;
import app.fedilab.android.mastodon.helper.customsharing.CustomSharingResponse;
import app.fedilab.android.mastodon.helper.customsharing.OnCustomSharingInterface;
import es.dmoral.toasty.Toasty;
/**
* Created by Curtis on 13/02/2019.
* Share status metadata to remote content aggregators
*/
public class CustomSharingActivity extends BaseBarActivity implements OnCustomSharingInterface {
private String title, keywords, custom_sharing_url, encodedCustomSharingURL;
private String bundle_url;
private String bundle_source;
private String bundle_id;
private String bundle_content;
private String bundle_thumbnailurl;
private String bundle_creator;
private ActivityCustomSharingBinding binding;
private Status status;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityCustomSharingBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
Bundle args = getIntent().getExtras();
status = null;
if (args != null) {
long bundleId = args.getLong(Helper.ARG_INTENT_ID, -1);
new CachedBundle(CustomSharingActivity.this).getBundle(bundleId, Helper.getCurrentAccount(CustomSharingActivity.this), this::initializeAfterBundle);
} else {
initializeAfterBundle(null);
}
}
private void initializeAfterBundle(Bundle bundle) {
if (bundle != null) {
status = (Status) bundle.getSerializable(Helper.ARG_STATUS);
}
if (status == null) {
finish();
return;
}
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(CustomSharingActivity.this);
bundle_creator = status.account.acct;
bundle_url = status.url;
bundle_id = status.uri;
bundle_source = status.account.url;
String bundle_tags = getTagsString();
bundle_content = formatedContent(status.content, status.emojis);
if (status.card != null && status.card.image != null) {
bundle_thumbnailurl = status.card.image;
} else if (status.media_attachments != null && status.media_attachments.size() > 0) {
List<Attachment> mediaAttachments = status.media_attachments;
Attachment firstAttachment = mediaAttachments.get(0);
bundle_thumbnailurl = firstAttachment.preview_url;
} else {
bundle_thumbnailurl = status.account.avatar;
}
if (!bundle_creator.contains("@")) {
bundle_creator = bundle_creator + "@" + Helper.getCurrentAccount(CustomSharingActivity.this).instance;
}
binding.setCustomSharingTitle.setEllipsize(TextUtils.TruncateAt.END);
//set text on title, description, and keywords
String[] lines = bundle_content.split("\n");
//Remove tags in title
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
lines[0] = Html.fromHtml(lines[0], Html.FROM_HTML_MODE_LEGACY).toString();
else
lines[0] = Html.fromHtml(lines[0]).toString();
String newTitle;
if (lines[0].length() > 60) {
newTitle = lines[0].substring(0, 60) + '…';
} else {
newTitle = lines[0];
}
binding.setCustomSharingTitle.setText(newTitle);
String newDescription;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
newDescription = Html.fromHtml(bundle_content, Html.FROM_HTML_MODE_LEGACY).toString();
else
newDescription = Html.fromHtml(bundle_content).toString();
binding.setCustomSharingDescription.setText(newDescription);
binding.setCustomSharingKeywords.setText(bundle_tags);
binding.setCustomSharingSave.setOnClickListener(v -> {
// obtain title, description, keywords
title = binding.setCustomSharingTitle.getText().toString();
keywords = Objects.requireNonNull(binding.setCustomSharingKeywords.getText()).toString();
CharSequence comma_only = ",";
CharSequence space_only = " ";
CharSequence double_space = " ";
keywords = keywords.replace(comma_only, space_only);
keywords = keywords.replace(double_space, space_only);
// Create encodedCustomSharingURL
custom_sharing_url = sharedpreferences.getString(getString(R.string.SET_CUSTOM_SHARING_URL),
"http://example.net/add?token=YOUR_TOKEN&url=${url}&title=${title}" +
"&source=${source}&id=${id}&description=${description}&keywords=${keywords}&creator=${creator}&thumbnailurl=${thumbnailurl}");
encodedCustomSharingURL = encodeCustomSharingURL();
new CustomSharingAsyncTask(CustomSharingActivity.this, encodedCustomSharingURL, CustomSharingActivity.this);
});
}
private String getTagsString() {
//iterate through tags and create comma delimited string of tag names
StringBuilder tag_names = new StringBuilder();
for (Tag t : status.tags) {
if (tag_names.toString().equals("")) {
tag_names = new StringBuilder(t.name);
} else {
tag_names.append(", ").append(t.name);
}
}
return tag_names.toString();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onCustomSharing(CustomSharingResponse customSharingResponse) {
binding.setCustomSharingSave.setEnabled(true);
if (customSharingResponse.getError() != null) {
Toasty.error(CustomSharingActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show();
return;
}
String response = customSharingResponse.getResponse();
Toasty.success(CustomSharingActivity.this, response, Toast.LENGTH_LONG).show();
finish();
}
public String encodeCustomSharingURL() {
Uri uri = Uri.parse(custom_sharing_url);
String protocol = uri.getScheme();
String server = uri.getAuthority();
String path = uri.getPath();
if (path != null) {
path = path.replaceAll("/", "");
}
Uri.Builder builder = new Uri.Builder();
builder.scheme(protocol)
.authority(server)
.appendPath(path);
Set<String> args = uri.getQueryParameterNames();
boolean paramFound;
for (String param_name : args) {
paramFound = false;
String param_value = uri.getQueryParameter(param_name);
if (param_value != null)
switch (param_value) {
case "${url}" -> {
paramFound = true;
builder.appendQueryParameter(param_name, bundle_url);
}
case "${title}" -> {
paramFound = true;
builder.appendQueryParameter(param_name, title);
}
case "${source}" -> {
paramFound = true;
builder.appendQueryParameter(param_name, bundle_source);
}
case "${id}" -> {
paramFound = true;
builder.appendQueryParameter(param_name, bundle_id);
}
case "${description}" -> {
paramFound = true;
builder.appendQueryParameter(param_name, bundle_content);
}
case "${keywords}" -> {
paramFound = true;
builder.appendQueryParameter(param_name, keywords);
}
case "${creator}" -> {
paramFound = true;
builder.appendQueryParameter(param_name, bundle_creator);
}
case "${thumbnailurl}" -> {
paramFound = true;
builder.appendQueryParameter(param_name, bundle_thumbnailurl);
}
}
if (!paramFound) {
builder.appendQueryParameter(param_name, param_value);
}
}
return builder.build().toString();
}
private String formatedContent(String content, List<Emoji> emojis) {
//Avoid null content
if (content == null)
return "";
if (emojis == null || emojis.size() == 0)
return content;
for (Emoji emoji : emojis) {
content = content.replaceAll(":" + emoji.shortcode + ":", "<img src='" + emoji.url + "' width=20 alt='" + emoji.shortcode + "'/>");
}
return content;
}
}