diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index a0fecd904..5b45365c2 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -136,6 +136,7 @@ import static org.briarproject.briar.android.conversation.ImageActivity.ITEM_ID; import static org.briarproject.briar.android.conversation.ImageActivity.NAME; import static org.briarproject.briar.android.util.UiUtils.observeOnce; import static org.briarproject.briar.android.view.AuthorView.setAvatar; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_ATTACHMENTS_PER_MESSAGE; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH; import static org.briarproject.briar.api.messaging.PrivateMessageFormat.TEXT_IMAGES_AUTO_DELETE; @@ -284,6 +285,9 @@ public class ConversationActivity extends BriarActivity textInputView.setMaxTextLength(MAX_PRIVATE_MESSAGE_TEXT_LENGTH); textInputView.setReady(false); textInputView.setOnKeyboardShownListener(this::scrollToBottom); + + viewModel.getAutoDeleteTimer().observe(this, timer -> + sendController.setAutoDeleteTimer(timer)); } private void scrollToBottom() { @@ -370,7 +374,10 @@ public class ConversationActivity extends BriarActivity // show auto-delete timer setting only, if contacts supports it observeOnce(viewModel.getPrivateMessageFormat(), this, format -> { boolean visible = format == TEXT_IMAGES_AUTO_DELETE; - menu.findItem(R.id.action_auto_delete).setVisible(visible); + MenuItem item = menu.findItem(R.id.action_auto_delete); + item.setVisible(visible); + viewModel.getAutoDeleteTimer().observe(this, timer -> + item.setChecked(timer != NO_AUTO_DELETE_TIMER)); }); return super.onCreateOptionsMenu(menu); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java index 57e48aa88..815849317 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java @@ -34,6 +34,7 @@ import org.briarproject.briar.android.viewmodel.LiveEvent; import org.briarproject.briar.android.viewmodel.MutableLiveEvent; import org.briarproject.briar.api.attachment.AttachmentHeader; import org.briarproject.briar.api.autodelete.AutoDeleteManager; +import org.briarproject.briar.api.autodelete.event.AutoDeleteTimerMirroredEvent; import org.briarproject.briar.api.avatar.event.AvatarUpdatedEvent; import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.identity.AuthorInfo; @@ -110,8 +111,10 @@ public class ConversationViewModel extends DbViewModel new MutableLiveEvent<>(); private final MutableLiveData showIntroductionAction = new MutableLiveData<>(); - private final MutableLiveData contactDeleted = + private final MutableLiveData autoDeleteTimer = new MutableLiveData<>(); + private final MutableLiveData contactDeleted = + new MutableLiveData<>(false); private final MutableLiveEvent addedHeader = new MutableLiveEvent<>(); @@ -145,8 +148,6 @@ public class ConversationViewModel extends DbViewModel this.conversationManager = conversationManager; messagingGroupId = map(contactItem, c -> messagingManager.getContactGroup(c.getContact()).getId()); - contactDeleted.setValue(false); - eventBus.addListener(this); } @@ -166,6 +167,11 @@ public class ConversationViewModel extends DbViewModel runOnDbThread(() -> attachmentRetriever .loadAttachmentItem(a.getMessageId())); } + } else if (e instanceof AutoDeleteTimerMirroredEvent) { + AutoDeleteTimerMirroredEvent a = (AutoDeleteTimerMirroredEvent) e; + if (a.getContactId().equals(contactId)) { + autoDeleteTimer.postValue(a.getNewTimer()); + } } else if (e instanceof AvatarUpdatedEvent) { AvatarUpdatedEvent a = (AvatarUpdatedEvent) e; if (a.getContactId().equals(contactId)) { @@ -215,6 +221,11 @@ public class ConversationViewModel extends DbViewModel contactItem.postValue(new ContactItem(c, authorInfo)); logDuration(LOG, "Loading contact", start); start = now(); + long timer = db.transactionWithResult(true, txn -> + autoDeleteManager.getAutoDeleteTimer(txn, contactId)); + autoDeleteTimer.postValue(timer); + logDuration(LOG, "Getting auto-delete timer", start); + start = now(); checkFeaturesAndOnboarding(contactId); logDuration(LOG, "Checking for image support", start); } catch (NoSuchContactException e) { @@ -377,6 +388,7 @@ public class ConversationViewModel extends DbViewModel try { db.transaction(false, txn -> autoDeleteManager.setAutoDeleteTimer(txn, c, timer)); + autoDeleteTimer.postValue(timer); } catch (DbException e) { logException(LOG, WARNING, e); } @@ -411,6 +423,10 @@ public class ConversationViewModel extends DbViewModel return showIntroductionAction; } + LiveData getAutoDeleteTimer() { + return autoDeleteTimer; + } + LiveData isContactDeleted() { return contactDeleted; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/TextSendController.java b/briar-android/src/main/java/org/briarproject/briar/android/view/TextSendController.java index e070a3dd4..2e510132b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/view/TextSendController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/view/TextSendController.java @@ -17,6 +17,7 @@ import androidx.annotation.UiThread; import static com.google.android.material.snackbar.Snackbar.LENGTH_SHORT; import static java.util.Collections.emptyList; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; @UiThread @NotNullByDefault @@ -29,6 +30,7 @@ public class TextSendController implements TextInputListener { protected boolean ready = true, textIsEmpty = true; private final boolean allowEmptyText; + private CharSequence defaultHint; public TextSendController(TextInputView v, SendListener listener, boolean allowEmptyText) { @@ -36,6 +38,7 @@ public class TextSendController implements TextInputListener { this.compositeSendButton.setOnClickListener(view -> onSendEvent()); this.listener = listener; this.textInput = v.getEmojiTextInputView(); + this.defaultHint = textInput.getHint(); this.allowEmptyText = allowEmptyText; } @@ -57,6 +60,18 @@ public class TextSendController implements TextInputListener { updateViewState(); } + public void setAutoDeleteTimer(long timer) { + // update hint + if (timer == NO_AUTO_DELETE_TIMER) { + textInput.setHint(defaultHint); + } else { + // this might need to be adapted when other screens + // besides the private conversation use auto delete timers + defaultHint = textInput.getHint(); + textInput.setHint(R.string.message_hint_auto_delete); + } + } + protected void updateViewState() { textInput.setEnabled(ready); compositeSendButton diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 420186272..ef571e9f7 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -157,7 +157,8 @@ Tap the + icon to add a contact No messages. No messages to show - Type message + New message + New disappearing message Add a caption (optional) Attach image Could not attach image(s)