diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 173289afd..72232c5f4 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -452,11 +452,15 @@ JNIEXPORT jint Java_com_b44t_messenger_DcContext_removeContactFromChat(JNIEnv *e } -JNIEXPORT void Java_com_b44t_messenger_DcContext_setDraft(JNIEnv *env, jobject obj, jint chat_id, jstring draft /* NULL=delete */) +JNIEXPORT void Java_com_b44t_messenger_DcContext_setDraft(JNIEnv *env, jobject obj, jint chat_id, jobject msg /* NULL=delete */) { - CHAR_REF(draft); - dc_set_text_draft(get_dc_context(env, obj), chat_id, draftPtr /* NULL=delete */); - CHAR_UNREF(draft); + dc_set_draft(get_dc_context(env, obj), chat_id, get_dc_msg(env, msg)); +} + + +JNIEXPORT jlong Java_com_b44t_messenger_DcContext_getDraftCPtr(JNIEnv *env, jobject obj, jint chat_id) +{ + return (jlong)dc_get_draft(get_dc_context(env, obj), chat_id); } @@ -834,21 +838,6 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isVerified(JNIEnv *env, jobjec } -JNIEXPORT jstring Java_com_b44t_messenger_DcChat_getDraft(JNIEnv *env, jobject obj) /* returns NULL for "no draft" */ -{ - const char* temp = dc_chat_get_text_draft(get_dc_chat(env, obj)); - jstring ret = temp? JSTRING_NEW(temp) : NULL; - free(temp); - return ret; -} - - -JNIEXPORT jlong Java_com_b44t_messenger_DcChat_getDraftTimestamp(JNIEnv *env, jobject obj) -{ - return JTIMESTAMP(dc_chat_get_draft_timestamp(get_dc_chat(env, obj))); -} - - JNIEXPORT jintArray Java_com_b44t_messenger_DcContext_getChatMedia(JNIEnv *env, jobject obj, jint chat_id, jint msg_type, jint or_msg_type) { dc_array_t* ca = dc_get_chat_media(get_dc_context(env, obj), chat_id, msg_type, or_msg_type); @@ -900,12 +889,14 @@ JNIEXPORT jintArray Java_com_b44t_messenger_DcContext_getChatContacts(JNIEnv *en static dc_msg_t* get_dc_msg(JNIEnv *env, jobject obj) { static jfieldID fid = 0; - if (fid==0) { - jclass cls = (*env)->GetObjectClass(env, obj); - fid = (*env)->GetFieldID(env, cls, "msgCPtr", "J" /*Signature, J=long*/); - } - if (fid) { - return (dc_msg_t*)(*env)->GetLongField(env, obj, fid); + if (env && obj) { + if (fid==0) { + jclass cls = (*env)->GetObjectClass(env, obj); + fid = (*env)->GetFieldID(env, cls, "msgCPtr", "J" /*Signature, J=long*/); + } + if (fid) { + return (dc_msg_t*)(*env)->GetLongField(env, obj, fid); + } } return NULL; } diff --git a/src/com/b44t/messenger/DcChat.java b/src/com/b44t/messenger/DcChat.java index 28128c720..6c5a12b78 100644 --- a/src/com/b44t/messenger/DcChat.java +++ b/src/com/b44t/messenger/DcChat.java @@ -28,8 +28,6 @@ public class DcChat { public native boolean isUnpromoted (); public native boolean isSelfTalk (); public native boolean isVerified (); - public native String getDraft (); - public native long getDraftTimestamp (); // working with raw c-data private long chatCPtr; // CAVE: the name is referenced in the JNI diff --git a/src/com/b44t/messenger/DcContext.java b/src/com/b44t/messenger/DcContext.java index 55e8e6ecd..eb201813c 100644 --- a/src/com/b44t/messenger/DcContext.java +++ b/src/com/b44t/messenger/DcContext.java @@ -1,6 +1,7 @@ package com.b44t.messenger; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; public class DcContext { @@ -106,7 +107,8 @@ public class DcContext { public native boolean isContactInChat (int chat_id, int contact_id); public native int addContactToChat (int chat_id, int contact_id); public native int removeContactFromChat(int chat_id, int contact_id); - public native void setDraft (int chat_id, String draft/*null=delete*/); + public native void setDraft (int chat_id, DcMsg msg/*null=delete*/); + public @Nullable DcMsg getDraft (int chat_id) { return new DcMsg(getDraftCPtr(chat_id)); } public native int setChatName (int chat_id, String name); public native int setChatProfileImage (int chat_id, String name); public native int[] getChatMsgs (int chat_id, int flags, int marker1before); @@ -146,5 +148,6 @@ public class DcContext { private native long getChatlistCPtr (int listflags, String query, int queryId); private native long getChatCPtr (int chat_id); private native long getMsgCPtr (int id); + private native long getDraftCPtr (int id); private native long getContactCPtr (int id); } diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index f23e5ee99..d097e0563 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -655,61 +655,63 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity private ListenableFuture initializeDraftFromDatabase() { SettableFuture future = new SettableFuture<>(); - new AsyncTask>() { + new AsyncTask() { @Override - protected List doInBackground(Void... params) { - DraftDatabase draftDatabase = DatabaseFactory.getDraftDatabase(ConversationActivity.this); - List results = draftDatabase.getDrafts(threadId); - - draftDatabase.clearDrafts(threadId); - - return results; + protected DcMsg doInBackground(Void... params) { + return dcContext.getDraft(threadId); } @Override - protected void onPostExecute(List drafts) { - AtomicInteger draftsRemaining = new AtomicInteger(drafts.size()); - AtomicBoolean success = new AtomicBoolean(false); - ListenableFuture.Listener listener = new AssertedSuccessListener() { - @Override - public void onSuccess(Boolean result) { - success.compareAndSet(false, result); - - if (draftsRemaining.decrementAndGet() <= 0) { - future.set(success.get()); - } - } - }; - - for (Draft draft : drafts) { - try { - switch (draft.getType()) { - case Draft.TEXT: - composeText.setText(draft.getValue()); - listener.onSuccess(true); - break; - case Draft.LOCATION: - attachmentManager.setLocation(SignalPlace.deserialize(draft.getValue()), getCurrentMediaConstraints()).addListener(listener); - break; - case Draft.IMAGE: - setMedia(Uri.parse(draft.getValue()), MediaType.IMAGE).addListener(listener); - break; - case Draft.AUDIO: - setMedia(Uri.parse(draft.getValue()), MediaType.AUDIO).addListener(listener); - break; - case Draft.VIDEO: - setMedia(Uri.parse(draft.getValue()), MediaType.VIDEO).addListener(listener); - break; - case Draft.QUOTE: - SettableFuture quoteResult = new SettableFuture<>(); - new QuoteRestorationTask(draft.getValue(), quoteResult).execute(); - quoteResult.addListener(listener); - break; - } - } catch (IOException e) { - Log.w(TAG, e); + protected void onPostExecute(DcMsg draft) { + if(draft!=null) { + String text = draft.getText(); + if(!text.isEmpty()) { + composeText.setText(text); + composeText.setSelection(composeText.getText().length()); } } +// AtomicInteger draftsRemaining = new AtomicInteger(drafts.size()); +// AtomicBoolean success = new AtomicBoolean(false); +// ListenableFuture.Listener listener = new AssertedSuccessListener() { +// @Override +// public void onSuccess(Boolean result) { +// success.compareAndSet(false, result); +// +// if (draftsRemaining.decrementAndGet() <= 0) { +// future.set(success.get()); +// } +// } +// }; +// +// for (Draft draft : drafts) { +// try { +// switch (draft.getType()) { +// case Draft.TEXT: +// composeText.setText(draft.getValue()); +// listener.onSuccess(true); +// break; +// case Draft.LOCATION: +// attachmentManager.setLocation(SignalPlace.deserialize(draft.getValue()), getCurrentMediaConstraints()).addListener(listener); +// break; +// case Draft.IMAGE: +// setMedia(Uri.parse(draft.getValue()), MediaType.IMAGE).addListener(listener); +// break; +// case Draft.AUDIO: +// setMedia(Uri.parse(draft.getValue()), MediaType.AUDIO).addListener(listener); +// break; +// case Draft.VIDEO: +// setMedia(Uri.parse(draft.getValue()), MediaType.VIDEO).addListener(listener); +// break; +// case Draft.QUOTE: +// SettableFuture quoteResult = new SettableFuture<>(); +// new QuoteRestorationTask(draft.getValue(), quoteResult).execute(); +// quoteResult.addListener(listener); +// break; +// } +// } catch (IOException e) { +// Log.w(TAG, e); +// } +// } updateToggleButtonState(); } @@ -963,7 +965,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity if (drafts.size() > 0 && threadId>0) { // todo: the following line only works for text drafts - dcContext.setDraft(dcChat.getId(), drafts.getSnippet(dcContext.context)); + DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT); + msg.setText(drafts.getSnippet(dcContext.context)); + dcContext.setDraft(dcChat.getId(), msg); } else if (threadId > 0) { dcContext.setDraft(dcChat.getId(), null); }