From ecc73b95e3b48487410b1b2e0d3435428c994de8 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 21 Nov 2018 16:24:26 -0200 Subject: [PATCH] Improvements for second testing round --- briar-android/artwork/ic_nearby.svg | 45 ++++++++++++ .../contact/ContactLinkExchangeActivity.java | 34 +++++++--- .../contact/ContactLinkExchangeFragment.java | 68 +++++++------------ .../contact/ContactQrCodeInputFragment.java | 8 +-- .../contact/PendingRequestsActivity.java | 5 ++ .../contact/PendingRequestsViewHolder.java | 13 ++++ .../briar/android/view/BriarRecyclerView.java | 10 ++- .../src/main/res/drawable/ic_nearby.xml | 9 +++ .../layout/fragment_contact_link_exchange.xml | 15 ++-- .../res/layout/list_item_pending_contact.xml | 3 +- .../main/res/menu/contact_list_actions.xml | 4 +- briar-android/src/main/res/values/strings.xml | 12 ++-- .../briar/api/messaging/MessagingManager.java | 12 ++-- .../briar/messaging/MessagingManagerImpl.java | 17 +++-- 14 files changed, 170 insertions(+), 85 deletions(-) create mode 100644 briar-android/artwork/ic_nearby.svg create mode 100644 briar-android/src/main/res/drawable/ic_nearby.xml diff --git a/briar-android/artwork/ic_nearby.svg b/briar-android/artwork/ic_nearby.svg new file mode 100644 index 000000000..4acef5fdb --- /dev/null +++ b/briar-android/artwork/ic_nearby.svg @@ -0,0 +1,45 @@ + +image/svg+xml \ No newline at end of file diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeActivity.java index de1618a98..e3f408dfa 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeActivity.java @@ -7,8 +7,11 @@ import android.os.Bundle; import android.support.v7.app.ActionBar; import android.view.MenuItem; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.bramble.api.plugin.ConnectionRegistry; +import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; @@ -30,7 +33,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.os.SystemClock.elapsedRealtime; import static java.lang.String.CASE_INSENSITIVE_ORDER; import static java.util.Objects.requireNonNull; -import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.api.lifecycle.LifecycleManager.LifecycleState.RUNNING; import static org.briarproject.bramble.util.LogUtils.logException; @@ -52,6 +55,8 @@ public class ContactLinkExchangeActivity extends BriarActivity implements @Inject MessagingManager messagingManager; @Inject + ConnectionRegistry connectionRegistry; + @Inject Clock clock; @Override @@ -87,7 +92,7 @@ public class ContactLinkExchangeActivity extends BriarActivity implements } } else if ("addContact".equals(action)) { removeFakeRequest(i.getStringExtra("name"), - i.getLongExtra("timestamp", 0)); + i.getLongExtra("timestamp", 0), i.getLongExtra("addAt", 0)); setIntent(null); finish(); } @@ -126,26 +131,30 @@ public class ContactLinkExchangeActivity extends BriarActivity implements } void addFakeRequest(String name, String link) { - long timestamp = clock.currentTimeMillis(); - try { - messagingManager.addNewPendingContact(name, timestamp); - } catch (DbException e) { - logException(LOG, WARNING, e); - } AlarmManager alarmManager = (AlarmManager) requireNonNull(getSystemService(ALARM_SERVICE)); double random = getPseudoRandom(link, OUR_LINK.replace("briar://", "")); - long m = MINUTES.toMillis(1); + long m = SECONDS.toMillis(50); long fromNow = (long) (-m * Math.log(random)); + // it should take at least 30 seconds + if (fromNow < SECONDS.toMillis(30)) fromNow = SECONDS.toMillis(30); LOG.info("Delay " + fromNow + " ms based on seed " + random); long triggerAt = elapsedRealtime() + fromNow; + long timestamp = clock.currentTimeMillis(); + try { + messagingManager.addNewPendingContact(name, timestamp, timestamp + fromNow); + } catch (DbException e) { + logException(LOG, WARNING, e); + } + Intent i = new Intent(this, ContactLinkExchangeActivity.class); i.setAction("addContact"); i.setFlags(FLAG_ACTIVITY_NEW_TASK); i.putExtra("name", name); i.putExtra("timestamp", timestamp); + i.putExtra("addAt", timestamp + fromNow); PendingIntent pendingIntent = PendingIntent.getActivity(this, (int) timestamp / 1000, i, 0); alarmManager.set(ELAPSED_REALTIME, triggerAt, pendingIntent); @@ -169,14 +178,17 @@ public class ContactLinkExchangeActivity extends BriarActivity implements return hash / (1.0 + Integer.MAX_VALUE); } - private void removeFakeRequest(String name, long timestamp) { + private void removeFakeRequest(String name, long timestamp, long addAt) { if (lifecycleManager.getLifecycleState() != RUNNING) { LOG.info("Lifecycle not started, not adding contact " + name); return; } LOG.info("Adding Contact " + name); try { - messagingManager.removePendingContact(name, timestamp); + ContactId c = messagingManager + .removePendingContact(name, timestamp, addAt); + // fake contact online status + connectionRegistry.registerConnection(c, TorConstants.ID, true); } catch (DbException e) { logException(LOG, WARNING, e); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeFragment.java index 2b3f072dc..25983cc6f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeFragment.java @@ -8,9 +8,6 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputLayout; -import android.support.v7.app.AlertDialog; -import android.text.Editable; -import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,9 +34,9 @@ import static java.util.Objects.requireNonNull; import static org.briarproject.briar.android.contact.ContactLinkExchangeActivity.LINK_REGEX; import static org.briarproject.briar.android.contact.ContactLinkExchangeActivity.OUR_LINK; import static org.briarproject.briar.android.util.UiUtils.resolveColorAttribute; +import static org.briarproject.briar.android.util.UiUtils.setError; -public class ContactLinkExchangeFragment extends BaseFragment - implements TextWatcher { +public class ContactLinkExchangeFragment extends BaseFragment { static final String TAG = ContactLinkExchangeFragment.class.getName(); @@ -52,7 +49,7 @@ public class ContactLinkExchangeFragment extends BaseFragment } private ClipboardManager clipboard; - private TextInputLayout linkInputLayout; + private TextInputLayout linkInputLayout, contactNameLayout; private TextInputEditText linkInput, contactNameInput; private Button addButton; @@ -87,8 +84,8 @@ public class ContactLinkExchangeFragment extends BaseFragment addButton = v.findViewById(R.id.addButton); addButton.setOnClickListener(view -> onAddButtonClicked()); + contactNameLayout = v.findViewById(R.id.contactNameLayout); contactNameInput = v.findViewById(R.id.contactNameInput); - contactNameInput.addTextChangedListener(this); if (SDK_INT < 23) { Drawable drawable = wrap(contactNameInput.getCompoundDrawables()[0]); @@ -103,7 +100,6 @@ public class ContactLinkExchangeFragment extends BaseFragment setTint(drawable, color); linkInput.setCompoundDrawables(drawable, null, null, null); } - linkInput.addTextChangedListener(this); if (getArguments() != null) linkInput.setText(getArguments().getString("link")); @@ -155,31 +151,26 @@ public class ContactLinkExchangeFragment extends BaseFragment return (ContactLinkExchangeActivity) getActivity(); } - @Override - public void beforeTextChanged(CharSequence s, int start, int count, - int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, - int count) { - updateAddButtonState(); - } - - @Override - public void afterTextChanged(Editable s) { - } - - private void updateAddButtonState() { + private boolean isInputError() { + boolean briarLink = isBriarLink(linkInput.getText()); + if (!briarLink) { + linkInputLayout.setError("Invalid link"); + return true; + } else linkInputLayout.setError(null); + String link = getLink(); + boolean isOurLink = link != null && OUR_LINK.equals("briar://" + link); + if (isOurLink) { + linkInputLayout.setError("Add your peer's link, not your own."); + return true; + } else linkInputLayout.setError(null); boolean validContactName = contactNameInput.getText() != null && contactNameInput.getText().length() > 0; - boolean briarLink = isBriarLink(linkInput.getText()); - if (briarLink) { - linkInputLayout.setErrorEnabled(false); - } else { - linkInputLayout.setError("Invalid link"); - } - addButton.setEnabled(validContactName && briarLink); + if (!validContactName) { + contactNameLayout.setError("Nickname is missing"); + return true; + } else contactNameLayout.setError(null); + setError(linkInputLayout, null, false); + return false; } private boolean isBriarLink(@Nullable CharSequence s) { @@ -198,23 +189,10 @@ public class ContactLinkExchangeFragment extends BaseFragment private void onAddButtonClicked() { ContactLinkExchangeActivity activity = getCastActivity(); - if (activity == null) return; + if (activity == null || isInputError()) return; String linkText = getLink(); if (linkText == null) throw new AssertionError(); - if (OUR_LINK.equals("briar://" + linkText)) { - new AlertDialog.Builder(activity, R.style.BriarDialogTheme_Neutral) - .setMessage( - "Add the link you get from your contact, not your own link.") - .setNeutralButton(R.string.ok, - (dialog, which) -> { - linkInput.setText(null); - dialog.cancel(); - }) - .show(); - return; - } - activity.addFakeRequest(contactNameInput.getText().toString(), linkText); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactQrCodeInputFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactQrCodeInputFragment.java index 8dcffe960..5124e8282 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactQrCodeInputFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactQrCodeInputFragment.java @@ -31,7 +31,7 @@ import static android.widget.Toast.LENGTH_LONG; import static android.widget.Toast.LENGTH_SHORT; import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.util.LogUtils.logException; -import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PERMISSION_CAMERA; +import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PERMISSION_CAMERA_LOCATION; public class ContactQrCodeInputFragment extends BaseFragment implements QrCodeDecoder.ResultCallback { @@ -134,7 +134,7 @@ public class ContactQrCodeInputFragment extends BaseFragment public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (getContext() == null) return; - if (requestCode == REQUEST_PERMISSION_CAMERA) { + if (requestCode == REQUEST_PERMISSION_CAMERA_LOCATION) { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PERMISSION_GRANTED) { @@ -154,7 +154,7 @@ public class ContactQrCodeInputFragment extends BaseFragment builder.show(); } else { Toast.makeText(getContext(), - R.string.permission_camera_denied_toast, + R.string.permission_camera_denied_body, LENGTH_LONG).show(); cancel(); } @@ -163,7 +163,7 @@ public class ContactQrCodeInputFragment extends BaseFragment } private void requestPermission() { - requestPermissions(new String[] {CAMERA}, REQUEST_PERMISSION_CAMERA); + requestPermissions(new String[] {CAMERA}, REQUEST_PERMISSION_CAMERA_LOCATION); } @Nullable diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsActivity.java index a26458ee4..e3f2f271f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsActivity.java @@ -24,6 +24,8 @@ import java.util.Collection; import javax.annotation.Nullable; import javax.inject.Inject; +import static java.util.concurrent.TimeUnit.SECONDS; + public class PendingRequestsActivity extends BriarActivity implements EventListener { @@ -57,12 +59,14 @@ public class PendingRequestsActivity extends BriarActivity list = findViewById(R.id.list); list.setLayoutManager(new LinearLayoutManager(this)); list.setAdapter(adapter); + list.setPERIODIC_UPDATE_MILLIS(SECONDS.toMillis(9)); } @Override public void onStart() { super.onStart(); eventBus.addListener(this); + list.startPeriodicUpdate(); runOnDbThread(() -> { try { Collection contacts = @@ -77,6 +81,7 @@ public class PendingRequestsActivity extends BriarActivity @Override protected void onStop() { super.onStop(); + list.stopPeriodicUpdate(); adapter.clear(); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsViewHolder.java index 8d283524e..9a3e77649 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsViewHolder.java @@ -1,6 +1,7 @@ package org.briarproject.briar.android.contact; import android.support.v7.widget.RecyclerView.ViewHolder; +import android.util.Log; import android.view.View; import android.widget.TextView; @@ -9,6 +10,7 @@ import org.briarproject.briar.R; import org.briarproject.briar.android.view.TextAvatarView; import org.briarproject.briar.api.messaging.MessagingManager.PendingContact; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.briarproject.bramble.util.StringUtils.toUtf8; import static org.briarproject.briar.android.util.UiUtils.formatDate; @@ -18,12 +20,14 @@ public class PendingRequestsViewHolder extends ViewHolder { private final TextAvatarView avatar; private final TextView name; private final TextView time; + private final TextView status; public PendingRequestsViewHolder(View v) { super(v); avatar = v.findViewById(R.id.avatar); name = v.findViewById(R.id.name); time = v.findViewById(R.id.time); + status = v.findViewById(R.id.status); } public void bind(PendingContact item) { @@ -31,6 +35,15 @@ public class PendingRequestsViewHolder extends ViewHolder { avatar.setBackgroundBytes(toUtf8(item.getName() + item.getTimestamp())); name.setText(item.getName()); time.setText(formatDate(time.getContext(), item.getTimestamp())); + long diff = item.getAddAt() - System.currentTimeMillis(); + Log.e("TEST", "diff: " + diff); + if (diff < SECONDS.toMillis(10)) { + status.setText("Adding contact…"); + } else if (diff < SECONDS.toMillis(20)) { + status.setText("Connecting…"); + } else if (diff < SECONDS.toMillis(30)) { + status.setText("Waiting for peer to come online…"); + } } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/BriarRecyclerView.java b/briar-android/src/main/java/org/briarproject/briar/android/view/BriarRecyclerView.java index 7e25d9322..a8fb45317 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/view/BriarRecyclerView.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/view/BriarRecyclerView.java @@ -28,6 +28,8 @@ public class BriarRecyclerView extends FrameLayout { private final Handler handler = new Handler(Looper.getMainLooper()); + private long PERIODIC_UPDATE_MILLIS = MIN_DATE_RESOLUTION; + private RecyclerView recyclerView; private Group emptyState; private AppCompatImageView emptyImage; @@ -215,9 +217,9 @@ public class BriarRecyclerView extends FrameLayout { refresher = () -> { Adapter adapter = recyclerView.getAdapter(); adapter.notifyItemRangeChanged(0, adapter.getItemCount()); - handler.postDelayed(refresher, MIN_DATE_RESOLUTION); + handler.postDelayed(refresher, PERIODIC_UPDATE_MILLIS); }; - handler.postDelayed(refresher, MIN_DATE_RESOLUTION); + handler.postDelayed(refresher, PERIODIC_UPDATE_MILLIS); } public void stopPeriodicUpdate() { @@ -227,4 +229,8 @@ public class BriarRecyclerView extends FrameLayout { } } + public void setPERIODIC_UPDATE_MILLIS(long millis) { + PERIODIC_UPDATE_MILLIS = millis; + } + } diff --git a/briar-android/src/main/res/drawable/ic_nearby.xml b/briar-android/src/main/res/drawable/ic_nearby.xml new file mode 100644 index 000000000..3ca6c177b --- /dev/null +++ b/briar-android/src/main/res/drawable/ic_nearby.xml @@ -0,0 +1,9 @@ + + + diff --git a/briar-android/src/main/res/layout/fragment_contact_link_exchange.xml b/briar-android/src/main/res/layout/fragment_contact_link_exchange.xml index e4ed7cbe2..292f4b9ab 100644 --- a/briar-android/src/main/res/layout/fragment_contact_link_exchange.xml +++ b/briar-android/src/main/res/layout/fragment_contact_link_exchange.xml @@ -45,7 +45,7 @@ app:hintEnabled="false" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/copyButton"> + app:layout_constraintTop_toBottomOf="@+id/divider"> + app:layout_constraintTop_toBottomOf="@+id/contactNameLayout"/> + + \ No newline at end of file diff --git a/briar-android/src/main/res/layout/list_item_pending_contact.xml b/briar-android/src/main/res/layout/list_item_pending_contact.xml index eed9743fc..6088d1db0 100644 --- a/briar-android/src/main/res/layout/list_item_pending_contact.xml +++ b/briar-android/src/main/res/layout/list_item_pending_contact.xml @@ -46,7 +46,8 @@ android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:layout_marginTop="8dp" - android:text="@string/add_contact_remote_connecting" + android:text="Waiting for peer to come online…" + app:layout_constrainedWidth="true" app:layout_constraintBottom_toTopOf="@+id/divider" app:layout_constraintEnd_toStartOf="@+id/time" app:layout_constraintHorizontal_bias="0.0" diff --git a/briar-android/src/main/res/menu/contact_list_actions.xml b/briar-android/src/main/res/menu/contact_list_actions.xml index 5f322d3d3..18a88b7c9 100644 --- a/briar-android/src/main/res/menu/contact_list_actions.xml +++ b/briar-android/src/main/res/menu/contact_list_actions.xml @@ -5,7 +5,7 @@ @@ -17,4 +17,4 @@ android:title="@string/add_contact_remotely_title" app:showAsAction="never"/> - \ No newline at end of file + diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index fe0095536..31312ae83 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -164,17 +164,17 @@ Please check that you\'re both connected to the same Wi-Fi network. If this problem persists, please send feedback to help us improve the app. - Add Contact Nearby - Add Contact with Link - Give contact a nickname - Your contact\'s link + Add contact nearby + Add contact remotely + Give peer a nickname + Enter peer\'s link Paste QR Code - Add Contact + Add peer as contact Copy Share QR Code - Give this link to your contact: + Exchange links with your peer!\n\nYour link: Briar link Link copied "There are pending contact requests" diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java index 277f3f66f..82efdd2f7 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java @@ -16,15 +16,16 @@ import java.util.Collection; public interface MessagingManager extends ConversationClient { // TODO remove (only for prototype) - void addNewPendingContact(String name, long timestamp) throws DbException; - void removePendingContact(String name, long timestamp) throws DbException; + void addNewPendingContact(String name, long timestamp, long addAt) throws DbException; + ContactId removePendingContact(String name, long timestamp, long addAt) throws DbException; Collection getPendingContacts() throws DbException; class PendingContact { private final String name; - private final long timestamp; - public PendingContact(String name, long timestamp) { + private final long timestamp, addAt; + public PendingContact(String name, long timestamp, long addAt) { this.name = name; this.timestamp = timestamp; + this.addAt = addAt; } public String getName() { return name; @@ -32,6 +33,9 @@ public interface MessagingManager extends ConversationClient { public long getTimestamp() { return timestamp; } + public long getAddAt() { + return addAt; + } } diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index 006ba4067..ec3efe8bd 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -85,7 +85,7 @@ class MessagingManagerImpl extends ConversationClientImpl private static final String PENDING_CONTACTS = "PENDING_CONTACTS"; @Override - public void addNewPendingContact(String name, long timestamp) + public void addNewPendingContact(String name, long timestamp, long addAt) throws DbException { Transaction txn = db.startTransaction(false); try { @@ -93,6 +93,7 @@ class MessagingManagerImpl extends ConversationClientImpl BdfDictionary contact = new BdfDictionary(); contact.put("name", name); contact.put("timestamp", timestamp); + contact.put("addAt", addAt); list.add(contact); Group localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID, @@ -109,7 +110,7 @@ class MessagingManagerImpl extends ConversationClientImpl } } @Override - public void removePendingContact(String name, long timestamp) throws DbException { + public ContactId removePendingContact(String name, long timestamp, long addAt) throws DbException { Transaction txn = db.startTransaction(false); try { BdfList list = getPendingContacts(txn); @@ -117,6 +118,7 @@ class MessagingManagerImpl extends ConversationClientImpl BdfDictionary contactDict = new BdfDictionary(); contactDict.put("name", name); contactDict.put("timestamp", timestamp); + contactDict.put("addAt", addAt); list.remove(contactDict); Group localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID, @@ -126,9 +128,11 @@ class MessagingManagerImpl extends ConversationClientImpl clientHelper.mergeGroupMetadata(txn, localGroup.getId(), meta); AuthorId local = identityManager.getLocalAuthor(txn).getId(); - Author remote = authorFactory - .createAuthor(name, new byte[MAX_PUBLIC_KEY_LENGTH]); - contactManager.addContact(txn, remote, local, false, true); + byte[] pubKey = new byte[MAX_PUBLIC_KEY_LENGTH]; + new Random().nextBytes(pubKey); + Author remote = authorFactory.createAuthor(name, pubKey); + ContactId c = + contactManager.addContact(txn, remote, local, false, true); Contact contact = contactManager.getContact(txn, remote.getId(), local); @@ -137,6 +141,7 @@ class MessagingManagerImpl extends ConversationClientImpl txn.attach(event); db.commitTransaction(txn); + return c; } catch (FormatException e) { throw new RuntimeException(e); } finally { @@ -152,7 +157,7 @@ class MessagingManagerImpl extends ConversationClientImpl for (Object o : list) { BdfDictionary d = (BdfDictionary) o; contacts.add(new PendingContact(d.getString("name"), - d.getLong("timestamp"))); + d.getLong("timestamp"), d.getLong("addAt"))); } db.commitTransaction(txn); return contacts;