Show avatars for contacts outside AuthorView

This commit is contained in:
Torsten Grote
2020-11-24 16:03:00 -03:00
parent 1b0cb532de
commit 6e57d7bb42
23 changed files with 189 additions and 94 deletions

View File

@@ -2,6 +2,7 @@ package org.briarproject.briar.android.contact;
import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.identity.AuthorInfo;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -10,14 +11,17 @@ import javax.annotation.concurrent.Immutable;
public class ContactItem { public class ContactItem {
private final Contact contact; private final Contact contact;
private final AuthorInfo authorInfo;
private final boolean connected; private final boolean connected;
public ContactItem(Contact contact) { public ContactItem(Contact contact, AuthorInfo authorInfo) {
this(contact, false); this(contact, authorInfo, false);
} }
public ContactItem(Contact contact, boolean connected) { public ContactItem(Contact contact, AuthorInfo authorInfo,
boolean connected) {
this.contact = contact; this.contact = contact;
this.authorInfo = authorInfo;
this.connected = connected; this.connected = connected;
} }
@@ -25,6 +29,10 @@ public class ContactItem {
return contact; return contact;
} }
public AuthorInfo getAuthorInfo() {
return authorInfo;
}
boolean isConnected() { boolean isConnected() {
return connected; return connected;
} }

View File

@@ -14,9 +14,9 @@ import javax.annotation.Nullable;
import androidx.annotation.UiThread; import androidx.annotation.UiThread;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import im.delight.android.identicons.IdenticonDrawable;
import static org.briarproject.briar.android.util.UiUtils.getContactDisplayName; import static org.briarproject.briar.android.util.UiUtils.getContactDisplayName;
import static org.briarproject.briar.android.view.AuthorView.setAvatar;
@UiThread @UiThread
@NotNullByDefault @NotNullByDefault
@@ -41,8 +41,7 @@ public class ContactItemViewHolder<I extends ContactItem>
protected void bind(I item, @Nullable OnContactClickListener<I> listener) { protected void bind(I item, @Nullable OnContactClickListener<I> listener) {
Author author = item.getContact().getAuthor(); Author author = item.getContact().getAuthor();
avatar.setImageDrawable( setAvatar(avatar, author.getId(), item.getAuthorInfo());
new IdenticonDrawable(author.getId().getBytes()));
name.setText(getContactDisplayName(item.getContact())); name.setText(getContactDisplayName(item.getContact()));
if (bulb != null) { if (bulb != null) {

View File

@@ -23,6 +23,17 @@ import org.briarproject.briar.android.fragment.BaseFragment;
import org.briarproject.briar.android.keyagreement.ContactExchangeActivity; import org.briarproject.briar.android.keyagreement.ContactExchangeActivity;
import org.briarproject.briar.android.util.BriarSnackbarBuilder; import org.briarproject.briar.android.util.BriarSnackbarBuilder;
import org.briarproject.briar.android.view.BriarRecyclerView; import org.briarproject.briar.android.view.BriarRecyclerView;
import org.briarproject.briar.api.android.AndroidNotificationManager;
import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.identity.AuthorInfo;
import org.briarproject.briar.api.identity.AuthorManager;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Inject; import javax.inject.Inject;

View File

@@ -4,6 +4,7 @@ import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.client.MessageTracker.GroupCount; import org.briarproject.briar.api.client.MessageTracker.GroupCount;
import org.briarproject.briar.api.conversation.ConversationMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.identity.AuthorInfo;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -16,29 +17,29 @@ public class ContactListItem extends ContactItem
private final long timestamp; private final long timestamp;
private final int unread; private final int unread;
public ContactListItem(Contact contact, boolean connected, public ContactListItem(Contact contact, AuthorInfo authorInfo,
GroupCount count) { boolean connected, GroupCount count) {
super(contact, connected); super(contact, authorInfo, connected);
this.empty = count.getMsgCount() == 0; this.empty = count.getMsgCount() == 0;
this.unread = count.getUnreadCount(); this.unread = count.getUnreadCount();
this.timestamp = count.getLatestMsgTime(); this.timestamp = count.getLatestMsgTime();
} }
private ContactListItem(Contact contact, boolean connected, boolean empty, private ContactListItem(Contact contact, AuthorInfo authorInfo,
int unread, long timestamp) { boolean connected, boolean empty, int unread, long timestamp) {
super(contact, connected); super(contact, authorInfo, connected);
this.empty = empty; this.empty = empty;
this.timestamp = timestamp; this.timestamp = timestamp;
this.unread = unread; this.unread = unread;
} }
ContactListItem(ContactListItem item, boolean connected) { ContactListItem(ContactListItem item, boolean connected) {
this(item.getContact(), connected, item.empty, item.unread, this(item.getContact(), item.getAuthorInfo(), connected, item.empty,
item.timestamp); item.unread, item.timestamp);
} }
ContactListItem(ContactListItem item, ConversationMessageHeader h) { ContactListItem(ContactListItem item, ConversationMessageHeader h) {
this(item.getContact(), item.isConnected(), false, this(item.getContact(), item.getAuthorInfo(), item.isConnected(), false,
h.isRead() ? item.unread : item.unread + 1, h.isRead() ? item.unread : item.unread + 1,
Math.max(h.getTimestamp(), item.timestamp)); Math.max(h.getTimestamp(), item.timestamp));
} }

View File

@@ -29,6 +29,8 @@ import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.conversation.ConversationMessageHeader; import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent; import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent;
import org.briarproject.briar.api.identity.AuthorInfo;
import org.briarproject.briar.api.identity.AuthorManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -55,6 +57,7 @@ class ContactListViewModel extends DbViewModel implements EventListener {
getLogger(ContactListViewModel.class.getName()); getLogger(ContactListViewModel.class.getName());
private final ContactManager contactManager; private final ContactManager contactManager;
private final AuthorManager authorManager;
private final ConversationManager conversationManager; private final ConversationManager conversationManager;
private final ConnectionRegistry connectionRegistry; private final ConnectionRegistry connectionRegistry;
private final EventBus eventBus; private final EventBus eventBus;
@@ -71,11 +74,13 @@ class ContactListViewModel extends DbViewModel implements EventListener {
@DatabaseExecutor Executor dbExecutor, @DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager, TransactionManager db, LifecycleManager lifecycleManager, TransactionManager db,
AndroidExecutor androidExecutor, ContactManager contactManager, AndroidExecutor androidExecutor, ContactManager contactManager,
AuthorManager authorManager,
ConversationManager conversationManager, ConversationManager conversationManager,
ConnectionRegistry connectionRegistry, EventBus eventBus, ConnectionRegistry connectionRegistry, EventBus eventBus,
AndroidNotificationManager notificationManager) { AndroidNotificationManager notificationManager) {
super(application, dbExecutor, lifecycleManager, db, androidExecutor); super(application, dbExecutor, lifecycleManager, db, androidExecutor);
this.contactManager = contactManager; this.contactManager = contactManager;
this.authorManager = authorManager;
this.conversationManager = conversationManager; this.conversationManager = conversationManager;
this.connectionRegistry = connectionRegistry; this.connectionRegistry = connectionRegistry;
this.eventBus = eventBus; this.eventBus = eventBus;
@@ -99,10 +104,11 @@ class ContactListViewModel extends DbViewModel implements EventListener {
List<ContactListItem> contacts = new ArrayList<>(); List<ContactListItem> contacts = new ArrayList<>();
for (Contact c : contactManager.getContacts(txn)) { for (Contact c : contactManager.getContacts(txn)) {
ContactId id = c.getId(); ContactId id = c.getId();
AuthorInfo authorInfo = authorManager.getAuthorInfo(txn, c);
MessageTracker.GroupCount count = MessageTracker.GroupCount count =
conversationManager.getGroupCount(txn, id); conversationManager.getGroupCount(txn, id);
boolean connected = connectionRegistry.isConnected(c.getId()); boolean connected = connectionRegistry.isConnected(c.getId());
contacts.add(new ContactListItem(c, connected, count)); contacts.add(new ContactListItem(c, authorInfo, connected, count));
} }
Collections.sort(contacts); Collections.sort(contacts);
logDuration(LOG, "Full load", start); logDuration(LOG, "Full load", start);

View File

@@ -10,6 +10,8 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.briar.android.controller.DbControllerImpl; import org.briarproject.briar.android.controller.DbControllerImpl;
import org.briarproject.briar.android.controller.handler.ResultExceptionHandler; import org.briarproject.briar.android.controller.handler.ResultExceptionHandler;
import org.briarproject.briar.api.identity.AuthorInfo;
import org.briarproject.briar.api.identity.AuthorManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@@ -31,11 +33,14 @@ public abstract class ContactSelectorControllerImpl
Logger.getLogger(ContactSelectorControllerImpl.class.getName()); Logger.getLogger(ContactSelectorControllerImpl.class.getName());
private final ContactManager contactManager; private final ContactManager contactManager;
private final AuthorManager authorManager;
public ContactSelectorControllerImpl(@DatabaseExecutor Executor dbExecutor, public ContactSelectorControllerImpl(@DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager, ContactManager contactManager) { LifecycleManager lifecycleManager, ContactManager contactManager,
AuthorManager authorManager) {
super(dbExecutor, lifecycleManager); super(dbExecutor, lifecycleManager);
this.contactManager = contactManager; this.contactManager = contactManager;
this.authorManager = authorManager;
} }
@Override @Override
@@ -45,12 +50,13 @@ public abstract class ContactSelectorControllerImpl
try { try {
Collection<SelectableContactItem> contacts = new ArrayList<>(); Collection<SelectableContactItem> contacts = new ArrayList<>();
for (Contact c : contactManager.getContacts()) { for (Contact c : contactManager.getContacts()) {
AuthorInfo authorInfo = authorManager.getAuthorInfo(c);
// was this contact already selected? // was this contact already selected?
boolean selected = selection.contains(c.getId()); boolean selected = selection.contains(c.getId());
// can this contact be selected? // can this contact be selected?
boolean disabled = isDisabled(g, c); boolean disabled = isDisabled(g, c);
contacts.add(new SelectableContactItem(c, selected, contacts.add(new SelectableContactItem(c, authorInfo,
disabled)); selected, disabled));
} }
handler.onResult(contacts); handler.onResult(contacts);
} catch (DbException e) { } catch (DbException e) {

View File

@@ -3,6 +3,7 @@ package org.briarproject.briar.android.contactselection;
import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.android.contact.ContactItem; import org.briarproject.briar.android.contact.ContactItem;
import org.briarproject.briar.api.identity.AuthorInfo;
import javax.annotation.concurrent.NotThreadSafe; import javax.annotation.concurrent.NotThreadSafe;
@@ -10,11 +11,12 @@ import javax.annotation.concurrent.NotThreadSafe;
@NotNullByDefault @NotNullByDefault
public class SelectableContactItem extends ContactItem { public class SelectableContactItem extends ContactItem {
private boolean selected, disabled; private boolean selected;
private final boolean disabled;
public SelectableContactItem(Contact contact, boolean selected, public SelectableContactItem(Contact contact, AuthorInfo authorInfo,
boolean disabled) { boolean selected, boolean disabled) {
super(contact); super(contact, authorInfo);
this.selected = selected; this.selected = selected;
this.disabled = disabled; this.disabled = disabled;
} }

View File

@@ -21,7 +21,6 @@ import javax.inject.Inject;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDialogFragment; import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
@@ -59,7 +58,7 @@ public class AliasDialogFragment extends AppCompatDialogFragment {
setStyle(STYLE_NO_TITLE, R.style.BriarDialogTheme); setStyle(STYLE_NO_TITLE, R.style.BriarDialogTheme);
viewModel = ViewModelProviders.of(requireActivity(), viewModelFactory) viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(ConversationViewModel.class); .get(ConversationViewModel.class);
} }
@@ -72,7 +71,8 @@ public class AliasDialogFragment extends AppCompatDialogFragment {
aliasEditLayout = v.findViewById(R.id.aliasEditLayout); aliasEditLayout = v.findViewById(R.id.aliasEditLayout);
aliasEditText = v.findViewById(R.id.aliasEditText); aliasEditText = v.findViewById(R.id.aliasEditText);
Contact contact = requireNonNull(viewModel.getContact().getValue()); Contact contact = requireNonNull(viewModel.getContactItem().getValue())
.getContact();
String alias = contact.getAlias(); String alias = contact.getAlias();
aliasEditText.setText(alias); aliasEditText.setText(alias);
if (alias != null) aliasEditText.setSelection(alias.length()); if (alias != null) aliasEditText.setSelection(alias.length());

View File

@@ -31,6 +31,7 @@ import org.briarproject.bramble.api.db.NoSuchContactException;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.event.EventListener; import org.briarproject.bramble.api.event.EventListener;
import org.briarproject.bramble.api.identity.AuthorId;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent; import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent;
@@ -106,7 +107,6 @@ import androidx.recyclerview.selection.StorageStrategy;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import de.hdodenhof.circleimageview.CircleImageView; import de.hdodenhof.circleimageview.CircleImageView;
import im.delight.android.identicons.IdenticonDrawable;
import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt; import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION.SDK_INT;
@@ -134,6 +134,7 @@ import static org.briarproject.briar.android.conversation.ImageActivity.DATE;
import static org.briarproject.briar.android.conversation.ImageActivity.ITEM_ID; 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.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;
@@ -233,10 +234,10 @@ public class ConversationActivity extends BriarActivity
toolbarStatus = toolbar.findViewById(R.id.contactStatus); toolbarStatus = toolbar.findViewById(R.id.contactStatus);
toolbarTitle = toolbar.findViewById(R.id.contactName); toolbarTitle = toolbar.findViewById(R.id.contactName);
observeOnce(viewModel.getContactAuthorId(), this, authorId -> { observeOnce(viewModel.getContactItem(), this, c -> {
requireNonNull(authorId); requireNonNull(c);
toolbarAvatar.setImageDrawable( AuthorId authorId = c.getContact().getAuthor().getId();
new IdenticonDrawable(authorId.getBytes())); setAvatar(toolbarAvatar, authorId, c.getAuthorInfo());
}); });
viewModel.getContactDisplayName().observe(this, contactName -> { viewModel.getContactDisplayName().observe(this, contactName -> {
requireNonNull(contactName); requireNonNull(contactName);
@@ -366,7 +367,7 @@ public class ConversationActivity extends BriarActivity
} }
}); });
// enable alias action if available // enable alias action if available
observeOnce(viewModel.getContact(), this, contact -> observeOnce(viewModel.getContactItem(), this, contact ->
menu.findItem(R.id.action_set_alias).setEnabled(true)); menu.findItem(R.id.action_set_alias).setEnabled(true));
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);

View File

@@ -14,7 +14,6 @@ import org.briarproject.bramble.api.db.TransactionManager;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.event.EventListener; import org.briarproject.bramble.api.event.EventListener;
import org.briarproject.bramble.api.identity.AuthorId;
import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.Settings;
@@ -27,10 +26,13 @@ import org.briarproject.briar.android.attachment.AttachmentCreator;
import org.briarproject.briar.android.attachment.AttachmentManager; import org.briarproject.briar.android.attachment.AttachmentManager;
import org.briarproject.briar.android.attachment.AttachmentResult; import org.briarproject.briar.android.attachment.AttachmentResult;
import org.briarproject.briar.android.attachment.AttachmentRetriever; import org.briarproject.briar.android.attachment.AttachmentRetriever;
import org.briarproject.briar.android.contact.ContactItem;
import org.briarproject.briar.android.util.UiUtils; import org.briarproject.briar.android.util.UiUtils;
import org.briarproject.briar.android.viewmodel.DbViewModel; import org.briarproject.briar.android.viewmodel.DbViewModel;
import org.briarproject.briar.android.viewmodel.LiveEvent; 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.identity.AuthorInfo;
import org.briarproject.briar.api.identity.AuthorManager;
import org.briarproject.briar.api.media.AttachmentHeader; import org.briarproject.briar.api.media.AttachmentHeader;
import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.MessagingManager;
import org.briarproject.briar.api.messaging.PrivateMessage; import org.briarproject.briar.api.messaging.PrivateMessage;
@@ -49,8 +51,8 @@ import androidx.annotation.Nullable;
import androidx.annotation.UiThread; import androidx.annotation.UiThread;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Transformations;
import static androidx.lifecycle.Transformations.map;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger; import static java.util.logging.Logger.getLogger;
@@ -76,6 +78,7 @@ public class ConversationViewModel extends DbViewModel
private final EventBus eventBus; private final EventBus eventBus;
private final MessagingManager messagingManager; private final MessagingManager messagingManager;
private final ContactManager contactManager; private final ContactManager contactManager;
private final AuthorManager authorManager;
private final SettingsManager settingsManager; private final SettingsManager settingsManager;
private final PrivateMessageFactory privateMessageFactory; private final PrivateMessageFactory privateMessageFactory;
private final AttachmentRetriever attachmentRetriever; private final AttachmentRetriever attachmentRetriever;
@@ -83,11 +86,10 @@ public class ConversationViewModel extends DbViewModel
@Nullable @Nullable
private ContactId contactId = null; private ContactId contactId = null;
private final MutableLiveData<Contact> contact = new MutableLiveData<>(); private final MutableLiveData<ContactItem> contactItem =
private final LiveData<AuthorId> contactAuthorId = new MutableLiveData<>();
Transformations.map(contact, c -> c.getAuthor().getId()); private final LiveData<String> contactName = map(contactItem, c ->
private final LiveData<String> contactName = UiUtils.getContactDisplayName(c.getContact()));
Transformations.map(contact, UiUtils::getContactDisplayName);
private final LiveData<GroupId> messagingGroupId; private final LiveData<GroupId> messagingGroupId;
private final MutableLiveData<Boolean> imageSupport = private final MutableLiveData<Boolean> imageSupport =
new MutableLiveData<>(); new MutableLiveData<>();
@@ -111,6 +113,7 @@ public class ConversationViewModel extends DbViewModel
EventBus eventBus, EventBus eventBus,
MessagingManager messagingManager, MessagingManager messagingManager,
ContactManager contactManager, ContactManager contactManager,
AuthorManager authorManager,
SettingsManager settingsManager, SettingsManager settingsManager,
PrivateMessageFactory privateMessageFactory, PrivateMessageFactory privateMessageFactory,
AttachmentRetriever attachmentRetriever, AttachmentRetriever attachmentRetriever,
@@ -120,12 +123,13 @@ public class ConversationViewModel extends DbViewModel
this.eventBus = eventBus; this.eventBus = eventBus;
this.messagingManager = messagingManager; this.messagingManager = messagingManager;
this.contactManager = contactManager; this.contactManager = contactManager;
this.authorManager = authorManager;
this.settingsManager = settingsManager; this.settingsManager = settingsManager;
this.privateMessageFactory = privateMessageFactory; this.privateMessageFactory = privateMessageFactory;
this.attachmentRetriever = attachmentRetriever; this.attachmentRetriever = attachmentRetriever;
this.attachmentCreator = attachmentCreator; this.attachmentCreator = attachmentCreator;
messagingGroupId = Transformations messagingGroupId = map(contactItem, c ->
.map(contact, c -> messagingManager.getContactGroup(c).getId()); messagingManager.getContactGroup(c.getContact()).getId());
contactDeleted.setValue(false); contactDeleted.setValue(false);
eventBus.addListener(this); eventBus.addListener(this);
@@ -168,7 +172,8 @@ public class ConversationViewModel extends DbViewModel
try { try {
long start = now(); long start = now();
Contact c = contactManager.getContact(contactId); Contact c = contactManager.getContact(contactId);
contact.postValue(c); AuthorInfo authorInfo = authorManager.getAuthorInfo(c);
contactItem.postValue(new ContactItem(c, authorInfo));
logDuration(LOG, "Loading contact", start); logDuration(LOG, "Loading contact", start);
start = now(); start = now();
checkFeaturesAndOnboarding(contactId); checkFeaturesAndOnboarding(contactId);
@@ -319,12 +324,8 @@ public class ConversationViewModel extends DbViewModel
return attachmentRetriever; return attachmentRetriever;
} }
LiveData<Contact> getContact() { LiveData<ContactItem> getContactItem() {
return contact; return contactItem;
}
LiveData<AuthorId> getContactAuthorId() {
return contactAuthorId;
} }
LiveData<String> getContactDisplayName() { LiveData<String> getContactDisplayName() {

View File

@@ -21,6 +21,8 @@ import org.briarproject.briar.android.fragment.BaseFragment;
import org.briarproject.briar.android.view.BriarRecyclerView; import org.briarproject.briar.android.view.BriarRecyclerView;
import org.briarproject.briar.api.client.MessageTracker.GroupCount; import org.briarproject.briar.api.client.MessageTracker.GroupCount;
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.AuthorManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -49,10 +51,12 @@ public class ContactChooserFragment extends BaseFragment {
private ContactId contactId; private ContactId contactId;
// Fields that are accessed from background threads must be volatile // Fields that are accessed from background threads must be volatile
volatile Contact c1; private volatile Contact c1;
@Inject @Inject
volatile ContactManager contactManager; volatile ContactManager contactManager;
@Inject @Inject
volatile AuthorManager authorManager;
@Inject
volatile ConversationManager conversationManager; volatile ConversationManager conversationManager;
@Inject @Inject
volatile ConnectionRegistry connectionRegistry; volatile ConnectionRegistry connectionRegistry;
@@ -123,12 +127,14 @@ public class ContactChooserFragment extends BaseFragment {
if (c.getId().equals(contactId)) { if (c.getId().equals(contactId)) {
c1 = c; c1 = c;
} else { } else {
AuthorInfo authorInfo = authorManager.getAuthorInfo(c);
ContactId id = c.getId(); ContactId id = c.getId();
GroupCount count = GroupCount count =
conversationManager.getGroupCount(id); conversationManager.getGroupCount(id);
boolean connected = boolean connected =
connectionRegistry.isConnected(c.getId()); connectionRegistry.isConnected(c.getId());
contacts.add(new ContactListItem(c, connected, count)); contacts.add(new ContactListItem(c, authorInfo,
connected, count));
} }
} }
displayContacts(contacts); displayContacts(contacts);

View File

@@ -18,10 +18,13 @@ import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.contact.ContactItem;
import org.briarproject.briar.android.fragment.BaseFragment; import org.briarproject.briar.android.fragment.BaseFragment;
import org.briarproject.briar.android.view.TextInputView; import org.briarproject.briar.android.view.TextInputView;
import org.briarproject.briar.android.view.TextSendController; import org.briarproject.briar.android.view.TextSendController;
import org.briarproject.briar.android.view.TextSendController.SendListener; import org.briarproject.briar.android.view.TextSendController.SendListener;
import org.briarproject.briar.api.identity.AuthorInfo;
import org.briarproject.briar.api.identity.AuthorManager;
import org.briarproject.briar.api.introduction.IntroductionManager; import org.briarproject.briar.api.introduction.IntroductionManager;
import org.briarproject.briar.api.media.AttachmentHeader; import org.briarproject.briar.api.media.AttachmentHeader;
@@ -33,7 +36,6 @@ import javax.inject.Inject;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import de.hdodenhof.circleimageview.CircleImageView; import de.hdodenhof.circleimageview.CircleImageView;
import im.delight.android.identicons.IdenticonDrawable;
import static android.app.Activity.RESULT_OK; import static android.app.Activity.RESULT_OK;
import static android.view.View.GONE; import static android.view.View.GONE;
@@ -43,6 +45,7 @@ import static java.util.logging.Level.WARNING;
import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.briar.android.util.UiUtils.getContactDisplayName; import static org.briarproject.briar.android.util.UiUtils.getContactDisplayName;
import static org.briarproject.briar.android.util.UiUtils.hideSoftKeyboard; import static org.briarproject.briar.android.util.UiUtils.hideSoftKeyboard;
import static org.briarproject.briar.android.view.AuthorView.setAvatar;
import static org.briarproject.briar.api.introduction.IntroductionConstants.MAX_INTRODUCTION_TEXT_LENGTH; import static org.briarproject.briar.api.introduction.IntroductionConstants.MAX_INTRODUCTION_TEXT_LENGTH;
@MethodsNotNullByDefault @MethodsNotNullByDefault
@@ -65,6 +68,8 @@ public class IntroductionMessageFragment extends BaseFragment
@Inject @Inject
protected volatile ContactManager contactManager; protected volatile ContactManager contactManager;
@Inject @Inject
protected volatile AuthorManager authorManager;
@Inject
protected volatile IntroductionManager introductionManager; protected volatile IntroductionManager introductionManager;
public static IntroductionMessageFragment newInstance(int contactId1, public static IntroductionMessageFragment newInstance(int contactId1,
@@ -137,11 +142,16 @@ public class IntroductionMessageFragment extends BaseFragment
private void prepareToSetUpViews(int contactId1, int contactId2) { private void prepareToSetUpViews(int contactId1, int contactId2) {
introductionActivity.runOnDbThread(() -> { introductionActivity.runOnDbThread(() -> {
try { try {
Contact c1 = contactManager.getContact( Contact contact1 =
new ContactId(contactId1)); contactManager.getContact(new ContactId(contactId1));
Contact c2 = contactManager.getContact( Contact contact2 =
new ContactId(contactId2)); contactManager.getContact(new ContactId(contactId2));
boolean possible = introductionManager.canIntroduce(c1, c2); AuthorInfo a1 = authorManager.getAuthorInfo(contact1);
AuthorInfo a2 = authorManager.getAuthorInfo(contact2);
boolean possible =
introductionManager.canIntroduce(contact1, contact2);
ContactItem c1 = new ContactItem(contact1, a1);
ContactItem c2 = new ContactItem(contact2, a2);
setUpViews(c1, c2, possible); setUpViews(c1, c2, possible);
} catch (DbException e) { } catch (DbException e) {
logException(LOG, WARNING, e); logException(LOG, WARNING, e);
@@ -149,20 +159,20 @@ public class IntroductionMessageFragment extends BaseFragment
}); });
} }
private void setUpViews(Contact c1, Contact c2, boolean possible) { private void setUpViews(ContactItem c1, ContactItem c2, boolean possible) {
introductionActivity.runOnUiThreadUnlessDestroyed(() -> { introductionActivity.runOnUiThreadUnlessDestroyed(() -> {
contact1 = c1; contact1 = c1.getContact();
contact2 = c2; contact2 = c2.getContact();
// set avatars // set avatars
ui.avatar1.setImageDrawable(new IdenticonDrawable( setAvatar(ui.avatar1, c1.getContact().getAuthor().getId(),
c1.getAuthor().getId().getBytes())); c1.getAuthorInfo());
ui.avatar2.setImageDrawable(new IdenticonDrawable( setAvatar(ui.avatar2, c2.getContact().getAuthor().getId(),
c2.getAuthor().getId().getBytes())); c2.getAuthorInfo());
// set contact names // set contact names
ui.contactName1.setText(getContactDisplayName(c1)); ui.contactName1.setText(getContactDisplayName(c1.getContact()));
ui.contactName2.setText(getContactDisplayName(c2)); ui.contactName2.setText(getContactDisplayName(c2.getContact()));
// hide progress bar // hide progress bar
ui.progressBar.setVisibility(GONE); ui.progressBar.setVisibility(GONE);

View File

@@ -15,6 +15,7 @@ import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
import org.briarproject.briar.android.contactselection.ContactSelectorControllerImpl; import org.briarproject.briar.android.contactselection.ContactSelectorControllerImpl;
import org.briarproject.briar.android.controller.handler.ResultExceptionHandler; import org.briarproject.briar.android.controller.handler.ResultExceptionHandler;
import org.briarproject.briar.api.identity.AuthorManager;
import org.briarproject.briar.api.privategroup.GroupMessage; import org.briarproject.briar.api.privategroup.GroupMessage;
import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.GroupMessageFactory;
import org.briarproject.briar.api.privategroup.PrivateGroup; import org.briarproject.briar.api.privategroup.PrivateGroup;
@@ -59,12 +60,13 @@ class CreateGroupControllerImpl extends ContactSelectorControllerImpl
CreateGroupControllerImpl(@DatabaseExecutor Executor dbExecutor, CreateGroupControllerImpl(@DatabaseExecutor Executor dbExecutor,
@CryptoExecutor Executor cryptoExecutor, @CryptoExecutor Executor cryptoExecutor,
LifecycleManager lifecycleManager, ContactManager contactManager, LifecycleManager lifecycleManager, ContactManager contactManager,
IdentityManager identityManager, PrivateGroupFactory groupFactory, AuthorManager authorManager, IdentityManager identityManager,
PrivateGroupFactory groupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
PrivateGroupManager groupManager, PrivateGroupManager groupManager,
GroupInvitationFactory groupInvitationFactory, GroupInvitationFactory groupInvitationFactory,
GroupInvitationManager groupInvitationManager, Clock clock) { GroupInvitationManager groupInvitationManager, Clock clock) {
super(dbExecutor, lifecycleManager, contactManager); super(dbExecutor, lifecycleManager, contactManager, authorManager);
this.cryptoExecutor = cryptoExecutor; this.cryptoExecutor = cryptoExecutor;
this.contactManager = contactManager; this.contactManager = contactManager;
this.identityManager = identityManager; this.identityManager = identityManager;
@@ -176,7 +178,6 @@ class CreateGroupControllerImpl extends ContactSelectorControllerImpl
// Continue // Continue
} }
} }
//noinspection ConstantConditions
handler.onResult(null); handler.onResult(null);
} catch (DbException e) { } catch (DbException e) {
logException(LOG, WARNING, e); logException(LOG, WARNING, e);

View File

@@ -14,6 +14,8 @@ import org.briarproject.briar.android.controller.DbControllerImpl;
import org.briarproject.briar.android.controller.handler.ExceptionHandler; import org.briarproject.briar.android.controller.handler.ExceptionHandler;
import org.briarproject.briar.android.controller.handler.ResultExceptionHandler; import org.briarproject.briar.android.controller.handler.ResultExceptionHandler;
import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.ProtocolStateException;
import org.briarproject.briar.api.identity.AuthorInfo;
import org.briarproject.briar.api.identity.AuthorManager;
import org.briarproject.briar.api.privategroup.GroupMember; import org.briarproject.briar.api.privategroup.GroupMember;
import org.briarproject.briar.api.privategroup.PrivateGroupManager; import org.briarproject.briar.api.privategroup.PrivateGroupManager;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
@@ -45,17 +47,20 @@ class RevealContactsControllerImpl extends DbControllerImpl
private final PrivateGroupManager groupManager; private final PrivateGroupManager groupManager;
private final GroupInvitationManager groupInvitationManager; private final GroupInvitationManager groupInvitationManager;
private final ContactManager contactManager; private final ContactManager contactManager;
private final AuthorManager authorManager;
private final SettingsManager settingsManager; private final SettingsManager settingsManager;
@Inject @Inject
RevealContactsControllerImpl(@DatabaseExecutor Executor dbExecutor, RevealContactsControllerImpl(@DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager, PrivateGroupManager groupManager, LifecycleManager lifecycleManager, PrivateGroupManager groupManager,
GroupInvitationManager groupInvitationManager, GroupInvitationManager groupInvitationManager,
ContactManager contactManager, SettingsManager settingsManager) { ContactManager contactManager, AuthorManager authorManager,
SettingsManager settingsManager) {
super(dbExecutor, lifecycleManager); super(dbExecutor, lifecycleManager);
this.groupManager = groupManager; this.groupManager = groupManager;
this.groupInvitationManager = groupInvitationManager; this.groupInvitationManager = groupInvitationManager;
this.contactManager = contactManager; this.contactManager = contactManager;
this.authorManager = authorManager;
this.settingsManager = settingsManager; this.settingsManager = settingsManager;
} }
@@ -82,11 +87,12 @@ class RevealContactsControllerImpl extends DbControllerImpl
for (GroupMember m : members) { for (GroupMember m : members) {
for (Contact c : contacts) { for (Contact c : contacts) {
if (m.getAuthor().equals(c.getAuthor())) { if (m.getAuthor().equals(c.getAuthor())) {
AuthorInfo authorInfo = authorManager.getAuthorInfo(c);
boolean disabled = m.getVisibility() != INVISIBLE; boolean disabled = m.getVisibility() != INVISIBLE;
boolean selected = boolean selected =
disabled || selection.contains(c.getId()); disabled || selection.contains(c.getId());
items.add(new RevealableContactItem(c, selected, disabled, items.add(new RevealableContactItem(c, authorInfo, selected,
m.getVisibility())); disabled, m.getVisibility()));
} }
} }

View File

@@ -3,6 +3,7 @@ package org.briarproject.briar.android.privategroup.reveal;
import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.android.contactselection.SelectableContactItem; import org.briarproject.briar.android.contactselection.SelectableContactItem;
import org.briarproject.briar.api.identity.AuthorInfo;
import org.briarproject.briar.api.privategroup.Visibility; import org.briarproject.briar.api.privategroup.Visibility;
import javax.annotation.concurrent.NotThreadSafe; import javax.annotation.concurrent.NotThreadSafe;
@@ -13,9 +14,9 @@ class RevealableContactItem extends SelectableContactItem {
private final Visibility visibility; private final Visibility visibility;
RevealableContactItem(Contact contact, boolean selected, RevealableContactItem(Contact contact, AuthorInfo authorInfo,
boolean disabled, Visibility visibility) { boolean selected, boolean disabled, Visibility visibility) {
super(contact, selected, disabled); super(contact, authorInfo, selected, disabled);
this.visibility = visibility; this.visibility = visibility;
} }

View File

@@ -15,6 +15,7 @@ import org.briarproject.briar.android.contactselection.ContactSelectorController
import org.briarproject.briar.android.controller.handler.ExceptionHandler; import org.briarproject.briar.android.controller.handler.ExceptionHandler;
import org.briarproject.briar.api.blog.BlogSharingManager; import org.briarproject.briar.api.blog.BlogSharingManager;
import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.identity.AuthorManager;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@@ -42,9 +43,10 @@ class ShareBlogControllerImpl extends ContactSelectorControllerImpl
@Inject @Inject
ShareBlogControllerImpl(@DatabaseExecutor Executor dbExecutor, ShareBlogControllerImpl(@DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager, ContactManager contactManager, LifecycleManager lifecycleManager, ContactManager contactManager,
AuthorManager authorManager,
ConversationManager conversationManager, ConversationManager conversationManager,
BlogSharingManager blogSharingManager, Clock clock) { BlogSharingManager blogSharingManager, Clock clock) {
super(dbExecutor, lifecycleManager, contactManager); super(dbExecutor, lifecycleManager, contactManager, authorManager);
this.conversationManager = conversationManager; this.conversationManager = conversationManager;
this.blogSharingManager = blogSharingManager; this.blogSharingManager = blogSharingManager;
this.clock = clock; this.clock = clock;

View File

@@ -15,6 +15,7 @@ import org.briarproject.briar.android.contactselection.ContactSelectorController
import org.briarproject.briar.android.controller.handler.ExceptionHandler; import org.briarproject.briar.android.controller.handler.ExceptionHandler;
import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.conversation.ConversationManager;
import org.briarproject.briar.api.forum.ForumSharingManager; import org.briarproject.briar.api.forum.ForumSharingManager;
import org.briarproject.briar.api.identity.AuthorManager;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@@ -42,9 +43,10 @@ class ShareForumControllerImpl extends ContactSelectorControllerImpl
@Inject @Inject
ShareForumControllerImpl(@DatabaseExecutor Executor dbExecutor, ShareForumControllerImpl(@DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager, ContactManager contactManager, LifecycleManager lifecycleManager, ContactManager contactManager,
AuthorManager authorManager,
ConversationManager conversationManager, ConversationManager conversationManager,
ForumSharingManager forumSharingManager, Clock clock) { ForumSharingManager forumSharingManager, Clock clock) {
super(dbExecutor, lifecycleManager, contactManager); super(dbExecutor, lifecycleManager, contactManager, authorManager);
this.conversationManager = conversationManager; this.conversationManager = conversationManager;
this.forumSharingManager = forumSharingManager; this.forumSharingManager = forumSharingManager;
this.clock = clock; this.clock = clock;

View File

@@ -20,6 +20,8 @@ import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.BriarActivity; import org.briarproject.briar.android.activity.BriarActivity;
import org.briarproject.briar.android.contact.ContactItem; import org.briarproject.briar.android.contact.ContactItem;
import org.briarproject.briar.android.view.BriarRecyclerView; import org.briarproject.briar.android.view.BriarRecyclerView;
import org.briarproject.briar.api.identity.AuthorInfo;
import org.briarproject.briar.api.identity.AuthorManager;
import org.briarproject.briar.api.sharing.event.ContactLeftShareableEvent; import org.briarproject.briar.api.sharing.event.ContactLeftShareableEvent;
import java.util.ArrayList; import java.util.ArrayList;
@@ -42,6 +44,8 @@ import static org.briarproject.bramble.util.LogUtils.logException;
abstract class SharingStatusActivity extends BriarActivity abstract class SharingStatusActivity extends BriarActivity
implements EventListener { implements EventListener {
@Inject
AuthorManager authorManager;
@Inject @Inject
ConnectionRegistry connectionRegistry; ConnectionRegistry connectionRegistry;
@Inject @Inject
@@ -134,8 +138,9 @@ abstract class SharingStatusActivity extends BriarActivity
try { try {
List<ContactItem> contactItems = new ArrayList<>(); List<ContactItem> contactItems = new ArrayList<>();
for (Contact c : getSharedWith()) { for (Contact c : getSharedWith()) {
AuthorInfo authorInfo = authorManager.getAuthorInfo(c);
boolean online = connectionRegistry.isConnected(c.getId()); boolean online = connectionRegistry.isConnected(c.getId());
ContactItem item = new ContactItem(c, online); ContactItem item = new ContactItem(c, authorInfo, online);
contactItems.add(item); contactItems.add(item);
} }
displaySharedWith(contactItems); displaySharedWith(contactItems);

View File

@@ -11,6 +11,7 @@ import android.widget.TextView;
import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.DiskCacheStrategy;
import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.identity.AuthorId;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.android.conversation.glide.GlideApp; import org.briarproject.briar.android.conversation.glide.GlideApp;
import org.briarproject.briar.android.util.UiUtils; import org.briarproject.briar.android.util.UiUtils;
@@ -27,7 +28,6 @@ import im.delight.android.identicons.IdenticonDrawable;
import static android.content.Context.LAYOUT_INFLATER_SERVICE; import static android.content.Context.LAYOUT_INFLATER_SERVICE;
import static android.graphics.Typeface.BOLD; import static android.graphics.Typeface.BOLD;
import static android.util.TypedValue.COMPLEX_UNIT_PX; import static android.util.TypedValue.COMPLEX_UNIT_PX;
import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade;
import static org.briarproject.briar.android.util.UiUtils.getContactDisplayName; import static org.briarproject.briar.android.util.UiUtils.getContactDisplayName;
import static org.briarproject.briar.android.util.UiUtils.resolveAttribute; import static org.briarproject.briar.android.util.UiUtils.resolveAttribute;
import static org.briarproject.briar.api.identity.AuthorInfo.Status.NONE; import static org.briarproject.briar.api.identity.AuthorInfo.Status.NONE;
@@ -78,19 +78,7 @@ public class AuthorView extends ConstraintLayout {
public void setAuthor(Author author, AuthorInfo authorInfo) { public void setAuthor(Author author, AuthorInfo authorInfo) {
authorName authorName
.setText(getContactDisplayName(author, authorInfo.getAlias())); .setText(getContactDisplayName(author, authorInfo.getAlias()));
IdenticonDrawable identicon = setAvatar(avatar, author.getId(), authorInfo);
new IdenticonDrawable(author.getId().getBytes());
if (authorInfo.getAvatarHeader() == null) {
avatar.setImageDrawable(identicon);
} else {
GlideApp.with(avatar)
.load(authorInfo.getAvatarHeader())
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(identicon)
.transition(withCrossFade())
.into(avatar)
.waitForLayout();
}
if (authorInfo.getStatus() != NONE) { if (authorInfo.getStatus() != NONE) {
trustIndicator.setTrustLevel(authorInfo.getStatus()); trustIndicator.setTrustLevel(authorInfo.getStatus());
@@ -109,6 +97,22 @@ public class AuthorView extends ConstraintLayout {
requestLayout(); requestLayout();
} }
public static void setAvatar(ImageView v, AuthorId id, AuthorInfo info) {
IdenticonDrawable identicon = new IdenticonDrawable(id.getBytes());
if (info.getAvatarHeader() == null) {
GlideApp.with(v)
.clear(v);
v.setImageDrawable(identicon);
} else {
GlideApp.with(v)
.load(info.getAvatarHeader())
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(identicon)
.into(v)
.waitForLayout();
}
}
public void setDate(long date) { public void setDate(long date) {
this.date.setText(UiUtils.formatDate(getContext(), date)); this.date.setText(UiUtils.formatDate(getContext(), date));

View File

@@ -14,7 +14,7 @@
android:id="@+id/avatarContact1" android:id="@+id/avatarContact1"
style="@style/BriarAvatar" style="@style/BriarAvatar"
android:layout_width="42dp" android:layout_width="42dp"
android:layout_height="wrap_content" android:layout_height="42dp"
android:layout_margin="@dimen/margin_large" android:layout_margin="@dimen/margin_large"
app:layout_constraintEnd_toStartOf="@+id/introductionIcon" app:layout_constraintEnd_toStartOf="@+id/introductionIcon"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@@ -55,7 +55,7 @@
android:id="@+id/avatarContact2" android:id="@+id/avatarContact2"
style="@style/BriarAvatar" style="@style/BriarAvatar"
android:layout_width="42dp" android:layout_width="42dp"
android:layout_height="wrap_content" android:layout_height="42dp"
android:layout_margin="@dimen/margin_large" android:layout_margin="@dimen/margin_large"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/introductionIcon" app:layout_constraintStart_toEndOf="@+id/introductionIcon"

View File

@@ -30,7 +30,7 @@
<dimen name="listitem_selectable_picture_size">40dp</dimen> <dimen name="listitem_selectable_picture_size">40dp</dimen>
<dimen name="listitem_group_member_indentation">40dp</dimen> <dimen name="listitem_group_member_indentation">40dp</dimen>
<dimen name="avatar_forum_size">48dp</dimen> <dimen name="avatar_forum_size">48dp</dimen>
<dimen name="avatar_border_width">2dp</dimen> <dimen name="avatar_border_width">1dp</dimen>
<dimen name="avatar_text_size">30sp</dimen> <dimen name="avatar_text_size">30sp</dimen>
<dimen name="button_size">48dp</dimen> <dimen name="button_size">48dp</dimen>

View File

@@ -1,5 +1,6 @@
package org.briarproject.briar.api.identity; package org.briarproject.briar.api.identity;
import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.AuthorId;
@@ -19,6 +20,17 @@ public interface AuthorManager {
*/ */
AuthorInfo getAuthorInfo(Transaction txn, AuthorId a) throws DbException; AuthorInfo getAuthorInfo(Transaction txn, AuthorId a) throws DbException;
/**
* Returns the {@link AuthorInfo} for the given contact.
*/
AuthorInfo getAuthorInfo(Contact c) throws DbException;
/**
* Returns the {@link AuthorInfo} for the given contact.
*/
AuthorInfo getAuthorInfo(Transaction txn, Contact c)
throws DbException;
/** /**
* Returns the {@link AuthorInfo} for the {@link LocalAuthor}. * Returns the {@link AuthorInfo} for the {@link LocalAuthor}.
*/ */

View File

@@ -53,6 +53,17 @@ class AuthorManagerImpl implements AuthorManager {
if (contacts.isEmpty()) return new AuthorInfo(UNKNOWN); if (contacts.isEmpty()) return new AuthorInfo(UNKNOWN);
if (contacts.size() > 1) throw new AssertionError(); if (contacts.size() > 1) throw new AssertionError();
Contact c = contacts.iterator().next(); Contact c = contacts.iterator().next();
return getAuthorInfo(txn, c);
}
@Override
public AuthorInfo getAuthorInfo(Contact c) throws DbException {
return db.transactionWithResult(true, txn -> getAuthorInfo(txn, c));
}
@Override
public AuthorInfo getAuthorInfo(Transaction txn, Contact c)
throws DbException {
AttachmentHeader avatar = avatarManager.getAvatarHeader(txn, c); AttachmentHeader avatar = avatarManager.getAvatarHeader(txn, c);
if (c.isVerified()) if (c.isVerified())
return new AuthorInfo(VERIFIED, c.getAlias(), avatar); return new AuthorInfo(VERIFIED, c.getAlias(), avatar);