mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-16 04:39:54 +01:00
Remote Contact Adding UI: Address review comments
This commit is contained in:
@@ -62,11 +62,6 @@ public interface ContactManager {
|
|||||||
*/
|
*/
|
||||||
String getRemoteContactLink() throws DbException;
|
String getRemoteContactLink() throws DbException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the given link is syntactically valid.
|
|
||||||
*/
|
|
||||||
boolean isValidRemoteContactLink(String link);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requests a new contact to be added via the given {@code link}.
|
* Requests a new contact to be added via the given {@code link}.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -138,11 +138,6 @@ class ContactManagerImpl implements ContactManager {
|
|||||||
return new String(c);
|
return new String(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isValidRemoteContactLink(String link) {
|
|
||||||
return LINK_REGEX.matcher(link).matches();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addRemoteContactRequest(String link, String alias) {
|
public void addRemoteContactRequest(String link, String alias) {
|
||||||
// TODO replace with real implementation
|
// TODO replace with real implementation
|
||||||
@@ -199,7 +194,7 @@ class ContactManagerImpl implements ContactManager {
|
|||||||
pendingContacts.remove(pendingContact);
|
pendingContacts.remove(pendingContact);
|
||||||
Event e;
|
Event e;
|
||||||
try {
|
try {
|
||||||
if (true || new Random().nextBoolean()) {
|
if (new Random().nextBoolean()) {
|
||||||
getLogger("TMP").warning("FAILED");
|
getLogger("TMP").warning("FAILED");
|
||||||
e = new PendingContactStateChangedEvent(id, FAILED);
|
e = new PendingContactStateChangedEvent(id, FAILED);
|
||||||
PendingContact updated = new PendingContact(id,
|
PendingContact updated = new PendingContact(id,
|
||||||
|
|||||||
@@ -444,7 +444,7 @@
|
|||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".android.contact.add.remote.PendingRequestsActivity"
|
android:name=".android.contact.add.remote.PendingContactListActivity"
|
||||||
android:label="@string/pending_contact_requests"
|
android:label="@string/pending_contact_requests"
|
||||||
android:theme="@style/BriarTheme"/>
|
android:theme="@style/BriarTheme"/>
|
||||||
|
|
||||||
|
|||||||
@@ -572,11 +572,11 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
|
|||||||
private void updateContactAddedNotification() {
|
private void updateContactAddedNotification() {
|
||||||
BriarNotificationBuilder b =
|
BriarNotificationBuilder b =
|
||||||
new BriarNotificationBuilder(appContext, CONTACT_CHANNEL_ID);
|
new BriarNotificationBuilder(appContext, CONTACT_CHANNEL_ID);
|
||||||
b.setSmallIcon(R.drawable.notification_introduction);
|
b.setSmallIcon(R.drawable.notification_contact_added);
|
||||||
b.setColorRes(R.color.briar_primary);
|
b.setColorRes(R.color.briar_primary);
|
||||||
b.setContentTitle(appContext.getText(R.string.app_name));
|
b.setContentTitle(appContext.getText(R.string.app_name));
|
||||||
b.setContentText(appContext.getResources().getQuantityString(
|
b.setContentText(appContext.getResources().getQuantityString(
|
||||||
R.plurals.introduction_notification_text, contactAddedTotal,
|
R.plurals.contact_added_notification_text, contactAddedTotal,
|
||||||
contactAddedTotal));
|
contactAddedTotal));
|
||||||
b.setNotificationCategory(CATEGORY_MESSAGE);
|
b.setNotificationCategory(CATEGORY_MESSAGE);
|
||||||
setAlertProperties(b);
|
setAlertProperties(b);
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import org.briarproject.briar.android.contact.add.remote.LinkExchangeFragment;
|
|||||||
import org.briarproject.briar.android.contact.ContactListFragment;
|
import org.briarproject.briar.android.contact.ContactListFragment;
|
||||||
import org.briarproject.briar.android.contact.ContactModule;
|
import org.briarproject.briar.android.contact.ContactModule;
|
||||||
import org.briarproject.briar.android.contact.add.remote.NicknameFragment;
|
import org.briarproject.briar.android.contact.add.remote.NicknameFragment;
|
||||||
import org.briarproject.briar.android.contact.add.remote.PendingRequestsActivity;
|
import org.briarproject.briar.android.contact.add.remote.PendingContactListActivity;
|
||||||
import org.briarproject.briar.android.conversation.AliasDialogFragment;
|
import org.briarproject.briar.android.conversation.AliasDialogFragment;
|
||||||
import org.briarproject.briar.android.conversation.ConversationActivity;
|
import org.briarproject.briar.android.conversation.ConversationActivity;
|
||||||
import org.briarproject.briar.android.conversation.ImageActivity;
|
import org.briarproject.briar.android.conversation.ImageActivity;
|
||||||
@@ -174,7 +174,7 @@ public interface ActivityComponent {
|
|||||||
|
|
||||||
void inject(AddContactActivity activity);
|
void inject(AddContactActivity activity);
|
||||||
|
|
||||||
void inject(PendingRequestsActivity activity);
|
void inject(PendingContactListActivity activity);
|
||||||
|
|
||||||
// Fragments
|
// Fragments
|
||||||
void inject(AuthorNameFragment fragment);
|
void inject(AuthorNameFragment fragment);
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ 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.BaseContactListAdapter.OnContactClickListener;
|
import org.briarproject.briar.android.contact.BaseContactListAdapter.OnContactClickListener;
|
||||||
import org.briarproject.briar.android.contact.add.remote.AddContactActivity;
|
import org.briarproject.briar.android.contact.add.remote.AddContactActivity;
|
||||||
import org.briarproject.briar.android.contact.add.remote.PendingRequestsActivity;
|
import org.briarproject.briar.android.contact.add.remote.PendingContactListActivity;
|
||||||
import org.briarproject.briar.android.conversation.ConversationActivity;
|
import org.briarproject.briar.android.conversation.ConversationActivity;
|
||||||
import org.briarproject.briar.android.fragment.BaseFragment;
|
import org.briarproject.briar.android.fragment.BaseFragment;
|
||||||
import org.briarproject.briar.android.keyagreement.ContactExchangeActivity;
|
import org.briarproject.briar.android.keyagreement.ContactExchangeActivity;
|
||||||
@@ -179,7 +179,7 @@ public class ContactListFragment extends BaseFragment implements EventListener,
|
|||||||
snackbar = new BriarSnackbarBuilder()
|
snackbar = new BriarSnackbarBuilder()
|
||||||
.setAction(R.string.show, v ->
|
.setAction(R.string.show, v ->
|
||||||
startActivity(new Intent(getContext(),
|
startActivity(new Intent(getContext(),
|
||||||
PendingRequestsActivity.class)))
|
PendingContactListActivity.class)))
|
||||||
.make(contentView, R.string.pending_contact_requests_snackbar,
|
.make(contentView, R.string.pending_contact_requests_snackbar,
|
||||||
LENGTH_INDEFINITE);
|
LENGTH_INDEFINITE);
|
||||||
|
|
||||||
|
|||||||
@@ -13,12 +13,21 @@ import org.briarproject.bramble.api.db.DbException;
|
|||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import static java.util.logging.Level.WARNING;
|
||||||
|
import static java.util.logging.Logger.getLogger;
|
||||||
|
import static org.briarproject.bramble.api.contact.ContactManager.LINK_REGEX;
|
||||||
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class AddContactViewModel extends AndroidViewModel {
|
public class AddContactViewModel extends AndroidViewModel {
|
||||||
|
|
||||||
|
private final static Logger LOG =
|
||||||
|
getLogger(AddContactViewModel.class.getName());
|
||||||
|
|
||||||
private final ContactManager contactManager;
|
private final ContactManager contactManager;
|
||||||
@DatabaseExecutor
|
@DatabaseExecutor
|
||||||
private final Executor dbExecutor;
|
private final Executor dbExecutor;
|
||||||
@@ -44,7 +53,9 @@ public class AddContactViewModel extends AndroidViewModel {
|
|||||||
try {
|
try {
|
||||||
ourLink.postValue(contactManager.getRemoteContactLink());
|
ourLink.postValue(contactManager.getRemoteContactLink());
|
||||||
} catch (DbException e) {
|
} catch (DbException e) {
|
||||||
throw new AssertionError(e);
|
logException(LOG, WARNING, e);
|
||||||
|
// the UI should stay disable in this case,
|
||||||
|
// leaving the user unable to proceed
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -57,14 +68,8 @@ public class AddContactViewModel extends AndroidViewModel {
|
|||||||
remoteContactLink = link;
|
remoteContactLink = link;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
String getRemoteContactLink() {
|
|
||||||
return remoteContactLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isValidRemoteContactLink(@Nullable CharSequence link) {
|
boolean isValidRemoteContactLink(@Nullable CharSequence link) {
|
||||||
return link != null &&
|
return link != null && LINK_REGEX.matcher(link).find();
|
||||||
contactManager.isValidRemoteContactLink(link.toString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LiveData<Boolean> getRemoteLinkEntered() {
|
LiveData<Boolean> getRemoteLinkEntered() {
|
||||||
@@ -74,6 +79,7 @@ public class AddContactViewModel extends AndroidViewModel {
|
|||||||
void onRemoteLinkEntered() {
|
void onRemoteLinkEntered() {
|
||||||
if (remoteContactLink == null) throw new IllegalStateException();
|
if (remoteContactLink == null) throw new IllegalStateException();
|
||||||
remoteLinkEntered.setValue(true);
|
remoteLinkEntered.setValue(true);
|
||||||
|
remoteLinkEntered.postValue(false); // reset, so we can navigate back
|
||||||
}
|
}
|
||||||
|
|
||||||
void addContact(String nickname) {
|
void addContact(String nickname) {
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import android.os.Bundle;
|
|||||||
import android.support.design.widget.TextInputEditText;
|
import android.support.design.widget.TextInputEditText;
|
||||||
import android.support.design.widget.TextInputLayout;
|
import android.support.design.widget.TextInputLayout;
|
||||||
import android.support.v4.app.ShareCompat.IntentBuilder;
|
import android.support.v4.app.ShareCompat.IntentBuilder;
|
||||||
import android.text.Editable;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -73,9 +72,6 @@ public class LinkExchangeFragment extends BaseFragment {
|
|||||||
|
|
||||||
linkInputLayout = v.findViewById(R.id.linkInputLayout);
|
linkInputLayout = v.findViewById(R.id.linkInputLayout);
|
||||||
linkInput = v.findViewById(R.id.linkInput);
|
linkInput = v.findViewById(R.id.linkInput);
|
||||||
if (viewModel.getRemoteContactLink() != null) {
|
|
||||||
linkInput.setText(viewModel.getRemoteContactLink());
|
|
||||||
}
|
|
||||||
|
|
||||||
clipboard = (ClipboardManager) requireNonNull(
|
clipboard = (ClipboardManager) requireNonNull(
|
||||||
getContext().getSystemService(CLIPBOARD_SERVICE));
|
getContext().getSystemService(CLIPBOARD_SERVICE));
|
||||||
@@ -83,7 +79,7 @@ public class LinkExchangeFragment extends BaseFragment {
|
|||||||
Button pasteButton = v.findViewById(R.id.pasteButton);
|
Button pasteButton = v.findViewById(R.id.pasteButton);
|
||||||
pasteButton.setOnClickListener(view -> {
|
pasteButton.setOnClickListener(view -> {
|
||||||
ClipData clipData = clipboard.getPrimaryClip();
|
ClipData clipData = clipboard.getPrimaryClip();
|
||||||
if (clipData != null)
|
if (clipData != null && clipData.getItemCount() > 0)
|
||||||
linkInput.setText(clipData.getItemAt(0).getText());
|
linkInput.setText(clipData.getItemAt(0).getText());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -95,7 +91,7 @@ public class LinkExchangeFragment extends BaseFragment {
|
|||||||
private void onOwnLinkLoaded(String link) {
|
private void onOwnLinkLoaded(String link) {
|
||||||
View v = requireNonNull(getView());
|
View v = requireNonNull(getView());
|
||||||
|
|
||||||
TextView linkView = v.findViewById(R.id.linkView);
|
TextView linkView = v.findViewById(R.id.linkView);
|
||||||
linkView.setText(link);
|
linkView.setText(link);
|
||||||
|
|
||||||
Button copyButton = v.findViewById(R.id.copyButton);
|
Button copyButton = v.findViewById(R.id.copyButton);
|
||||||
@@ -110,10 +106,10 @@ public class LinkExchangeFragment extends BaseFragment {
|
|||||||
|
|
||||||
Button shareButton = v.findViewById(R.id.shareButton);
|
Button shareButton = v.findViewById(R.id.shareButton);
|
||||||
shareButton.setOnClickListener(view ->
|
shareButton.setOnClickListener(view ->
|
||||||
IntentBuilder.from(requireNonNull(getActivity()))
|
IntentBuilder.from(requireActivity())
|
||||||
.setText(link)
|
.setText(link)
|
||||||
.setType("text/plain")
|
.setType("text/plain")
|
||||||
.startChooser());
|
.startChooser());
|
||||||
shareButton.setEnabled(true);
|
shareButton.setEnabled(true);
|
||||||
|
|
||||||
Button continueButton = v.findViewById(R.id.addButton);
|
Button continueButton = v.findViewById(R.id.addButton);
|
||||||
@@ -121,47 +117,42 @@ public class LinkExchangeFragment extends BaseFragment {
|
|||||||
continueButton.setEnabled(true);
|
continueButton.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isInputError() {
|
/**
|
||||||
Editable linkText = linkInput.getText();
|
* Requires {@link AddContactViewModel#getOurLink()} to be loaded.
|
||||||
boolean briarLink = viewModel.isValidRemoteContactLink(linkText);
|
*/
|
||||||
if (!briarLink) {
|
|
||||||
if (linkText == null || linkText.length() == 0) {
|
|
||||||
linkInputLayout.setError(getString(R.string.missing_link));
|
|
||||||
} else {
|
|
||||||
linkInputLayout.setError(getString(R.string.invalid_link));
|
|
||||||
}
|
|
||||||
linkInput.requestFocus();
|
|
||||||
return true;
|
|
||||||
} else linkInputLayout.setError(null);
|
|
||||||
String link = getLink();
|
|
||||||
boolean isOurLink = link != null &&
|
|
||||||
("briar://" + link).equals(viewModel.getOurLink().getValue());
|
|
||||||
if (isOurLink) {
|
|
||||||
linkInputLayout.setError(getString(R.string.own_link_error));
|
|
||||||
linkInput.requestFocus();
|
|
||||||
return true;
|
|
||||||
} else linkInputLayout.setError(null);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private String getLink() {
|
private String getEnteredLinkOrNull() {
|
||||||
CharSequence link = linkInput.getText();
|
CharSequence link = linkInput.getText();
|
||||||
if (link == null) return null;
|
if (link == null || link.length() == 0) {
|
||||||
Matcher matcher = LINK_REGEX.matcher(link);
|
linkInputLayout.setError(getString(R.string.missing_link));
|
||||||
if (matcher.matches()) // needs to be called before groups become available
|
linkInput.requestFocus();
|
||||||
return matcher.group(2);
|
|
||||||
else
|
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matcher matcher = LINK_REGEX.matcher(link);
|
||||||
|
if (matcher.find()) {
|
||||||
|
String linkWithoutSchema = matcher.group(2);
|
||||||
|
// Check also if this is our own link. This was loaded already,
|
||||||
|
// because it enables the Continue button which is the only caller.
|
||||||
|
if (("briar://" + linkWithoutSchema)
|
||||||
|
.equals(viewModel.getOurLink().getValue())) {
|
||||||
|
linkInputLayout.setError(getString(R.string.own_link_error));
|
||||||
|
linkInput.requestFocus();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
linkInputLayout.setError(null);
|
||||||
|
return linkWithoutSchema;
|
||||||
|
}
|
||||||
|
linkInputLayout.setError(getString(R.string.invalid_link));
|
||||||
|
linkInput.requestFocus();
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onContinueButtonClicked() {
|
private void onContinueButtonClicked() {
|
||||||
if (isInputError()) return;
|
String link = getEnteredLinkOrNull();
|
||||||
|
if (link == null) return; // invalid link
|
||||||
String linkText = getLink();
|
|
||||||
if (linkText == null) throw new AssertionError();
|
|
||||||
viewModel.setRemoteContactLink(linkText);
|
|
||||||
|
|
||||||
|
viewModel.setRemoteContactLink(link);
|
||||||
viewModel.onRemoteLinkEntered();
|
viewModel.onRemoteLinkEntered();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,9 @@ import android.arch.lifecycle.ViewModelProvider;
|
|||||||
import android.arch.lifecycle.ViewModelProviders;
|
import android.arch.lifecycle.ViewModelProviders;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.MainThread;
|
|
||||||
import android.support.annotation.UiThread;
|
|
||||||
import android.support.design.widget.TextInputEditText;
|
import android.support.design.widget.TextInputEditText;
|
||||||
import android.support.design.widget.TextInputLayout;
|
import android.support.design.widget.TextInputLayout;
|
||||||
|
import android.text.Editable;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -22,7 +21,8 @@ import org.briarproject.briar.android.fragment.BaseFragment;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import static java.util.Objects.requireNonNull;
|
import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
|
||||||
|
import static org.briarproject.bramble.util.StringUtils.utf8IsTooLong;
|
||||||
|
|
||||||
@MethodsNotNullByDefault
|
@MethodsNotNullByDefault
|
||||||
@ParametersNotNullByDefault
|
@ParametersNotNullByDefault
|
||||||
@@ -70,27 +70,31 @@ public class NicknameFragment extends BaseFragment {
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@MainThread
|
@Nullable
|
||||||
@UiThread
|
private String getNicknameOrNull() {
|
||||||
private boolean isInputError() {
|
Editable name = contactNameInput.getText();
|
||||||
boolean validContactName = contactNameInput.getText() != null &&
|
if (name == null || name.toString().trim().length() == 0) {
|
||||||
contactNameInput.getText().toString().trim().length() > 0;
|
|
||||||
if (!validContactName) {
|
|
||||||
contactNameLayout.setError(getString(R.string.nickname_missing));
|
contactNameLayout.setError(getString(R.string.nickname_missing));
|
||||||
contactNameInput.requestFocus();
|
contactNameInput.requestFocus();
|
||||||
return true;
|
return null;
|
||||||
} else contactNameLayout.setError(null);
|
}
|
||||||
return false;
|
if (utf8IsTooLong(name.toString(), MAX_AUTHOR_NAME_LENGTH)) {
|
||||||
|
contactNameLayout.setError(getString(R.string.name_too_long));
|
||||||
|
contactNameInput.requestFocus();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
contactNameLayout.setError(null);
|
||||||
|
return name.toString().trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onAddButtonClicked() {
|
private void onAddButtonClicked() {
|
||||||
if (isInputError()) return;
|
String name = getNicknameOrNull();
|
||||||
|
if (name == null) return; // invalid nickname
|
||||||
|
|
||||||
String name = requireNonNull(contactNameInput.getText()).toString();
|
|
||||||
viewModel.addContact(name);
|
viewModel.addContact(name);
|
||||||
|
|
||||||
Intent intent =
|
Intent intent =
|
||||||
new Intent(getActivity(), PendingRequestsActivity.class);
|
new Intent(getActivity(), PendingContactListActivity.class);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,14 +22,14 @@ import javax.inject.Inject;
|
|||||||
|
|
||||||
@MethodsNotNullByDefault
|
@MethodsNotNullByDefault
|
||||||
@ParametersNotNullByDefault
|
@ParametersNotNullByDefault
|
||||||
public class PendingRequestsActivity extends BriarActivity
|
public class PendingContactListActivity extends BriarActivity
|
||||||
implements PendingContactListener {
|
implements PendingContactListener {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ViewModelProvider.Factory viewModelFactory;
|
ViewModelProvider.Factory viewModelFactory;
|
||||||
|
|
||||||
private PendingRequestsViewModel viewModel;
|
private PendingContactListViewModel viewModel;
|
||||||
private PendingRequestsAdapter adapter;
|
private PendingContactListAdapter adapter;
|
||||||
private BriarRecyclerView list;
|
private BriarRecyclerView list;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -49,11 +49,11 @@ public class PendingRequestsActivity extends BriarActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
viewModel = ViewModelProviders.of(this, viewModelFactory)
|
viewModel = ViewModelProviders.of(this, viewModelFactory)
|
||||||
.get(PendingRequestsViewModel.class);
|
.get(PendingContactListViewModel.class);
|
||||||
viewModel.getPendingContacts()
|
viewModel.getPendingContacts()
|
||||||
.observe(this, this::onPendingContactsChanged);
|
.observe(this, this::onPendingContactsChanged);
|
||||||
|
|
||||||
adapter = new PendingRequestsAdapter(this, this, PendingContact.class);
|
adapter = new PendingContactListAdapter(this, this, PendingContact.class);
|
||||||
list = findViewById(R.id.list);
|
list = findViewById(R.id.list);
|
||||||
list.setEmptyText(R.string.no_pending_contacts);
|
list.setEmptyText(R.string.no_pending_contacts);
|
||||||
list.setLayoutManager(new LinearLayoutManager(this));
|
list.setLayoutManager(new LinearLayoutManager(this));
|
||||||
@@ -92,12 +92,11 @@ public class PendingRequestsActivity extends BriarActivity
|
|||||||
|
|
||||||
private void onPendingContactsChanged(Collection<PendingContact> contacts) {
|
private void onPendingContactsChanged(Collection<PendingContact> contacts) {
|
||||||
if (contacts.isEmpty()) {
|
if (contacts.isEmpty()) {
|
||||||
if (!adapter.isEmpty()) {
|
if (adapter.isEmpty()) {
|
||||||
|
list.showData(); // hides progress bar, shows empty text
|
||||||
|
} else {
|
||||||
// all previous contacts have been removed, so we can finish
|
// all previous contacts have been removed, so we can finish
|
||||||
supportFinishAfterTransition();
|
supportFinishAfterTransition();
|
||||||
} else {
|
|
||||||
adapter.clear();
|
|
||||||
list.showData();
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
adapter.setItems(contacts);
|
adapter.setItems(contacts);
|
||||||
@@ -11,29 +11,29 @@ import org.briarproject.briar.R;
|
|||||||
import org.briarproject.briar.android.util.BriarAdapter;
|
import org.briarproject.briar.android.util.BriarAdapter;
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class PendingRequestsAdapter extends
|
class PendingContactListAdapter extends
|
||||||
BriarAdapter<PendingContact, PendingRequestsViewHolder> {
|
BriarAdapter<PendingContact, PendingContactViewHolder> {
|
||||||
|
|
||||||
private final PendingContactListener listener;
|
private final PendingContactListener listener;
|
||||||
|
|
||||||
public PendingRequestsAdapter(Context ctx, PendingContactListener listener,
|
PendingContactListAdapter(Context ctx, PendingContactListener listener,
|
||||||
Class<PendingContact> c) {
|
Class<PendingContact> c) {
|
||||||
super(ctx, c);
|
super(ctx, c);
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PendingRequestsViewHolder onCreateViewHolder(
|
public PendingContactViewHolder onCreateViewHolder(ViewGroup viewGroup,
|
||||||
ViewGroup viewGroup, int i) {
|
int i) {
|
||||||
View v = LayoutInflater.from(viewGroup.getContext()).inflate(
|
View v = LayoutInflater.from(viewGroup.getContext()).inflate(
|
||||||
R.layout.list_item_pending_contact, viewGroup, false);
|
R.layout.list_item_pending_contact, viewGroup, false);
|
||||||
return new PendingRequestsViewHolder(v, listener);
|
return new PendingContactViewHolder(v, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(
|
public void onBindViewHolder(
|
||||||
PendingRequestsViewHolder pendingRequestsViewHolder, int i) {
|
PendingContactViewHolder pendingContactViewHolder, int i) {
|
||||||
pendingRequestsViewHolder.bind(items.get(i));
|
pendingContactViewHolder.bind(items.get(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -44,15 +44,16 @@ public class PendingRequestsAdapter extends
|
|||||||
@Override
|
@Override
|
||||||
public boolean areContentsTheSame(PendingContact item1,
|
public boolean areContentsTheSame(PendingContact item1,
|
||||||
PendingContact item2) {
|
PendingContact item2) {
|
||||||
return item1.getAlias().equals(item2.getAlias()) &&
|
return item1.getId().equals(item2.getId()) &&
|
||||||
item1.getTimestamp() == item2.getTimestamp();
|
item1.getAlias().equals(item2.getAlias()) &&
|
||||||
|
item1.getTimestamp() == item2.getTimestamp() &&
|
||||||
|
item1.getState() == item2.getState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean areItemsTheSame(PendingContact item1,
|
public boolean areItemsTheSame(PendingContact item1,
|
||||||
PendingContact item2) {
|
PendingContact item2) {
|
||||||
return item1.getAlias().equals(item2.getAlias()) &&
|
return item1.getId().equals(item2.getId());
|
||||||
item1.getTimestamp() == item2.getTimestamp();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -27,11 +27,11 @@ import static java.util.logging.Logger.getLogger;
|
|||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class PendingRequestsViewModel extends AndroidViewModel
|
public class PendingContactListViewModel extends AndroidViewModel
|
||||||
implements EventListener {
|
implements EventListener {
|
||||||
|
|
||||||
private final Logger LOG =
|
private final Logger LOG =
|
||||||
getLogger(PendingRequestsViewModel.class.getName());
|
getLogger(PendingContactListViewModel.class.getName());
|
||||||
|
|
||||||
@DatabaseExecutor
|
@DatabaseExecutor
|
||||||
private final Executor dbExecutor;
|
private final Executor dbExecutor;
|
||||||
@@ -42,7 +42,7 @@ public class PendingRequestsViewModel extends AndroidViewModel
|
|||||||
new MutableLiveData<>();
|
new MutableLiveData<>();
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public PendingRequestsViewModel(Application application,
|
public PendingContactListViewModel(Application application,
|
||||||
@DatabaseExecutor Executor dbExecutor,
|
@DatabaseExecutor Executor dbExecutor,
|
||||||
ContactManager contactManager, EventBus eventBus) {
|
ContactManager contactManager, EventBus eventBus) {
|
||||||
super(application);
|
super(application);
|
||||||
@@ -16,22 +16,22 @@ import static android.view.View.VISIBLE;
|
|||||||
import static org.briarproject.briar.android.util.UiUtils.formatDate;
|
import static org.briarproject.briar.android.util.UiUtils.formatDate;
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class PendingRequestsViewHolder extends ViewHolder {
|
class PendingContactViewHolder extends ViewHolder {
|
||||||
|
|
||||||
private final PendingContactListener listener;
|
private final PendingContactListener listener;
|
||||||
private final TextAvatarView avatar;
|
private final TextAvatarView avatar;
|
||||||
private final TextView name;
|
private final TextView name;
|
||||||
private final TextView time;
|
private final TextView time;
|
||||||
private final TextView status;
|
private final TextView status;
|
||||||
private final Button button;
|
private final Button removeButton;
|
||||||
|
|
||||||
public PendingRequestsViewHolder(View v, PendingContactListener listener) {
|
PendingContactViewHolder(View v, PendingContactListener listener) {
|
||||||
super(v);
|
super(v);
|
||||||
avatar = v.findViewById(R.id.avatar);
|
avatar = v.findViewById(R.id.avatar);
|
||||||
name = v.findViewById(R.id.name);
|
name = v.findViewById(R.id.name);
|
||||||
time = v.findViewById(R.id.time);
|
time = v.findViewById(R.id.time);
|
||||||
status = v.findViewById(R.id.status);
|
status = v.findViewById(R.id.status);
|
||||||
button = v.findViewById(R.id.button);
|
removeButton = v.findViewById(R.id.removeButton);
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ public class PendingRequestsViewHolder extends ViewHolder {
|
|||||||
avatar.setBackgroundBytes(item.getId().getBytes());
|
avatar.setBackgroundBytes(item.getId().getBytes());
|
||||||
name.setText(item.getAlias());
|
name.setText(item.getAlias());
|
||||||
time.setText(formatDate(time.getContext(), item.getTimestamp()));
|
time.setText(formatDate(time.getContext(), item.getTimestamp()));
|
||||||
button.setOnClickListener(
|
removeButton.setOnClickListener(
|
||||||
v -> listener.onFailedPendingContactRemoved(item));
|
v -> listener.onFailedPendingContactRemoved(item));
|
||||||
|
|
||||||
int color = ContextCompat
|
int color = ContextCompat
|
||||||
@@ -68,7 +68,7 @@ public class PendingRequestsViewHolder extends ViewHolder {
|
|||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
status.setTextColor(color);
|
status.setTextColor(color);
|
||||||
button.setVisibility(buttonVisibility);
|
removeButton.setVisibility(buttonVisibility);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@ import android.arch.lifecycle.ViewModel;
|
|||||||
import android.arch.lifecycle.ViewModelProvider;
|
import android.arch.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
import org.briarproject.briar.android.contact.add.remote.AddContactViewModel;
|
import org.briarproject.briar.android.contact.add.remote.AddContactViewModel;
|
||||||
import org.briarproject.briar.android.contact.add.remote.PendingRequestsViewModel;
|
import org.briarproject.briar.android.contact.add.remote.PendingContactListViewModel;
|
||||||
import org.briarproject.briar.android.conversation.ConversationViewModel;
|
import org.briarproject.briar.android.conversation.ConversationViewModel;
|
||||||
import org.briarproject.briar.android.conversation.ImageViewModel;
|
import org.briarproject.briar.android.conversation.ImageViewModel;
|
||||||
|
|
||||||
@@ -37,9 +37,9 @@ public abstract class ViewModelModule {
|
|||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
@IntoMap
|
@IntoMap
|
||||||
@ViewModelKey(PendingRequestsViewModel.class)
|
@ViewModelKey(PendingContactListViewModel.class)
|
||||||
abstract ViewModel bindPendingRequestsViewModel(
|
abstract ViewModel bindPendingRequestsViewModel(
|
||||||
PendingRequestsViewModel pendingRequestsViewModel);
|
PendingContactListViewModel pendingContactListViewModel);
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
@Singleton
|
@Singleton
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
tools:text="Dec 24"/>
|
tools:text="Dec 24"/>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/button"
|
android:id="@+id/removeButton"
|
||||||
style="@style/BriarButtonFlat.Negative"
|
style="@style/BriarButtonFlat.Negative"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
android:layout_marginStart="8dp"
|
android:layout_marginStart="8dp"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toEndOf="@+id/avatar"
|
app:layout_constraintStart_toEndOf="@+id/avatar"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/button"
|
app:layout_constraintTop_toBottomOf="@+id/removeButton"
|
||||||
app:layout_goneMarginTop="@dimen/margin_large"/>
|
app:layout_goneMarginTop="@dimen/margin_large"/>
|
||||||
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
</android.support.constraint.ConstraintLayout>
|
||||||
|
|||||||
@@ -188,7 +188,7 @@
|
|||||||
<string name="introduction_response_accepted_received">لقد وافق/ت %1$s على تقديمه/ها إلى %2$s.</string>
|
<string name="introduction_response_accepted_received">لقد وافق/ت %1$s على تقديمه/ها إلى %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">لقد رفض/ت %1$sتقديمه/ا إلى %2$s.</string>
|
<string name="introduction_response_declined_received">لقد رفض/ت %1$sتقديمه/ا إلى %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">ي/تقول %1$sأن %2$s قد رفض/ت التقدمة.</string>
|
<string name="introduction_response_declined_received_by_introducee">ي/تقول %1$sأن %2$s قد رفض/ت التقدمة.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="zero">لا جهة اتصال تم إضافتها.</item>
|
<item quantity="zero">لا جهة اتصال تم إضافتها.</item>
|
||||||
<item quantity="one">جهة اتصال تم إضافتها.</item>
|
<item quantity="one">جهة اتصال تم إضافتها.</item>
|
||||||
<item quantity="two">جهتيْ اتصال تم إضافتها.</item>
|
<item quantity="two">جهتيْ اتصال تم إضافتها.</item>
|
||||||
|
|||||||
@@ -99,7 +99,7 @@
|
|||||||
<string name="try_again_button">Tentar nuevamente</string>
|
<string name="try_again_button">Tentar nuevamente</string>
|
||||||
<string name="camera_error">Error de cámara</string>
|
<string name="camera_error">Error de cámara</string>
|
||||||
<!--Introductions-->
|
<!--Introductions-->
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Añadióse un contactu nuevu.</item>
|
<item quantity="one">Añadióse un contactu nuevu.</item>
|
||||||
<item quantity="other">Añadiéronse %d contactos nuevos.</item>
|
<item quantity="other">Añadiéronse %d contactos nuevos.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -173,7 +173,7 @@
|
|||||||
<string name="introduction_request_answered_received">%1$ssizi %2$s-ə təqdim etmək istədi.</string>
|
<string name="introduction_request_answered_received">%1$ssizi %2$s-ə təqdim etmək istədi.</string>
|
||||||
<string name="introduction_response_accepted_sent">%1$s-ə qəbul olundunuz</string>
|
<string name="introduction_response_accepted_sent">%1$s-ə qəbul olundunuz</string>
|
||||||
<string name="introduction_response_declined_sent">%1$s-ə girişdən imtina etdiniz</string>
|
<string name="introduction_response_declined_sent">%1$s-ə girişdən imtina etdiniz</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">yeni kontaktlar əlavə edildi.</item>
|
<item quantity="one">yeni kontaktlar əlavə edildi.</item>
|
||||||
<item quantity="other">%dyeni kontaktlar əlavə edildi.</item>
|
<item quantity="other">%dyeni kontaktlar əlavə edildi.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -114,7 +114,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s прие представянето на %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s прие представянето на %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s отказа представянето на %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s отказа представянето на %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s казва, че %2$s отказва представянето.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s казва, че %2$s отказва представянето.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Добавен нов контакт.</item>
|
<item quantity="one">Добавен нов контакт.</item>
|
||||||
<item quantity="other">%d добавени нови контакти.</item>
|
<item quantity="other">%d добавени нови контакти.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -111,7 +111,7 @@
|
|||||||
<string name="introduction_sent">Kaset eo bet ho tigoradur.</string>
|
<string name="introduction_sent">Kaset eo bet ho tigoradur.</string>
|
||||||
<string name="introduction_error">Ur fazi a zo c\'hoarvezet en ur ober an digoradur.</string>
|
<string name="introduction_error">Ur fazi a zo c\'hoarvezet en ur ober an digoradur.</string>
|
||||||
<string name="introduction_response_error">Fazi en ur respont d\'an digoradur</string>
|
<string name="introduction_response_error">Fazi en ur respont d\'an digoradur</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Darempred nevez ouzhpennet.</item>
|
<item quantity="one">Darempred nevez ouzhpennet.</item>
|
||||||
<item quantity="two">%d a zarempredoù nevez ouzhpennet.</item>
|
<item quantity="two">%d a zarempredoù nevez ouzhpennet.</item>
|
||||||
<item quantity="few">%d a zarempredoù nevez ouzhpennet.</item>
|
<item quantity="few">%d a zarempredoù nevez ouzhpennet.</item>
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ Un cop s\'actualitzi ja li veureu una icona diferent </string>
|
|||||||
<string name="introduction_response_accepted_received">%1$s ha acceptat conèixer a %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s ha acceptat conèixer a %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s ha refusat conèixer a %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s ha refusat conèixer a %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s diu que %2$s ha refusat conèixer-lo.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s diu que %2$s ha refusat conèixer-lo.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">S\'ha afegit un nou contacte.</item>
|
<item quantity="one">S\'ha afegit un nou contacte.</item>
|
||||||
<item quantity="other">S\'han afegit %d nous contactes.</item>
|
<item quantity="other">S\'han afegit %d nous contactes.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -157,7 +157,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s přijal pozvání do %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s přijal pozvání do %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s odmítl pozvání do %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s odmítl pozvání do %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s řekl, že %2$s odmítl pozvání.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s řekl, že %2$s odmítl pozvání.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Nový kontakt byl přidán.</item>
|
<item quantity="one">Nový kontakt byl přidán.</item>
|
||||||
<item quantity="few">Bylo přidáno %d nových kontaktů.</item>
|
<item quantity="few">Bylo přidáno %d nových kontaktů.</item>
|
||||||
<item quantity="many">%d nových kontaktů bylo přidáno.</item>
|
<item quantity="many">%d nových kontaktů bylo přidáno.</item>
|
||||||
|
|||||||
@@ -177,7 +177,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s hat die Kontaktempfehlung für %2$s angenommen.</string>
|
<string name="introduction_response_accepted_received">%1$s hat die Kontaktempfehlung für %2$s angenommen.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s hat die Kontaktempfehlung von %2$s abgelehnt.</string>
|
<string name="introduction_response_declined_received">%1$s hat die Kontaktempfehlung von %2$s abgelehnt.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s meldet, dass %2$s die Kontaktempfehlung abgelehnt hat.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s meldet, dass %2$s die Kontaktempfehlung abgelehnt hat.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">neuer Kontakt hinzugefügt.</item>
|
<item quantity="one">neuer Kontakt hinzugefügt.</item>
|
||||||
<item quantity="other">%d neue Kontakte hinzugefügt.</item>
|
<item quantity="other">%d neue Kontakte hinzugefügt.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -177,7 +177,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s aceptó la presentación a %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s aceptó la presentación a %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s rechazó la presentación a %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s rechazó la presentación a %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s dice que %2$s rechazó la presentación.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s dice que %2$s rechazó la presentación.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">nuevo contacto añadido.</item>
|
<item quantity="one">nuevo contacto añadido.</item>
|
||||||
<item quantity="other">%d nuevos contactos añadidos.</item>
|
<item quantity="other">%d nuevos contactos añadidos.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -177,7 +177,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s erabiltzaileak %2$s erabiltzailearen aurkezpena onartu du.</string>
|
<string name="introduction_response_accepted_received">%1$s erabiltzaileak %2$s erabiltzailearen aurkezpena onartu du.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s erabiltzaileak %2$s erabiltzailearen aurkezpena errefusatu du.</string>
|
<string name="introduction_response_declined_received">%1$s erabiltzaileak %2$s erabiltzailearen aurkezpena errefusatu du.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s erabiltzaileak dio %2$s erabiltzaileak aurkezpena errefusatu duela.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s erabiltzaileak dio %2$s erabiltzaileak aurkezpena errefusatu duela.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Kontaktu berria gehitu da.</item>
|
<item quantity="one">Kontaktu berria gehitu da.</item>
|
||||||
<item quantity="other">%d kontaktu berri gehitu dira.</item>
|
<item quantity="other">%d kontaktu berri gehitu dira.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -176,7 +176,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s معرفی به %2$s را پذیرفت.</string>
|
<string name="introduction_response_accepted_received">%1$s معرفی به %2$s را پذیرفت.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s معرفی به %2$s را رد کرد.</string>
|
<string name="introduction_response_declined_received">%1$s معرفی به %2$s را رد کرد.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s می گوید که %2$s دعوت نامه را رد کرد.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s می گوید که %2$s دعوت نامه را رد کرد.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">مخاطب جدید افزوده شد.</item>
|
<item quantity="one">مخاطب جدید افزوده شد.</item>
|
||||||
<item quantity="other">%d مخاطب جدید افزوده شد.</item>
|
<item quantity="other">%d مخاطب جدید افزوده شد.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -161,7 +161,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s hyväksyi esittelyn käyttäjälle %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s hyväksyi esittelyn käyttäjälle %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s kieltäytyi esittelystä käyttäjälle %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s kieltäytyi esittelystä käyttäjälle %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s sanoo, että %2$s on kieltäytynyt esittelystä.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s sanoo, että %2$s on kieltäytynyt esittelystä.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Uusi yhteystieto lisätty.</item>
|
<item quantity="one">Uusi yhteystieto lisätty.</item>
|
||||||
<item quantity="other">%d uutta yhteystietoa lisätty.</item>
|
<item quantity="other">%d uutta yhteystietoa lisätty.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -177,7 +177,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s a accepté d’être présenté à %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s a accepté d’être présenté à %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s a refusé d’être présenté à %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s a refusé d’être présenté à %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s annonce que %2$s a refusé la présentation.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s annonce que %2$s a refusé la présentation.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Un nouveau contact a été ajouté.</item>
|
<item quantity="one">Un nouveau contact a été ajouté.</item>
|
||||||
<item quantity="other">%d nouveaux contacts ont été ajoutés.</item>
|
<item quantity="other">%d nouveaux contacts ont été ajoutés.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -177,7 +177,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s aceptou a presentación a %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s aceptou a presentación a %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s rexeitou a presentación a %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s rexeitou a presentación a %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s di que %2$srexeitou a presentación.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s di que %2$srexeitou a presentación.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Novo contacto engadido.</item>
|
<item quantity="one">Novo contacto engadido.</item>
|
||||||
<item quantity="other">%d novos contactos engadidos.</item>
|
<item quantity="other">%d novos contactos engadidos.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -192,7 +192,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s הסכימו להיות מוצגים בפני %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s הסכימו להיות מוצגים בפני %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s סירבו להיות מוצגים בפני %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s סירבו להיות מוצגים בפני %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s אומרים ש- %2$s סירבו להיות מוצגים בפניהם.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s אומרים ש- %2$s סירבו להיות מוצגים בפניהם.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">נוסף איש קשר חדש.</item>
|
<item quantity="one">נוסף איש קשר חדש.</item>
|
||||||
<item quantity="two">נוספו %d אנשי קשר חדשים.</item>
|
<item quantity="two">נוספו %d אנשי קשר חדשים.</item>
|
||||||
<item quantity="many">נוספו %d אנשי קשר חדשים.</item>
|
<item quantity="many">נוספו %d אנשי קשר חדשים.</item>
|
||||||
|
|||||||
@@ -173,7 +173,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s%2$s की शुरूआत स्वीकार कर ली</string>
|
<string name="introduction_response_accepted_received">%1$s%2$s की शुरूआत स्वीकार कर ली</string>
|
||||||
<string name="introduction_response_declined_received">%1$s%2$sकी शुरूआत में गिरावट आई</string>
|
<string name="introduction_response_declined_received">%1$s%2$sकी शुरूआत में गिरावट आई</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$sकहते हैं कि%2$sने परिचय को अस्वीकार कर दिया</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$sकहते हैं कि%2$sने परिचय को अस्वीकार कर दिया</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">नया संपर्क जोड़ा।</item>
|
<item quantity="one">नया संपर्क जोड़ा।</item>
|
||||||
<item quantity="other">%dनया संपर्क जोड़ा।</item>
|
<item quantity="other">%dनया संपर्क जोड़ा।</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -163,7 +163,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s elfogadta a bemutatkozást %2$s számára.</string>
|
<string name="introduction_response_accepted_received">%1$s elfogadta a bemutatkozást %2$s számára.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s elutasította a bemutatkozást %2$s számára.</string>
|
<string name="introduction_response_declined_received">%1$s elutasította a bemutatkozást %2$s számára.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s alapján %2$s elutasította a bemutatkozást.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s alapján %2$s elutasította a bemutatkozást.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Új kapcsolat hozzáadva.</item>
|
<item quantity="one">Új kapcsolat hozzáadva.</item>
|
||||||
<item quantity="other">%d új kapcsolat hozzáadva.</item>
|
<item quantity="other">%d új kapcsolat hozzáadva.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -177,7 +177,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s ha accettato l\'introduzione a %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s ha accettato l\'introduzione a %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s ha declinato l\'introduzione a %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s ha declinato l\'introduzione a %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s dice che %2$s ha declinato l\'introduzione.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s dice che %2$s ha declinato l\'introduzione.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Aggiunto nuovo contatto</item>
|
<item quantity="one">Aggiunto nuovo contatto</item>
|
||||||
<item quantity="other">Aggiunti %d nuovi contatti.</item>
|
<item quantity="other">Aggiunti %d nuovi contatti.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -177,7 +177,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s го прифативте запознавањето со %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s го прифативте запознавањето со %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s го одбивте запознавањето со %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s го одбивте запознавањето со %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s вели дека %2$s го одбил запознавањето.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s вели дека %2$s го одбил запознавањето.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Нов контакт е додаден. </item>
|
<item quantity="one">Нов контакт е додаден. </item>
|
||||||
<item quantity="other">%d нови контакти се додадени.</item>
|
<item quantity="other">%d нови контакти се додадени.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -135,7 +135,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s er nå bekjent %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s er nå bekjent %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s avslo introduksjonen med %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s avslo introduksjonen med %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s sier at %2$s avslo introduksjonen.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s sier at %2$s avslo introduksjonen.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Ny kontakt lagt til.</item>
|
<item quantity="one">Ny kontakt lagt til.</item>
|
||||||
<item quantity="other">%d nye kontakter lagt til.</item>
|
<item quantity="other">%d nye kontakter lagt til.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -177,7 +177,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s heeft de introductie aan %2$sgeaccepteerd.</string>
|
<string name="introduction_response_accepted_received">%1$s heeft de introductie aan %2$sgeaccepteerd.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s heeft de introductie aan %2$s afgewezen.</string>
|
<string name="introduction_response_declined_received">%1$s heeft de introductie aan %2$s afgewezen.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s zegt dat %2$s je introductie heeft afgewezen.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s zegt dat %2$s je introductie heeft afgewezen.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Nieuw contact is toegevoegd.</item>
|
<item quantity="one">Nieuw contact is toegevoegd.</item>
|
||||||
<item quantity="other">%d nieuwe contacten zijn toegevoegd.</item>
|
<item quantity="other">%d nieuwe contacten zijn toegevoegd.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ Volètz suprimir vòstre compte e ne crear un nòu ?\n
|
|||||||
<string name="introduction_response_accepted_received">%1$s a acceptat d’apondre %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s a acceptat d’apondre %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s a refusat d’apondre %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s a refusat d’apondre %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s anóncia que %2$s a refusat la convidacion.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s anóncia que %2$s a refusat la convidacion.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Nòu contacte ajustat.</item>
|
<item quantity="one">Nòu contacte ajustat.</item>
|
||||||
<item quantity="other">%d nòus contactes ajustats.</item>
|
<item quantity="other">%d nòus contactes ajustats.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -172,7 +172,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s zaakceptował udostępnienie kontaktu %2$s</string>
|
<string name="introduction_response_accepted_received">%1$s zaakceptował udostępnienie kontaktu %2$s</string>
|
||||||
<string name="introduction_response_declined_received">%1$s odrzucił udostępnienie kontaktu %2$s</string>
|
<string name="introduction_response_declined_received">%1$s odrzucił udostępnienie kontaktu %2$s</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s mówi, że %2$s odrzucił udostępnienie kontaktu.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s mówi, że %2$s odrzucił udostępnienie kontaktu.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Nowy kontakt został dodany.</item>
|
<item quantity="one">Nowy kontakt został dodany.</item>
|
||||||
<item quantity="few">%d nowych kontaktów zostało dodanych.</item>
|
<item quantity="few">%d nowych kontaktów zostało dodanych.</item>
|
||||||
<item quantity="many">%d nowych kontaktów zostało dodanych.</item>
|
<item quantity="many">%d nowych kontaktów zostało dodanych.</item>
|
||||||
|
|||||||
@@ -164,7 +164,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s aceitou ser apresentado a %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s aceitou ser apresentado a %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s recusou ser apresentado a %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s recusou ser apresentado a %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s disse que %2$s recusou a apresentação.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s disse que %2$s recusou a apresentação.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Novo contato adicionado.</item>
|
<item quantity="one">Novo contato adicionado.</item>
|
||||||
<item quantity="other">%d novos contatos adicionados.</item>
|
<item quantity="other">%d novos contatos adicionados.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -182,7 +182,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s a acceptat recomandarea pentru %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s a acceptat recomandarea pentru %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s a refuzat recomandarea pentru %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s a refuzat recomandarea pentru %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s spune că %2$s a refuzat recomandarea.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s spune că %2$s a refuzat recomandarea.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Un nou contact adăugat.</item>
|
<item quantity="one">Un nou contact adăugat.</item>
|
||||||
<item quantity="few">%d contacte noi adăugate.</item>
|
<item quantity="few">%d contacte noi adăugate.</item>
|
||||||
<item quantity="other">%d de contacte noi adăugate.</item>
|
<item quantity="other">%d de contacte noi adăugate.</item>
|
||||||
|
|||||||
@@ -189,7 +189,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s принял представление %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s принял представление %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s отказался от представления %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s отказался от представления %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s сообщает, что %2$s отказался от представления.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s сообщает, что %2$s отказался от представления.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Новый контакт добавлен.</item>
|
<item quantity="one">Новый контакт добавлен.</item>
|
||||||
<item quantity="few">%d новых контакта добавлено.</item>
|
<item quantity="few">%d новых контакта добавлено.</item>
|
||||||
<item quantity="many">%d новых контактов добавлено.</item>
|
<item quantity="many">%d новых контактов добавлено.</item>
|
||||||
|
|||||||
@@ -177,7 +177,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s pranoi prezantimin te %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s pranoi prezantimin te %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s hodhi poshtë prezantimin te %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s hodhi poshtë prezantimin te %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s thotë se %2$s hodhi poshtë prezantimin.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s thotë se %2$s hodhi poshtë prezantimin.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">U shtua kontakt i ri.</item>
|
<item quantity="one">U shtua kontakt i ri.</item>
|
||||||
<item quantity="other">U shtuan %d kontakte të rinj.</item>
|
<item quantity="other">U shtuan %d kontakte të rinj.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ Izaberite dugačku lozinku koju je teško pogoditi, kao četiri nasumične rije
|
|||||||
<string name="introduction_response_accepted_received">%1$s prihvata upoznavanje sa %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s prihvata upoznavanje sa %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s je prihvatio-la upoznavanje sa kontaktom %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s je prihvatio-la upoznavanje sa kontaktom %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s kaže da je %2$s odbio-la upoznavanje.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s kaže da je %2$s odbio-la upoznavanje.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Novi kontakt je dodat.</item>
|
<item quantity="one">Novi kontakt je dodat.</item>
|
||||||
<item quantity="few">%d nova kontakta dodata.</item>
|
<item quantity="few">%d nova kontakta dodata.</item>
|
||||||
<item quantity="other">%d novih kontakata dodato.</item>
|
<item quantity="other">%d novih kontakata dodato.</item>
|
||||||
|
|||||||
@@ -112,7 +112,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s, %2$s ile tanışmayı kabul etti.</string>
|
<string name="introduction_response_accepted_received">%1$s, %2$s ile tanışmayı kabul etti.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s, %2$s ile tanışmayı reddetti.</string>
|
<string name="introduction_response_declined_received">%1$s, %2$s ile tanışmayı reddetti.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s, %2$s kişisinin tanışmayı reddettiğini söyledi.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s, %2$s kişisinin tanışmayı reddettiğini söyledi.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Yeni kişi eklendi.</item>
|
<item quantity="one">Yeni kişi eklendi.</item>
|
||||||
<item quantity="other">%d yeni kişi eklendi.</item>
|
<item quantity="other">%d yeni kişi eklendi.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|||||||
@@ -187,7 +187,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$sприйняв(-ла) запит на знайомство із %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$sприйняв(-ла) запит на знайомство із %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$sвідхилив(-ла) запит на знайомство з %2$s.</string>
|
<string name="introduction_response_declined_received">%1$sвідхилив(-ла) запит на знайомство з %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s повідомляє, що %2$s відхилив(-ла) запит на знайомство.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s повідомляє, що %2$s відхилив(-ла) запит на знайомство.</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="one">Новий контакт додано.</item>
|
<item quantity="one">Новий контакт додано.</item>
|
||||||
<item quantity="few">%d нові контакти додано.</item>
|
<item quantity="few">%d нові контакти додано.</item>
|
||||||
<item quantity="many">%d нових контактів додано.</item>
|
<item quantity="many">%d нових контактів додано.</item>
|
||||||
|
|||||||
@@ -170,7 +170,7 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s 已接受与 %2$s 建立联系。</string>
|
<string name="introduction_response_accepted_received">%1$s 已接受与 %2$s 建立联系。</string>
|
||||||
<string name="introduction_response_declined_received">%1$s 已谢绝与 %2$s 建立联系。</string>
|
<string name="introduction_response_declined_received">%1$s 已谢绝与 %2$s 建立联系。</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s 表示 %2$s 谢绝了介绍。</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s 表示 %2$s 谢绝了介绍。</string>
|
||||||
<plurals name="introduction_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="other">已添加 %d 位新联系人。</item>
|
<item quantity="other">已添加 %d 位新联系人。</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<!--Private Groups-->
|
<!--Private Groups-->
|
||||||
|
|||||||
@@ -171,47 +171,46 @@
|
|||||||
|
|
||||||
<!-- Adding Contacts Remotely -->
|
<!-- Adding Contacts Remotely -->
|
||||||
|
|
||||||
<string name="add_contact_remotely_title_case">Add Contact At A Distance</string>
|
<string name="add_contact_remotely_title_case">Add Contact at a Distance</string>
|
||||||
<string name="add_contact_nearby_title">Add contact nearby</string>
|
<string name="add_contact_nearby_title">Add contact nearby</string>
|
||||||
<string name="add_contact_remotely_title">Add contact at a distance</string>
|
<string name="add_contact_remotely_title">Add contact at a distance</string>
|
||||||
<string name="contact_name_hint">Give contact a nickname</string>
|
<string name="contact_name_hint">Give contact a nickname</string>
|
||||||
<string name="contact_link_intro">Enter the link from your contact here</string>
|
<string name="contact_link_intro">Enter the link from your contact here</string>
|
||||||
<string name="contact_link_hint">Contact\'s link</string>
|
<string name="contact_link_hint">Contact\'s link</string>
|
||||||
<string name="paste_button">Paste</string>
|
<string name="paste_button">Paste</string>
|
||||||
<string name="scan_qr_code_button">QR Code</string>
|
|
||||||
<string name="add_contact_button">Add contact</string>
|
<string name="add_contact_button">Add contact</string>
|
||||||
<string name="copy_button">Copy</string>
|
<string name="copy_button">Copy</string>
|
||||||
<string name="share_button">Share</string>
|
<string name="share_button">Share</string>
|
||||||
<string name="show_qr_code_button">QR Code</string>
|
|
||||||
<string name="send_link_title">Exchange links</string>
|
<string name="send_link_title">Exchange links</string>
|
||||||
<string name="add_contact_choose_nickname">Choose Nickname</string>
|
<string name="add_contact_choose_nickname">Choose Nickname</string>
|
||||||
<string name="add_contact_choose_a_nickname">Enter a nickname</string>
|
<string name="add_contact_choose_a_nickname">Enter a nickname</string>
|
||||||
<string name="nickname_intro">Give your contact a nickname! Only you can see it.</string>
|
<string name="nickname_intro">Give your contact a nickname. Only you can see it.</string>
|
||||||
<string name="your_link">Give this link to the contact you want to add</string>
|
<string name="your_link">Give this link to the contact you want to add</string>
|
||||||
<string name="link_clip_label">Briar link</string>
|
<string name="link_clip_label">Briar link</string>
|
||||||
<string name="link_copied_toast">Link copied</string>
|
<string name="link_copied_toast">Link copied</string>
|
||||||
<string name="pending_contact_requests_snackbar">"There are pending contact requests"</string>
|
<string name="pending_contact_requests_snackbar">There are pending contact requests</string>
|
||||||
<string name="pending_contact_requests">Pending contact requests</string>
|
<string name="pending_contact_requests">Pending Contact Requests</string>
|
||||||
<string name="no_pending_contacts">No pending contacts</string>
|
<string name="no_pending_contacts">No pending contacts</string>
|
||||||
<string name="add_contact_remote_connecting">Connecting…</string>
|
<string name="add_contact_remote_connecting">Connecting…</string>
|
||||||
<string name="scan_qr_code_title">Scan QR Code</string>
|
|
||||||
<string name="show_qr_code_title">Your QR Code</string>
|
|
||||||
<string name="camera_error_toast">Camera Error</string>
|
|
||||||
<string name="waiting_for_contact_to_come_online">Waiting for contact to come online…\n\nDid they enter your link already?</string>
|
<string name="waiting_for_contact_to_come_online">Waiting for contact to come online…\n\nDid they enter your link already?</string>
|
||||||
<string name="connecting">Connecting…</string>
|
<string name="connecting">Connecting…</string>
|
||||||
<string name="adding_contact">Adding contact…</string>
|
<string name="adding_contact">Adding contact…</string>
|
||||||
<string name="adding_contact_failed">Adding contact has failed</string>
|
<string name="adding_contact_failed">Adding contact has failed</string>
|
||||||
<string name="own_link_error">Please enter your contact\'s link</string>
|
<string name="own_link_error">Enter your contact\'s link, not your own</string>
|
||||||
<string name="nickname_missing">Please enter a nickname</string>
|
<string name="nickname_missing">Please enter a nickname</string>
|
||||||
<string name="invalid_link">Invalid link</string>
|
<string name="invalid_link">Invalid link</string>
|
||||||
<string name="missing_link">Please enter link</string>
|
<string name="missing_link">Please enter a link</string>
|
||||||
<!-- This is a numeral indicating the first step in a serious of screens -->
|
<!-- This is a numeral indicating the first step in a series of screens -->
|
||||||
<string name="step_1">1</string>
|
<string name="step_1">1</string>
|
||||||
<!-- This is a numeral indicating the second step in a serious of screens -->
|
<!-- This is a numeral indicating the second step in a series of screens -->
|
||||||
<string name="step_2">2</string>
|
<string name="step_2">2</string>
|
||||||
|
<plurals name="contact_added_notification_text">
|
||||||
|
<item quantity="one">New contact added.</item>
|
||||||
|
<item quantity="other">%d new contacts added.</item>
|
||||||
|
</plurals>
|
||||||
|
|
||||||
<!-- Introductions -->
|
<!-- Introductions -->
|
||||||
|
|
||||||
<string name="introduction_onboarding_title">Introduce your contacts</string>
|
<string name="introduction_onboarding_title">Introduce your contacts</string>
|
||||||
<string name="introduction_onboarding_text">You can introduce your contacts to each other, so they don\'t need to meet in person to connect on Briar.</string>
|
<string name="introduction_onboarding_text">You can introduce your contacts to each other, so they don\'t need to meet in person to connect on Briar.</string>
|
||||||
<string name="introduction_menu_item">Make Introduction</string>
|
<string name="introduction_menu_item">Make Introduction</string>
|
||||||
@@ -233,10 +232,6 @@
|
|||||||
<string name="introduction_response_accepted_received">%1$s accepted the introduction to %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s accepted the introduction to %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s declined the introduction to %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s declined the introduction to %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s says that %2$s declined the introduction.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s says that %2$s declined the introduction.</string>
|
||||||
<plurals name="introduction_notification_text">
|
|
||||||
<item quantity="one">New contact added.</item>
|
|
||||||
<item quantity="other">%d new contacts added.</item>
|
|
||||||
</plurals>
|
|
||||||
|
|
||||||
<!-- Private Groups -->
|
<!-- Private Groups -->
|
||||||
<string name="groups_list_empty">No groups to show</string>
|
<string name="groups_list_empty">No groups to show</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user