diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 90563b8c1..ea1745c25 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -1694,6 +1694,12 @@ JNIEXPORT jlong Java_com_b44t_messenger_DcMsg_getQuotedMsgCPtr(JNIEnv *env, jobj } +JNIEXPORT jlong Java_com_b44t_messenger_DcMsg_getParentCPtr(JNIEnv *env, jobject obj) +{ + return (jlong)dc_msg_get_parent(get_dc_msg(env, obj)); +} + + JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getError(JNIEnv *env, jobject obj) { char* temp = dc_msg_get_error(get_dc_msg(env, obj)); diff --git a/src/com/b44t/messenger/DcMsg.java b/src/com/b44t/messenger/DcMsg.java index fbf12605d..0e02f16d3 100644 --- a/src/com/b44t/messenger/DcMsg.java +++ b/src/com/b44t/messenger/DcMsg.java @@ -156,6 +156,11 @@ public class DcMsg { 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."); @@ -220,5 +225,6 @@ public class DcMsg { private native long getSummaryCPtr (long chatCPtr); private native void setQuoteCPtr (long quoteCPtr); private native long getQuotedMsgCPtr (); + private native long getParentCPtr (); private native String getWebxdcInfoJson (); }; diff --git a/src/org/thoughtcrime/securesms/ConversationFragment.java b/src/org/thoughtcrime/securesms/ConversationFragment.java index 9da8769e3..c7c3dd5e1 100644 --- a/src/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/org/thoughtcrime/securesms/ConversationFragment.java @@ -556,6 +556,27 @@ public class ConversationFragment extends MessageSelectorFragment Log.e(TAG, "msgId {} not found for scrolling"); } } + + private void scrollMaybeSmoothToMsgId(final int msgId) { + LinearLayoutManager layout = ((LinearLayoutManager) list.getLayoutManager()); + boolean smooth = false; + ConversationAdapter adapter = (ConversationAdapter) list.getAdapter(); + if (adapter == null) return; + int position = adapter.msgIdToPosition(msgId); + if (layout != null) { + int distance1 = Math.abs(position - layout.findFirstVisibleItemPosition()); + int distance2 = Math.abs(position - layout.findLastVisibleItemPosition()); + int distance = Math.min(distance1, distance2); + smooth = distance < 15; + Log.i(TAG, "Scrolling to destMsg, smoth: " + smooth + ", distance: " + distance); + } + + if (position != -1) { + scrollAndHighlight(position, smooth); + } else { + Log.e(TAG, "msgId not found for scrolling: " + msgId); + } + } public interface ConversationFragmentListener { void handleReplyMessage(DcMsg messageRecord); @@ -758,6 +779,9 @@ public class ConversationFragment extends MessageSelectorFragment else if(DozeReminder.isDozeReminderMsg(getContext(), messageRecord)) { DozeReminder.dozeReminderTapped(getContext()); } + else if(messageRecord.isInfo() && messageRecord.getParent() != null) { + scrollMaybeSmoothToMsgId(messageRecord.getParent().getId()); + } else { String self_mail = dcContext.getConfig("configured_mail_user"); if (self_mail != null && !self_mail.isEmpty() @@ -802,24 +826,7 @@ public class ConversationFragment extends MessageSelectorFragment Log.e(TAG, "Activity was null"); } } else { - LinearLayoutManager layout = ((LinearLayoutManager) list.getLayoutManager()); - boolean smooth = false; - ConversationAdapter adapter = (ConversationAdapter) list.getAdapter(); - if (adapter == null) return; - int position = adapter.msgIdToPosition(quoted.getId()); - if (layout != null) { - int distance1 = Math.abs(position - layout.findFirstVisibleItemPosition()); - int distance2 = Math.abs(position - layout.findLastVisibleItemPosition()); - int distance = Math.min(distance1, distance2); - smooth = distance < 15; - Log.i(TAG, "Scrolling to quote, smoth: " + smooth + ", distance: " + distance); - } - - if (position != -1) { - scrollAndHighlight(position, smooth); - } else { - Log.e(TAG, "msgId not found for scrolling: " + quoted.getId()); - } + scrollMaybeSmoothToMsgId(quoted.getId()); } }