mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-17 21:29:54 +01:00
Show avatars for contacts outside AuthorView
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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}.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user