Commit 893b060a authored by Thomas's avatar Thomas
Browse files

Fix issue #982 - Make link clickable in media descriptions

parent bc3b07d7
Loading
Loading
Loading
Loading
+50 −5
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@ package app.fedilab.android.mastodon.activities;
 * You should have received a copy of the GNU General Public License along with Fedilab; if not,
 * see <http://www.gnu.org/licenses>. */

import static android.util.Patterns.WEB_URL;

import android.Manifest;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
@@ -21,12 +23,18 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.method.ScrollingMovementMethod;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
@@ -34,6 +42,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
@@ -42,11 +51,13 @@ import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.preference.PreferenceManager;
import androidx.viewpager.widget.ViewPager;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.regex.Matcher;

import app.fedilab.android.R;
import app.fedilab.android.databinding.ActivityMediaPagerBinding;
@@ -152,8 +163,8 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload
            });
        }

        binding.mediaDescription.setMovementMethod(new ScrollingMovementMethod());
        binding.mediaDescriptionTranslated.setMovementMethod(new ScrollingMovementMethod());
        binding.mediaDescription.setMovementMethod(LinkMovementMethod.getInstance());
        binding.mediaDescriptionTranslated.setMovementMethod(LinkMovementMethod.getInstance());

        if (description != null && description.trim().length() > 0 && description.trim().compareTo("null") != 0) {
            binding.mediaDescription.setText(description);
@@ -195,7 +206,7 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload
                }
                handler = new Handler();
                if (description != null && description.trim().length() > 0 && description.trim().compareTo("null") != 0) {
                    binding.mediaDescription.setText(description);
                    binding.mediaDescription.setText(linkify(MediaActivity.this, description), TextView.BufferType.SPANNABLE);
                }
                binding.translate.setOnClickListener(v -> {
                    String descriptionToTranslate = attachments.get(position).description;
@@ -228,6 +239,40 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload
        setFullscreen(true);
    }

    private Spannable linkify(Context context, String content) {
        if(content == null) {
            return new SpannableString("");
        }
        Matcher matcher = WEB_URL.matcher(content);
        Spannable contentSpan = new SpannableString(content);
        SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
        boolean underlineLinks = sharedpreferences.getBoolean(context.getString(R.string.SET_UNDERLINE_CLICKABLE), false);


        while (matcher.find()) {
            int matchStart = matcher.start();
            int matchEnd = matcher.end();
            String url = content.substring(matchStart, matchEnd);
            if (matchStart >= 0 && matchEnd <= content.length() && matchEnd >= matchStart) {
                contentSpan.setSpan(new ClickableSpan() {
                    @Override
                    public void onClick(@NonNull View textView) {
                        Helper.openBrowser(context, url);
                    }

                    @Override
                    public void updateDrawState(@NonNull TextPaint ds) {
                        super.updateDrawState(ds);
                        if(!underlineLinks) {
                            ds.setUnderlineText(status != null && status.underlined);
                        }
                    }
                }, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            }
        }
        return contentSpan;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        try {
@@ -337,7 +382,7 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload
        if (!fullscreen) {
            String description = attachments.get(binding.mediaViewpager.getCurrentItem()).description;
            if (description != null && description.trim().length() > 0 && description.trim().compareTo("null") != 0) {
                binding.mediaDescription.setText(description);
                binding.mediaDescription.setText(linkify(MediaActivity.this, description), TextView.BufferType.SPANNABLE);
                if (attachments.get(binding.mediaViewpager.getCurrentItem()).translation != null) {
                    binding.mediaDescription.setVisibility(View.GONE);
                    binding.mediaDescriptionTranslated.setText(attachments.get(binding.mediaViewpager.getCurrentItem()).translation);