Files
arcanechat-android/src/main/java/org/thoughtcrime/securesms/util/LongClickCopySpan.java
T

131 lines
4.7 KiB
Java

package org.thoughtcrime.securesms.util;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import androidx.annotation.ColorInt;
import androidx.appcompat.app.AlertDialog;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.view.View;
import android.widget.Toast;
import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcContext;
import org.thoughtcrime.securesms.ConversationActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.qr.QrCodeHandler;
import org.thoughtcrime.securesms.util.Util;
public class LongClickCopySpan extends ClickableSpan {
private static final String PREFIX_MAILTO = "mailto:";
private static final String PREFIX_TEL = "tel:";
private static final String PREFIX_CMD = "cmd:";
private boolean isHighlighted;
@ColorInt
private int highlightColor;
private final String url;
public LongClickCopySpan(String url) {
this.url = url;
}
private void openChat(Activity activity, DcContact contact) {
DcContext dcContext = DcHelper.getContext(activity);
int chatId = dcContext.createChatByContactId(contact.getId());
if (chatId != 0) {
Intent intent = new Intent(activity, ConversationActivity.class);
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId);
activity.startActivity(intent);
}
}
@Override
public void onClick(View widget) {
if (url.startsWith(PREFIX_CMD)) {
try {
String cmd = url.substring(PREFIX_CMD.length());
ConversationActivity activity = (ConversationActivity) widget.getContext();
activity.setDraftText(cmd + " ");
} catch (Exception e) {
e.printStackTrace();
}
} else if (url.startsWith(PREFIX_MAILTO)) {
try {
String addr = prepareUrl(url);
Activity activity = (Activity) widget.getContext();
DcContext dcContext = DcHelper.getContext(activity);
int contactId = dcContext.lookupContactIdByAddr(addr);
DcContact contact = (contactId != 0)? dcContext.getContact(contactId) : null;
if (contact != null && !contact.isBlocked() && dcContext.getChatIdByContactId(contactId) != 0) {
openChat(activity, contact);
} else if (contact != null && dcContext.isChatmail()) {
DcHelper.showEncryptionRequiredDialog(activity, addr);
} else {
String nameNAddr = contact != null ? addr : contact.getNameNAddr();
new AlertDialog.Builder(activity)
.setMessage(activity.getString(R.string.ask_start_chat_with, nameNAddr))
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
openChat(activity, contact == null? dcContext.getContact(dcContext.createContact(null, addr)) : contact);
})
.setNegativeButton(R.string.cancel, null)
.show();
}
} catch (Exception e) {
e.printStackTrace();
}
} else if (Util.isInviteURL(url)) {
QrCodeHandler qrCodeHandler = new QrCodeHandler((Activity) widget.getContext());
qrCodeHandler.handleQrData(url);
} else {
IntentUtils.showBrowserIntent(widget.getContext(), url);
}
}
void onLongClick(View widget) {
Context context = widget.getContext();
if (url.startsWith(PREFIX_CMD)) {
Util.writeTextToClipboard(context, url.substring(PREFIX_CMD.length()));
Toast.makeText(context, context.getString(R.string.copied_to_clipboard), Toast.LENGTH_SHORT).show();
} else {
String preparedUrl = prepareUrl(url);
new AlertDialog.Builder(context)
.setTitle(preparedUrl)
.setItems(new CharSequence[]{
context.getString(R.string.menu_copy_to_clipboard)
},
(dialogInterface, i) -> {
Util.writeTextToClipboard(context, preparedUrl);
Toast.makeText(context, context.getString(R.string.copied_to_clipboard), Toast.LENGTH_SHORT).show();
})
.setNegativeButton(R.string.cancel, null)
.show();
}
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.bgColor = highlightColor;
ds.setUnderlineText(!isHighlighted);
}
void setHighlighted(boolean highlighted, @ColorInt int highlightColor) {
this.isHighlighted = highlighted;
this.highlightColor = highlightColor;
}
private String prepareUrl(String url) {
if (url.startsWith(PREFIX_MAILTO)) {
return url.substring(PREFIX_MAILTO.length());
} else if (url.startsWith(PREFIX_TEL)) {
return url.substring(PREFIX_TEL.length());
}
return url;
}
}