mirror of
https://github.com/deltachat/deltachat-android.git
synced 2025-10-03 09:49:21 +02:00

* Don't always show the sender in notifications In 1:1 chats, don't prepend the sender name to every line. The exception is when the display name is not equal to the chat name (i.e. there is an OverwriteSenderDisplayname), in this case we still prepend it. * Always show the "~" before the sender name if it's overridden When we introduced this, I assume that we weren't sure whether we should do it and only showed it in some places. But I think it's nicer to show the same sender name everywhere, i.e. always add the "~".
254 lines
9.1 KiB
Java
254 lines
9.1 KiB
Java
package com.b44t.messenger;
|
|
|
|
import android.text.TextUtils;
|
|
|
|
import org.json.JSONObject;
|
|
|
|
import java.io.File;
|
|
import java.util.Set;
|
|
|
|
public class DcMsg {
|
|
|
|
public final static int DC_MSG_UNDEFINED = 0;
|
|
public final static int DC_MSG_TEXT = 10;
|
|
public final static int DC_MSG_IMAGE = 20;
|
|
public final static int DC_MSG_GIF = 21;
|
|
public final static int DC_MSG_STICKER = 23;
|
|
public final static int DC_MSG_AUDIO = 40;
|
|
public final static int DC_MSG_VOICE = 41;
|
|
public final static int DC_MSG_VIDEO = 50;
|
|
public final static int DC_MSG_FILE = 60;
|
|
public final static int DC_MSG_VIDEOCHAT_INVITATION = 70;
|
|
public final static int DC_MSG_WEBXDC = 80;
|
|
public final static int DC_MSG_VCARD = 90;
|
|
|
|
public final static int DC_INFO_UNKNOWN = 0;
|
|
public final static int DC_INFO_GROUP_NAME_CHANGED = 2;
|
|
public final static int DC_INFO_GROUP_IMAGE_CHANGED = 3;
|
|
public final static int DC_INFO_MEMBER_ADDED_TO_GROUP = 4;
|
|
public final static int DC_INFO_MEMBER_REMOVED_FROM_GROUP = 5;
|
|
public final static int DC_INFO_AUTOCRYPT_SETUP_MESSAGE = 6;
|
|
public final static int DC_INFO_SECURE_JOIN_MESSAGE = 7;
|
|
public final static int DC_INFO_LOCATIONSTREAMING_ENABLED = 8;
|
|
public final static int DC_INFO_LOCATION_ONLY = 9;
|
|
public final static int DC_INFO_EPHEMERAL_TIMER_CHANGED = 10;
|
|
public final static int DC_INFO_PROTECTION_ENABLED = 11;
|
|
public final static int DC_INFO_PROTECTION_DISABLED = 12;
|
|
public final static int DC_INFO_INVALID_UNENCRYPTED_MAIL = 13;
|
|
public final static int DC_INFO_WEBXDC_INFO_MESSAGE = 32;
|
|
|
|
public final static int DC_STATE_UNDEFINED = 0;
|
|
public final static int DC_STATE_IN_FRESH = 10;
|
|
public final static int DC_STATE_IN_NOTICED = 13;
|
|
public final static int DC_STATE_IN_SEEN = 16;
|
|
public final static int DC_STATE_OUT_PREPARING = 18;
|
|
public final static int DC_STATE_OUT_DRAFT = 19;
|
|
public final static int DC_STATE_OUT_PENDING = 20;
|
|
public final static int DC_STATE_OUT_FAILED = 24;
|
|
public final static int DC_STATE_OUT_DELIVERED = 26;
|
|
public final static int DC_STATE_OUT_MDN_RCVD = 28;
|
|
|
|
public final static int DC_DOWNLOAD_DONE = 0;
|
|
public final static int DC_DOWNLOAD_AVAILABLE = 10;
|
|
public final static int DC_DOWNLOAD_FAILURE = 20;
|
|
public final static int DC_DOWNLOAD_UNDECIPHERABLE = 30;
|
|
public final static int DC_DOWNLOAD_IN_PROGRESS = 1000;
|
|
|
|
public static final int DC_MSG_NO_ID = 0;
|
|
public final static int DC_MSG_ID_MARKER1 = 1;
|
|
public final static int DC_MSG_ID_DAYMARKER = 9;
|
|
|
|
public final static int DC_VIDEOCHATTYPE_UNKNOWN = 0;
|
|
public final static int DC_VIDEOCHATTYPE_BASICWEBRTC = 1;
|
|
|
|
private static final String TAG = DcMsg.class.getSimpleName();
|
|
|
|
public DcMsg(DcContext context, int viewtype) {
|
|
msgCPtr = context.createMsgCPtr(viewtype);
|
|
}
|
|
|
|
public DcMsg(long msgCPtr) {
|
|
this.msgCPtr = msgCPtr;
|
|
}
|
|
|
|
public boolean isOk() {
|
|
return msgCPtr != 0;
|
|
}
|
|
|
|
@Override
|
|
protected void finalize() throws Throwable {
|
|
super.finalize();
|
|
unrefMsgCPtr();
|
|
msgCPtr = 0;
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return this.getId();
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object other) {
|
|
if (other == null || !(other instanceof DcMsg)) {
|
|
return false;
|
|
}
|
|
|
|
DcMsg that = (DcMsg) other;
|
|
return this.getId()==that.getId() && this.getId()!=0;
|
|
}
|
|
|
|
/**
|
|
* If given a message, calculates the position of the message in the chat
|
|
*/
|
|
public static int getMessagePosition(DcMsg msg, DcContext dcContext) {
|
|
int msgs[] = dcContext.getChatMsgs(msg.getChatId(), 0, 0);
|
|
int startingPosition = -1;
|
|
int msgId = msg.getId();
|
|
for (int i = 0; i < msgs.length; i++) {
|
|
if (msgs[i] == msgId) {
|
|
startingPosition = msgs.length - 1 - i;
|
|
break;
|
|
}
|
|
}
|
|
return startingPosition;
|
|
}
|
|
|
|
public native int getId ();
|
|
public native String getText ();
|
|
public native String getSubject ();
|
|
public native long getTimestamp ();
|
|
public native long getSortTimestamp ();
|
|
public native boolean hasDeviatingTimestamp();
|
|
public native boolean hasLocation ();
|
|
public native int getType ();
|
|
public native int getInfoType ();
|
|
public native int getState ();
|
|
public native int getDownloadState ();
|
|
public native int getChatId ();
|
|
public native int getFromId ();
|
|
public native int getWidth (int def);
|
|
public native int getHeight (int def);
|
|
public native int getDuration ();
|
|
public native void lateFilingMediaSize(int width, int height, int duration);
|
|
public DcLot getSummary (DcChat chat) { return new DcLot(getSummaryCPtr(chat.getChatCPtr())); }
|
|
public native String getSummarytext (int approx_characters);
|
|
public native int showPadlock ();
|
|
public boolean hasFile () { String file = getFile(); return file!=null && !file.isEmpty(); }
|
|
public native String getFile ();
|
|
public native String getFilemime ();
|
|
public native String getFilename ();
|
|
public native long getFilebytes ();
|
|
public native byte[] getWebxdcBlob (String filename);
|
|
public JSONObject getWebxdcInfo () {
|
|
try {
|
|
return new JSONObject(getWebxdcInfoJson());
|
|
} catch(Exception e) {
|
|
e.printStackTrace();
|
|
return new JSONObject();
|
|
}
|
|
}
|
|
public native String getWebxdcHref ();
|
|
public native boolean isForwarded ();
|
|
public native boolean isInfo ();
|
|
public native boolean isSetupMessage ();
|
|
public native boolean hasHtml ();
|
|
public native String getSetupCodeBegin ();
|
|
public native String getVideochatUrl ();
|
|
public native int getVideochatType ();
|
|
public native boolean isIncreation ();
|
|
public native void setText (String text);
|
|
public native void setFile (String file, String filemime);
|
|
public native void setDimension (int width, int height);
|
|
public native void setDuration (int duration);
|
|
public native void setLocation (float latitude, float longitude);
|
|
public void setQuote (DcMsg quote) { setQuoteCPtr(quote.msgCPtr); }
|
|
public native String getQuotedText ();
|
|
public native String getError ();
|
|
public native String getOverrideSenderName();
|
|
|
|
public String getSenderName(DcContact dcContact) {
|
|
String overrideName = getOverrideSenderName();
|
|
if (overrideName != null) {
|
|
return "~" + overrideName;
|
|
} else {
|
|
return dcContact.getDisplayName();
|
|
}
|
|
}
|
|
|
|
public DcMsg getQuotedMsg () {
|
|
long cPtr = getQuotedMsgCPtr();
|
|
return cPtr != 0 ? new DcMsg(cPtr) : null;
|
|
}
|
|
|
|
public DcMsg getParent() {
|
|
long cPtr = getParentCPtr();
|
|
return cPtr != 0 ? new DcMsg(cPtr) : null;
|
|
}
|
|
|
|
public File getFileAsFile() {
|
|
if(getFile()==null)
|
|
throw new AssertionError("expected a file to be present.");
|
|
return new File(getFile());
|
|
}
|
|
|
|
// aliases and higher-level tools
|
|
public static int[] msgSetToIds(final Set<DcMsg> dcMsgs) {
|
|
if (dcMsgs == null) {
|
|
return new int[0];
|
|
}
|
|
int[] ids = new int[dcMsgs.size()];
|
|
int i = 0;
|
|
for (DcMsg dcMsg : dcMsgs) {
|
|
ids[i++] = dcMsg.getId();
|
|
}
|
|
return ids;
|
|
}
|
|
|
|
public boolean isOutgoing() {
|
|
return getFromId() == DcContact.DC_CONTACT_ID_SELF;
|
|
}
|
|
|
|
public String getDisplayBody() {
|
|
return getText();
|
|
}
|
|
|
|
public String getBody() {
|
|
return getText();
|
|
}
|
|
|
|
public long getDateReceived() {
|
|
return getTimestamp();
|
|
}
|
|
|
|
public boolean isFailed() {
|
|
return (getState() == DC_STATE_OUT_FAILED) || (!TextUtils.isEmpty(getError()));
|
|
}
|
|
public boolean isPreparing() {
|
|
return getState() == DC_STATE_OUT_PREPARING;
|
|
}
|
|
public boolean isSecure() {
|
|
return showPadlock()!=0;
|
|
}
|
|
public boolean isPending() {
|
|
return getState() == DC_STATE_OUT_PENDING;
|
|
}
|
|
public boolean isDelivered() {
|
|
return getState() == DC_STATE_OUT_DELIVERED;
|
|
}
|
|
public boolean isRemoteRead() {
|
|
return getState() == DC_STATE_OUT_MDN_RCVD;
|
|
}
|
|
public boolean isSeen() {
|
|
return getState() == DC_STATE_IN_SEEN;
|
|
}
|
|
|
|
|
|
// working with raw c-data
|
|
private long msgCPtr; // CAVE: the name is referenced in the JNI
|
|
private native void unrefMsgCPtr ();
|
|
private native long getSummaryCPtr (long chatCPtr);
|
|
private native void setQuoteCPtr (long quoteCPtr);
|
|
private native long getQuotedMsgCPtr ();
|
|
private native long getParentCPtr ();
|
|
private native String getWebxdcInfoJson ();
|
|
};
|