Use a different hint in conversation when message will disappear

and keep the hint updated when the auto-delete timer changes
This commit is contained in:
Torsten Grote
2020-12-15 16:20:12 -03:00
parent 7a3be374c8
commit 9947a6aa1b
4 changed files with 44 additions and 5 deletions

View File

@@ -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.conversation.ImageActivity.NAME;
import static org.briarproject.briar.android.util.UiUtils.observeOnce; import static org.briarproject.briar.android.util.UiUtils.observeOnce;
import static org.briarproject.briar.android.view.AuthorView.setAvatar; 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_ATTACHMENTS_PER_MESSAGE;
import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH; 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; 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.setMaxTextLength(MAX_PRIVATE_MESSAGE_TEXT_LENGTH);
textInputView.setReady(false); textInputView.setReady(false);
textInputView.setOnKeyboardShownListener(this::scrollToBottom); textInputView.setOnKeyboardShownListener(this::scrollToBottom);
viewModel.getAutoDeleteTimer().observe(this, timer ->
sendController.setAutoDeleteTimer(timer));
} }
private void scrollToBottom() { private void scrollToBottom() {
@@ -370,7 +374,10 @@ public class ConversationActivity extends BriarActivity
// show auto-delete timer setting only, if contacts supports it // show auto-delete timer setting only, if contacts supports it
observeOnce(viewModel.getPrivateMessageFormat(), this, format -> { observeOnce(viewModel.getPrivateMessageFormat(), this, format -> {
boolean visible = format == TEXT_IMAGES_AUTO_DELETE; 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); return super.onCreateOptionsMenu(menu);

View File

@@ -34,6 +34,7 @@ import org.briarproject.briar.android.viewmodel.LiveEvent;
import org.briarproject.briar.android.viewmodel.MutableLiveEvent; import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
import org.briarproject.briar.api.attachment.AttachmentHeader; import org.briarproject.briar.api.attachment.AttachmentHeader;
import org.briarproject.briar.api.autodelete.AutoDeleteManager; 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.avatar.event.AvatarUpdatedEvent;
import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.identity.AuthorInfo; import org.briarproject.briar.api.identity.AuthorInfo;
@@ -110,8 +111,10 @@ public class ConversationViewModel extends DbViewModel
new MutableLiveEvent<>(); new MutableLiveEvent<>();
private final MutableLiveData<Boolean> showIntroductionAction = private final MutableLiveData<Boolean> showIntroductionAction =
new MutableLiveData<>(); new MutableLiveData<>();
private final MutableLiveData<Boolean> contactDeleted = private final MutableLiveData<Long> autoDeleteTimer =
new MutableLiveData<>(); new MutableLiveData<>();
private final MutableLiveData<Boolean> contactDeleted =
new MutableLiveData<>(false);
private final MutableLiveEvent<PrivateMessageHeader> addedHeader = private final MutableLiveEvent<PrivateMessageHeader> addedHeader =
new MutableLiveEvent<>(); new MutableLiveEvent<>();
@@ -145,8 +148,6 @@ public class ConversationViewModel extends DbViewModel
this.conversationManager = conversationManager; this.conversationManager = conversationManager;
messagingGroupId = map(contactItem, c -> messagingGroupId = map(contactItem, c ->
messagingManager.getContactGroup(c.getContact()).getId()); messagingManager.getContactGroup(c.getContact()).getId());
contactDeleted.setValue(false);
eventBus.addListener(this); eventBus.addListener(this);
} }
@@ -166,6 +167,11 @@ public class ConversationViewModel extends DbViewModel
runOnDbThread(() -> attachmentRetriever runOnDbThread(() -> attachmentRetriever
.loadAttachmentItem(a.getMessageId())); .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) { } else if (e instanceof AvatarUpdatedEvent) {
AvatarUpdatedEvent a = (AvatarUpdatedEvent) e; AvatarUpdatedEvent a = (AvatarUpdatedEvent) e;
if (a.getContactId().equals(contactId)) { if (a.getContactId().equals(contactId)) {
@@ -215,6 +221,11 @@ public class ConversationViewModel extends DbViewModel
contactItem.postValue(new ContactItem(c, authorInfo)); contactItem.postValue(new ContactItem(c, authorInfo));
logDuration(LOG, "Loading contact", start); logDuration(LOG, "Loading contact", start);
start = now(); 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); checkFeaturesAndOnboarding(contactId);
logDuration(LOG, "Checking for image support", start); logDuration(LOG, "Checking for image support", start);
} catch (NoSuchContactException e) { } catch (NoSuchContactException e) {
@@ -377,6 +388,7 @@ public class ConversationViewModel extends DbViewModel
try { try {
db.transaction(false, txn -> db.transaction(false, txn ->
autoDeleteManager.setAutoDeleteTimer(txn, c, timer)); autoDeleteManager.setAutoDeleteTimer(txn, c, timer));
autoDeleteTimer.postValue(timer);
} catch (DbException e) { } catch (DbException e) {
logException(LOG, WARNING, e); logException(LOG, WARNING, e);
} }
@@ -411,6 +423,10 @@ public class ConversationViewModel extends DbViewModel
return showIntroductionAction; return showIntroductionAction;
} }
LiveData<Long> getAutoDeleteTimer() {
return autoDeleteTimer;
}
LiveData<Boolean> isContactDeleted() { LiveData<Boolean> isContactDeleted() {
return contactDeleted; return contactDeleted;
} }

View File

@@ -17,6 +17,7 @@ import androidx.annotation.UiThread;
import static com.google.android.material.snackbar.Snackbar.LENGTH_SHORT; import static com.google.android.material.snackbar.Snackbar.LENGTH_SHORT;
import static java.util.Collections.emptyList; import static java.util.Collections.emptyList;
import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER;
@UiThread @UiThread
@NotNullByDefault @NotNullByDefault
@@ -29,6 +30,7 @@ public class TextSendController implements TextInputListener {
protected boolean ready = true, textIsEmpty = true; protected boolean ready = true, textIsEmpty = true;
private final boolean allowEmptyText; private final boolean allowEmptyText;
private CharSequence defaultHint;
public TextSendController(TextInputView v, SendListener listener, public TextSendController(TextInputView v, SendListener listener,
boolean allowEmptyText) { boolean allowEmptyText) {
@@ -36,6 +38,7 @@ public class TextSendController implements TextInputListener {
this.compositeSendButton.setOnClickListener(view -> onSendEvent()); this.compositeSendButton.setOnClickListener(view -> onSendEvent());
this.listener = listener; this.listener = listener;
this.textInput = v.getEmojiTextInputView(); this.textInput = v.getEmojiTextInputView();
this.defaultHint = textInput.getHint();
this.allowEmptyText = allowEmptyText; this.allowEmptyText = allowEmptyText;
} }
@@ -57,6 +60,18 @@ public class TextSendController implements TextInputListener {
updateViewState(); 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() { protected void updateViewState() {
textInput.setEnabled(ready); textInput.setEnabled(ready);
compositeSendButton compositeSendButton

View File

@@ -157,7 +157,8 @@
<string name="no_contacts_action">Tap the + icon to add a contact</string> <string name="no_contacts_action">Tap the + icon to add a contact</string>
<string name="date_no_private_messages">No messages.</string> <string name="date_no_private_messages">No messages.</string>
<string name="no_private_messages">No messages to show</string> <string name="no_private_messages">No messages to show</string>
<string name="message_hint">Type message</string> <string name="message_hint">New message</string>
<string name="message_hint_auto_delete">New disappearing message</string>
<string name="image_caption_hint">Add a caption (optional)</string> <string name="image_caption_hint">Add a caption (optional)</string>
<string name="image_attach">Attach image</string> <string name="image_attach">Attach image</string>
<string name="image_attach_error">Could not attach image(s)</string> <string name="image_attach_error">Could not attach image(s)</string>