导航菜单

页面标题

页面副标题

St.John's v1.0.9 - CustomLinkMovementMethod.java 源代码

正在查看: St.John's v1.0.9 应用的 CustomLinkMovementMethod.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package com.mcb.stjohnsemschool.utils;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.text.Layout;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.MotionEvent;
import android.widget.TextView;
import android.widget.Toast;
import com.microsoft.identity.common.adal.internal.AuthenticationConstants;
import io.ably.lib.util.AgentHeaderCreator;

public class CustomLinkMovementMethod extends LinkMovementMethod {
    private static CustomLinkMovementMethod instance;

    public static CustomLinkMovementMethod getInstance() {
        if (instance == null) {
            instance = new CustomLinkMovementMethod();
        }
        return instance;
    }

    @Override
    public boolean onTouchEvent(TextView textView, Spannable spannable, MotionEvent motionEvent) {
        if (motionEvent.getAction() == 1) {
            int x = (int) motionEvent.getX();
            int y = (int) motionEvent.getY();
            int totalPaddingLeft = x - textView.getTotalPaddingLeft();
            int totalPaddingTop = y - textView.getTotalPaddingTop();
            int scrollX = totalPaddingLeft + textView.getScrollX();
            int scrollY = totalPaddingTop + textView.getScrollY();
            Layout layout = textView.getLayout();
            int offsetForHorizontal = layout.getOffsetForHorizontal(layout.getLineForVertical(scrollY), scrollX);
            ClickableSpan[] clickableSpanArr = (ClickableSpan[]) spannable.getSpans(offsetForHorizontal, offsetForHorizontal, ClickableSpan.class);
            if (clickableSpanArr.length != 0) {
                ClickableSpan clickableSpan = clickableSpanArr[0];
                if (clickableSpan instanceof URLSpan) {
                    String url = ((URLSpan) clickableSpan).getURL();
                    Context context = textView.getContext();
                    String cleanUrl = cleanUrl(url);
                    if (cleanUrl != null) {
                        if (cleanUrl.startsWith("https://drive.google.com")) {
                            handleGoogleDriveLink(context, cleanUrl);
                        } else {
                            openUrlInBrowser(context, cleanUrl);
                        }
                    } else {
                        Toast.makeText(context, "Invalid URL", 0).show();
                    }
                    return true;
                }
            }
        }
        return super.onTouchEvent(textView, spannable, motionEvent);
    }

    private String cleanUrl(String str) {
        String trim = str.trim();
        if (trim.startsWith("http://") || trim.startsWith(AuthenticationConstants.Broker.REDIRECT_SSL_PREFIX)) {
            return trim;
        }
        if (trim.startsWith("www.")) {
            return "http://" + trim;
        }
        return "http://" + trim;
    }

    private void handleGoogleDriveLink(Context context, String str) {
        if (str.startsWith("https://drive.google.com/file/d/")) {
            String driveIdFromUrl = getDriveIdFromUrl(str);
            if (driveIdFromUrl != null) {
                openGoogleDriveFileLink(context, driveIdFromUrl);
                return;
            } else {
                openUrlInBrowser(context, str);
                return;
            }
        }
        openUrlInBrowser(context, str);
    }

    private String getDriveIdFromUrl(String str) {
        int i;
        try {
            String[] split = Uri.parse(str).getPath().split(AgentHeaderCreator.AGENT_DIVIDER);
            for (int i2 = 0; i2 < split.length; i2++) {
                if ("d".equals(split[i2]) && (i = i2 + 1) < split.length) {
                    return split[i];
                }
            }
            return null;
        } catch (Exception unused) {
            return null;
        }
    }

    private void openGoogleDriveFileLink(Context context, String str) {
        try {
            String str2 = "https://drive.google.com/file/d/" + str + "/view";
            Intent intent = new Intent("android.intent.action.VIEW");
            intent.setData(Uri.parse(str2));
            if (!(context instanceof Activity)) {
                intent.addFlags(268435456);
                context.startActivity(intent);
            } else {
                openUrlInBrowser(context, str2);
            }
        } catch (Exception unused) {
            Toast.makeText(context, "Unable to open link", 0).show();
        }
    }

    private void openUrlInBrowser(Context context, String str) {
        try {
            Intent intent = new Intent("android.intent.action.VIEW", Uri.parse(str));
            if (!(context instanceof Activity)) {
                intent.addFlags(268435456);
                context.startActivity(intent);
            } else {
                Toast.makeText(context, "No application found to open this link", 0).show();
            }
        } catch (Exception unused) {
            Toast.makeText(context, "No application found to open this link", 0).show();
        }
    }
}