~singpolyma/cheogram-android

2accb4dd854327b65d412c68dae263a7ec83a7de — Stephen Paul Weber 11 months ago cd2c27d
Open sms and tel URI in-app if there is a relevant gateway
M src/main/java/eu/siacs/conversations/entities/Conversation.java => src/main/java/eu/siacs/conversations/entities/Conversation.java +12 -10
@@ 1385,15 1385,17 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
            if (oldConversation != null) {
                oldConversation.pagerAdapter.mPager = null;
                oldConversation.pagerAdapter.mTabs = null;
                page1 = oldConversation.pagerAdapter.page1;
                page2 = oldConversation.pagerAdapter.page2;
                oldConversation.pagerAdapter.page1 = null;
                oldConversation.pagerAdapter.page2 = null;
            }

            if (mPager == null) return;
            if (sessions != null) show();

            if (pager.getChildAt(0) != null) page1 = pager.getChildAt(0);
            if (pager.getChildAt(1) != null) page2 = pager.getChildAt(1);
            if (page1 == null) page1 = oldConversation.pagerAdapter.page1;
            if (page2 == null) page2 = oldConversation.pagerAdapter.page2;
            if (page1 == null) page1 = pager.getChildAt(0);
            if (page2 == null) page2 = pager.getChildAt(1);
            if (page1 == null || page2 == null) {
                throw new IllegalStateException("page1 or page2 were not present as child or in model?");
            }


@@ 1798,16 1800,16 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl

                    if (field.getType().equals(Optional.of("jid-single")) || field.getType().equals(Optional.of("jid-multi"))) {
                        binding.values.setOnItemClickListener((arg0, arg1, pos, id) -> {
                            new FixedURLSpan("xmpp:" + Jid.ofEscaped(values.getItem(pos).getValue()).toEscapedString()).onClick(binding.values);
                            new FixedURLSpan("xmpp:" + Jid.ofEscaped(values.getItem(pos).getValue()).toEscapedString(), account).onClick(binding.values);
                        });
                    } else if ("xs:anyURI".equals(datatype)) {
                        binding.values.setOnItemClickListener((arg0, arg1, pos, id) -> {
                            new FixedURLSpan(values.getItem(pos).getValue()).onClick(binding.values);
                            new FixedURLSpan(values.getItem(pos).getValue(), account).onClick(binding.values);
                        });
                    } else if ("html:tel".equals(datatype)) {
                        binding.values.setOnItemClickListener((arg0, arg1, pos, id) -> {
                            try {
                                new FixedURLSpan("tel:" + PhoneNumberUtilWrapper.normalize(binding.getRoot().getContext(), values.getItem(pos).getValue())).onClick(binding.values);
                                new FixedURLSpan("tel:" + PhoneNumberUtilWrapper.normalize(binding.getRoot().getContext(), values.getItem(pos).getValue()), account).onClick(binding.values);
                            } catch (final IllegalArgumentException | NumberParseException | NullPointerException e) { }
                        });
                    }


@@ 1837,12 1839,12 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
                        String value = formatValue(datatype, cell.el.findChildContent("value", "jabber:x:data"), true);
                        SpannableStringBuilder text = new SpannableStringBuilder(value == null ? "" : value);
                        if (cell.reported.getType().equals(Optional.of("jid-single"))) {
                            text.setSpan(new FixedURLSpan("xmpp:" + Jid.ofEscaped(text.toString()).toEscapedString()), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                            text.setSpan(new FixedURLSpan("xmpp:" + Jid.ofEscaped(text.toString()).toEscapedString(), account), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                        } else if ("xs:anyURI".equals(datatype)) {
                            text.setSpan(new FixedURLSpan(text.toString()), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                            text.setSpan(new FixedURLSpan(text.toString(), account), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                        } else if ("html:tel".equals(datatype)) {
                            try {
                                text.setSpan(new FixedURLSpan("tel:" + PhoneNumberUtilWrapper.normalize(binding.getRoot().getContext(), text.toString())), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                                text.setSpan(new FixedURLSpan("tel:" + PhoneNumberUtilWrapper.normalize(binding.getRoot().getContext(), text.toString()), account), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                            } catch (final IllegalArgumentException | NumberParseException | NullPointerException e) { }
                        }


M src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java => src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java +33 -0
@@ 64,6 64,8 @@ import com.cheogram.android.DownloadDefaultStickers;

import com.google.common.collect.ImmutableList;

import io.michaelrocks.libphonenumber.android.NumberParseException;

import org.openintents.openpgp.util.OpenPgpApi;

import java.util.Arrays;


@@ 92,6 94,7 @@ import eu.siacs.conversations.ui.util.ConversationMenuConfigurator;
import eu.siacs.conversations.ui.util.MenuDoubleTabUtil;
import eu.siacs.conversations.ui.util.PendingItem;
import eu.siacs.conversations.utils.ExceptionHelper;
import eu.siacs.conversations.utils.PhoneNumberUtilWrapper;
import eu.siacs.conversations.utils.SignupUtils;
import eu.siacs.conversations.utils.ThemeHelper;
import eu.siacs.conversations.utils.XmppUri;


@@ 600,6 603,36 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
        return false;
    }

    public boolean onTelUriClicked(Uri uri, Account acct) {
        final String tel;
        try {
            tel = PhoneNumberUtilWrapper.normalize(this, uri.getSchemeSpecificPart());
        } catch (final IllegalArgumentException | NumberParseException | NullPointerException e) {
            return false;
        }

        Set<String> gateways = new HashSet<>();
        for (Account account : (acct == null ? xmppConnectionService.getAccounts() : List.of(acct))) {
            for (Contact contact : account.getRoster().getContacts()) {
                if (contact.getPresences().anyIdentity("gateway", "pstn") || contact.getPresences().anyIdentity("gateway", "sms")) {
                    if (acct == null) acct = account;
                    gateways.add(contact.getJid().asBareJid().toEscapedString());
                }
            }
        }

        for (String gateway : gateways) {
            if (onXmppUriClicked(Uri.parse("xmpp:" + tel + "@" + gateway))) return true;
        }

        if (gateways.size() == 1 && acct != null) {
            openConversation(xmppConnectionService.findOrCreateConversation(acct, Jid.ofLocalAndDomain(tel, gateways.iterator().next()), false, true), null);
            return true;
        }

        return false;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (MenuDoubleTabUtil.shouldIgnoreTap()) {

M src/main/java/eu/siacs/conversations/ui/text/FixedURLSpan.java => src/main/java/eu/siacs/conversations/ui/text/FixedURLSpan.java +16 -1
@@ 44,14 44,21 @@ import android.widget.Toast;
import java.util.Arrays;

import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.ui.ConversationsActivity;


@SuppressLint("ParcelCreator")
public class FixedURLSpan extends URLSpan {

	protected final Account account;

	public FixedURLSpan(String url) {
		this(url, null);
	}

	public FixedURLSpan(String url, Account account) {
		super(url);
		this.account = account;
	}

	public static void fix(final Editable editable) {


@@ 74,6 81,14 @@ public class FixedURLSpan extends URLSpan {
				return;
			}
		}

		if (("sms".equals(uri.getScheme()) || "tel".equals(uri.getScheme())) && context instanceof ConversationsActivity) {
			if (((ConversationsActivity) context).onTelUriClicked(uri, account)) {
				widget.playSoundEffect(0);
				return;
			}
		}

		final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);