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 @@
+
+
\ 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;