Remove pending contact state from the database.

This commit is contained in:
akwizgran
2019-05-22 11:25:05 +01:00
parent da5d442c91
commit 01ef367864
25 changed files with 286 additions and 171 deletions

View File

@@ -18,10 +18,9 @@ import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.contact.ContactManager;
import org.briarproject.bramble.api.contact.event.ContactAddedEvent;
import org.briarproject.bramble.api.contact.event.ContactAddedRemotelyEvent;
import org.briarproject.bramble.api.contact.event.ContactRemovedEvent;
import org.briarproject.bramble.api.contact.event.PendingContactAddedEvent;
import org.briarproject.bramble.api.contact.event.PendingContactRemovedEvent;
import org.briarproject.bramble.api.contact.event.PendingContactStateChangedEvent;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.NoSuchContactException;
import org.briarproject.bramble.api.event.Event;
@@ -65,7 +64,6 @@ import static android.support.v4.app.ActivityOptionsCompat.makeSceneTransitionAn
import static android.support.v4.view.ViewCompat.getTransitionName;
import static java.util.Objects.requireNonNull;
import static java.util.logging.Level.WARNING;
import static org.briarproject.bramble.api.contact.PendingContactState.WAITING_FOR_CONNECTION;
import static org.briarproject.bramble.util.LogUtils.logDuration;
import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.bramble.util.LogUtils.now;
@@ -293,15 +291,8 @@ public class ContactListFragment extends BaseFragment implements EventListener,
(ConversationMessageReceivedEvent) e;
ConversationMessageHeader h = p.getMessageHeader();
updateItem(p.getContactId(), h);
} else if (e instanceof PendingContactStateChangedEvent) {
PendingContactStateChangedEvent pe =
(PendingContactStateChangedEvent) e;
// only re-check pending contacts for initial state
if (pe.getPendingContactState() == WAITING_FOR_CONNECTION) {
checkForPendingContacts();
}
} else if (e instanceof PendingContactRemovedEvent ||
e instanceof ContactAddedRemotelyEvent) {
} else if (e instanceof PendingContactAddedEvent ||
e instanceof PendingContactRemovedEvent) {
checkForPendingContacts();
}
}

View File

@@ -4,7 +4,6 @@ import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.MutableLiveData;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import org.briarproject.bramble.api.FormatException;
@@ -45,7 +44,7 @@ public class AddContactViewModel extends AndroidViewModel {
private String remoteHandshakeLink;
@Inject
public AddContactViewModel(@NonNull Application application,
AddContactViewModel(Application application,
ContactManager contactManager,
@DatabaseExecutor Executor dbExecutor) {
super(application);

View File

@@ -0,0 +1,29 @@
package org.briarproject.briar.android.contact.add.remote;
import org.briarproject.bramble.api.contact.PendingContact;
import org.briarproject.bramble.api.contact.PendingContactState;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable;
@Immutable
@NotNullByDefault
class PendingContactItem {
private final PendingContact pendingContact;
private final PendingContactState state;
PendingContactItem(PendingContact pendingContact,
PendingContactState state) {
this.pendingContact = pendingContact;
this.state = state;
}
PendingContact getPendingContact() {
return pendingContact;
}
PendingContactState getState() {
return state;
}
}

View File

@@ -53,7 +53,8 @@ public class PendingContactListActivity extends BriarActivity
viewModel.getPendingContacts()
.observe(this, this::onPendingContactsChanged);
adapter = new PendingContactListAdapter(this, this, PendingContact.class);
adapter = new PendingContactListAdapter(this, this,
PendingContactItem.class);
list = findViewById(R.id.list);
list.setEmptyText(R.string.no_pending_contacts);
list.setLayoutManager(new LinearLayoutManager(this));
@@ -75,13 +76,11 @@ public class PendingContactListActivity extends BriarActivity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
@@ -89,8 +88,9 @@ public class PendingContactListActivity extends BriarActivity
viewModel.removePendingContact(pendingContact.getId());
}
private void onPendingContactsChanged(Collection<PendingContact> contacts) {
if (contacts.isEmpty()) {
private void onPendingContactsChanged(
Collection<PendingContactItem> items) {
if (items.isEmpty()) {
if (adapter.isEmpty()) {
list.showData(); // hides progress bar, shows empty text
} else {
@@ -98,7 +98,7 @@ public class PendingContactListActivity extends BriarActivity
supportFinishAfterTransition();
}
} else {
adapter.setItems(contacts);
adapter.setItems(items);
}
}

View File

@@ -12,12 +12,12 @@ import org.briarproject.briar.android.util.BriarAdapter;
@NotNullByDefault
class PendingContactListAdapter extends
BriarAdapter<PendingContact, PendingContactViewHolder> {
BriarAdapter<PendingContactItem, PendingContactViewHolder> {
private final PendingContactListener listener;
PendingContactListAdapter(Context ctx, PendingContactListener listener,
Class<PendingContact> c) {
Class<PendingContactItem> c) {
super(ctx, c);
this.listener = listener;
}
@@ -37,23 +37,29 @@ class PendingContactListAdapter extends
}
@Override
public int compare(PendingContact item1, PendingContact item2) {
return (int) (item1.getTimestamp() - item2.getTimestamp());
public int compare(PendingContactItem item1, PendingContactItem item2) {
long timestamp1 = item1.getPendingContact().getTimestamp();
long timestamp2 = item2.getPendingContact().getTimestamp();
return Long.compare(timestamp1, timestamp2);
}
@Override
public boolean areContentsTheSame(PendingContact item1,
PendingContact item2) {
return item1.getId().equals(item2.getId()) &&
item1.getAlias().equals(item2.getAlias()) &&
item1.getTimestamp() == item2.getTimestamp() &&
public boolean areContentsTheSame(PendingContactItem item1,
PendingContactItem item2) {
PendingContact p1 = item1.getPendingContact();
PendingContact p2 = item2.getPendingContact();
return p1.getId().equals(p2.getId()) &&
p1.getAlias().equals(p2.getAlias()) &&
p1.getTimestamp() == p2.getTimestamp() &&
item1.getState() == item2.getState();
}
@Override
public boolean areItemsTheSame(PendingContact item1,
PendingContact item2) {
return item1.getId().equals(item2.getId());
public boolean areItemsTheSame(PendingContactItem item1,
PendingContactItem item2) {
PendingContact p1 = item1.getPendingContact();
PendingContact p2 = item2.getPendingContact();
return p1.getId().equals(p2.getId());
}
}

View File

@@ -5,10 +5,12 @@ import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.MutableLiveData;
import org.briarproject.bramble.api.Pair;
import org.briarproject.bramble.api.contact.ContactManager;
import org.briarproject.bramble.api.contact.PendingContact;
import org.briarproject.bramble.api.contact.PendingContactId;
import org.briarproject.bramble.api.contact.event.ContactAddedRemotelyEvent;
import org.briarproject.bramble.api.contact.PendingContactState;
import org.briarproject.bramble.api.contact.event.PendingContactAddedEvent;
import org.briarproject.bramble.api.contact.event.PendingContactRemovedEvent;
import org.briarproject.bramble.api.contact.event.PendingContactStateChangedEvent;
import org.briarproject.bramble.api.db.DatabaseExecutor;
@@ -18,7 +20,9 @@ import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.event.EventListener;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
@@ -40,11 +44,11 @@ public class PendingContactListViewModel extends AndroidViewModel
private final ContactManager contactManager;
private final EventBus eventBus;
private final MutableLiveData<Collection<PendingContact>> pendingContacts =
new MutableLiveData<>();
private final MutableLiveData<Collection<PendingContactItem>>
pendingContacts = new MutableLiveData<>();
@Inject
public PendingContactListViewModel(Application application,
PendingContactListViewModel(Application application,
@DatabaseExecutor Executor dbExecutor,
ContactManager contactManager, EventBus eventBus) {
super(application);
@@ -63,7 +67,7 @@ public class PendingContactListViewModel extends AndroidViewModel
@Override
public void eventOccurred(Event e) {
if (e instanceof ContactAddedRemotelyEvent ||
if (e instanceof PendingContactAddedEvent ||
e instanceof PendingContactStateChangedEvent ||
e instanceof PendingContactRemovedEvent) {
loadPendingContacts();
@@ -73,14 +77,21 @@ public class PendingContactListViewModel extends AndroidViewModel
private void loadPendingContacts() {
dbExecutor.execute(() -> {
try {
pendingContacts.postValue(contactManager.getPendingContacts());
Collection<Pair<PendingContact, PendingContactState>> pairs =
contactManager.getPendingContacts();
List<PendingContactItem> items = new ArrayList<>(pairs.size());
for (Pair<PendingContact, PendingContactState> p : pairs) {
items.add(new PendingContactItem(p.getFirst(),
p.getSecond()));
}
pendingContacts.setValue(items);
} catch (DbException e) {
logException(LOG, WARNING, e);
}
});
}
LiveData<Collection<PendingContact>> getPendingContacts() {
LiveData<Collection<PendingContactItem>> getPendingContacts() {
return pendingContacts;
}

View File

@@ -35,13 +35,14 @@ class PendingContactViewHolder extends ViewHolder {
this.listener = listener;
}
public void bind(PendingContact item) {
avatar.setText(item.getAlias());
avatar.setBackgroundBytes(item.getId().getBytes());
name.setText(item.getAlias());
time.setText(formatDate(time.getContext(), item.getTimestamp()));
public void bind(PendingContactItem item) {
PendingContact p = item.getPendingContact();
avatar.setText(p.getAlias());
avatar.setBackgroundBytes(p.getId().getBytes());
name.setText(p.getAlias());
time.setText(formatDate(time.getContext(), p.getTimestamp()));
removeButton.setOnClickListener(v -> {
listener.onFailedPendingContactRemoved(item);
listener.onFailedPendingContactRemoved(p);
removeButton.setEnabled(false);
});