@@ 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) { }
}
@@ 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()) {
@@ 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);