Skip to content

Commit fe5fc41

Browse files
AsamKmoxie0
authored andcommitted
Save drafts for recipients without an existing thread
- Save drafts without thread in draft database - Clear drafts when deleting conversation(s), otherwise the drafts stay in the database and will reappear when a thread with the same threadId is created Closes signalapp#1510
1 parent 20d43bb commit fe5fc41

3 files changed

Lines changed: 44 additions & 15 deletions

File tree

src/org/thoughtcrime/securesms/ConversationActivity.java

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import android.content.DialogInterface;
2424
import android.content.Intent;
2525
import android.content.IntentFilter;
26-
import android.graphics.Bitmap;
27-
import android.graphics.drawable.BitmapDrawable;
2826
import android.net.Uri;
2927
import android.os.AsyncTask;
3028
import android.os.Build;
@@ -92,7 +90,6 @@
9290
import org.thoughtcrime.securesms.sms.OutgoingEndSessionMessage;
9391
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
9492
import org.thoughtcrime.securesms.util.BitmapDecodingException;
95-
import org.thoughtcrime.securesms.util.BitmapUtil;
9693
import org.thoughtcrime.securesms.util.CharacterCalculator;
9794
import org.thoughtcrime.securesms.util.Dialogs;
9895
import org.thoughtcrime.securesms.util.DirectoryHelper;
@@ -538,6 +535,7 @@ private void handleDeleteThread() {
538535
public void onClick(DialogInterface dialog, int which) {
539536
if (threadId > 0) {
540537
DatabaseFactory.getThreadDatabase(ConversationActivity.this).deleteConversation(threadId);
538+
threadId = -1;
541539
finish();
542540
}
543541
}
@@ -919,28 +917,34 @@ private Drafts getDraftsForCurrentState() {
919917
}
920918

921919
private void saveDraft() {
922-
if (this.threadId <= 0 || this.recipients == null || this.recipients.isEmpty())
920+
if (this.recipients == null || this.recipients.isEmpty())
923921
return;
924922

925-
final Drafts drafts = getDraftsForCurrentState();
926-
final long thisThreadId = this.threadId;
927-
final MasterSecret thisMasterSecret = this.masterSecret.parcelClone();
923+
final Drafts drafts = getDraftsForCurrentState();
924+
final long thisThreadId = this.threadId;
925+
final MasterSecret thisMasterSecret = this.masterSecret.parcelClone();
926+
final int thisDistributionType = this.distributionType;
928927

929-
new AsyncTask<Void, Void, Void>() {
928+
new AsyncTask<Long, Void, Void>() {
930929
@Override
931-
protected Void doInBackground(Void... params) {
932-
MasterCipher masterCipher = new MasterCipher(thisMasterSecret);
933-
DatabaseFactory.getDraftDatabase(ConversationActivity.this).insertDrafts(masterCipher, thisThreadId, drafts);
930+
protected Void doInBackground(Long... params) {
934931
ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(ConversationActivity.this);
932+
DraftDatabase draftDatabase = DatabaseFactory.getDraftDatabase(ConversationActivity.this);
933+
long threadId = params[0];
934+
935935
if (drafts.size() > 0) {
936-
threadDatabase.updateSnippet(thisThreadId, drafts.getSnippet(ConversationActivity.this), Types.BASE_DRAFT_TYPE);
937-
} else {
938-
threadDatabase.update(thisThreadId);
936+
if (threadId == -1) threadId = threadDatabase.getThreadIdFor(getRecipients(), thisDistributionType);
937+
938+
draftDatabase.insertDrafts(new MasterCipher(thisMasterSecret), threadId, drafts);
939+
threadDatabase.updateSnippet(threadId, drafts.getSnippet(ConversationActivity.this), Types.BASE_DRAFT_TYPE);
940+
} else if (threadId > 0) {
941+
threadDatabase.update(threadId);
939942
}
943+
940944
MemoryCleaner.clean(thisMasterSecret);
941945
return null;
942946
}
943-
}.execute();
947+
}.execute(thisThreadId);
944948
}
945949

946950
private void calculateCharactersRemaining() {

src/org/thoughtcrime/securesms/database/DraftDatabase.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
import java.util.LinkedList;
1515
import java.util.List;
16+
import java.util.Set;
1617

1718
public class DraftDatabase extends Database {
1819

@@ -51,6 +52,27 @@ public void clearDrafts(long threadId) {
5152
db.delete(TABLE_NAME, THREAD_ID + " = ?", new String[] {threadId+""});
5253
}
5354

55+
public void clearDrafts(Set<Long> threadIds) {
56+
SQLiteDatabase db = databaseHelper.getWritableDatabase();
57+
StringBuilder where = new StringBuilder();
58+
List<String> arguments = new LinkedList<>();
59+
60+
for (long threadId : threadIds) {
61+
where.append(" OR ")
62+
.append(THREAD_ID)
63+
.append(" = ?");
64+
65+
arguments.add(String.valueOf(threadId));
66+
}
67+
68+
db.delete(TABLE_NAME, where.toString().substring(4), arguments.toArray(new String[0]));
69+
}
70+
71+
public void clearAllDrafts() {
72+
SQLiteDatabase db = databaseHelper.getWritableDatabase();
73+
db.delete(TABLE_NAME, null, null);
74+
}
75+
5476
public List<Draft> getDrafts(MasterCipher masterCipher, long threadId) {
5577
SQLiteDatabase db = databaseHelper.getReadableDatabase();
5678
List<Draft> results = new LinkedList<Draft>();

src/org/thoughtcrime/securesms/database/ThreadDatabase.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ public Cursor getConversationList() {
290290
public void deleteConversation(long threadId) {
291291
DatabaseFactory.getSmsDatabase(context).deleteThread(threadId);
292292
DatabaseFactory.getMmsDatabase(context).deleteThread(threadId);
293+
DatabaseFactory.getDraftDatabase(context).clearDrafts(threadId);
293294
deleteThread(threadId);
294295
notifyConversationListeners(threadId);
295296
notifyConversationListListeners();
@@ -299,6 +300,7 @@ public void deleteConversation(long threadId) {
299300
public void deleteConversations(Set<Long> selectedConversations) {
300301
DatabaseFactory.getSmsDatabase(context).deleteThreads(selectedConversations);
301302
DatabaseFactory.getMmsDatabase(context).deleteThreads(selectedConversations);
303+
DatabaseFactory.getDraftDatabase(context).clearDrafts(selectedConversations);
302304
deleteThreads(selectedConversations);
303305
notifyConversationListeners(selectedConversations);
304306
notifyConversationListListeners();
@@ -307,6 +309,7 @@ public void deleteConversations(Set<Long> selectedConversations) {
307309
public void deleteAllConversations() {
308310
DatabaseFactory.getSmsDatabase(context).deleteAllThreads();
309311
DatabaseFactory.getMmsDatabase(context).deleteAllThreads();
312+
DatabaseFactory.getDraftDatabase(context).clearAllDrafts();
310313
deleteAllThreads();
311314
}
312315

0 commit comments

Comments
 (0)