mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 02:39:05 +01:00
Compare commits
59 Commits
alpha-1.4.
...
alpha-1.4.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36670a8bf6 | ||
|
|
32d62f9960 | ||
|
|
eafd6a1ca1 | ||
|
|
1614e72c43 | ||
|
|
a53a49e543 | ||
|
|
78b993bda4 | ||
|
|
6b956611e7 | ||
|
|
d0c3c1f9f6 | ||
|
|
24d058cdcc | ||
|
|
a9ab7fd60f | ||
|
|
9e5201d571 | ||
|
|
39eebe4c02 | ||
|
|
171df265ab | ||
|
|
9436757215 | ||
|
|
75370c8124 | ||
|
|
10dceafde1 | ||
|
|
e3126f931e | ||
|
|
6ddedbba36 | ||
|
|
982637a0b0 | ||
|
|
78ef8c8117 | ||
|
|
7319398c3b | ||
|
|
841b8133d1 | ||
|
|
b334e8da27 | ||
|
|
0ac26883c6 | ||
|
|
519837e829 | ||
|
|
9fa54bf15c | ||
|
|
af3389e0e1 | ||
|
|
f5cdad9100 | ||
|
|
df4e6aa207 | ||
|
|
82443d9708 | ||
|
|
27058ba0ca | ||
|
|
f400cf5aa0 | ||
|
|
e52c5ddc8e | ||
|
|
835e9f6994 | ||
|
|
4193179eb8 | ||
|
|
421b00517f | ||
|
|
707802c459 | ||
|
|
9f1757ccaf | ||
|
|
d665fc17ec | ||
|
|
65be2d2b26 | ||
|
|
d2a39da3e0 | ||
|
|
d13e4c976e | ||
|
|
20b52804bf | ||
|
|
5b27eb354c | ||
|
|
c340071469 | ||
|
|
506e274dff | ||
|
|
423356fdda | ||
|
|
043a173828 | ||
|
|
f0501bbfab | ||
|
|
5cafde7b14 | ||
|
|
5117dbad7e | ||
|
|
3a22388495 | ||
|
|
1d4de46dfd | ||
|
|
d805069dfe | ||
|
|
74cb2a6ce5 | ||
|
|
2880a4adac | ||
|
|
7aa1073bf5 | ||
|
|
d3dbcfd62d | ||
|
|
c4c70f5ac2 |
@@ -32,9 +32,9 @@ test:
|
||||
extends: .base-test
|
||||
stage: test
|
||||
script:
|
||||
- ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom animalSnifferMain animalSnifferTest
|
||||
- ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom :briar-headless:linuxJars
|
||||
- ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom compileOfficialDebugAndroidTestSources compileScreenshotDebugAndroidTestSources check
|
||||
- ./gradlew -Djava.security.egd=file:/dev/urandom animalSnifferMain animalSnifferTest
|
||||
- ./gradlew -Djava.security.egd=file:/dev/urandom assembleOfficialDebug :briar-headless:linuxJars
|
||||
- ./gradlew -Djava.security.egd=file:/dev/urandom compileOfficialDebugAndroidTestSources compileScreenshotDebugAndroidTestSources check
|
||||
rules:
|
||||
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
||||
when: always
|
||||
@@ -62,7 +62,7 @@ android test:
|
||||
when: on_failure
|
||||
rules:
|
||||
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
||||
when: on_success
|
||||
when: manual
|
||||
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
||||
changes:
|
||||
- briar-android/**/*
|
||||
@@ -85,35 +85,43 @@ test_reproducible:
|
||||
|
||||
.optional_tests:
|
||||
stage: optional_tests
|
||||
before_script:
|
||||
- set -e
|
||||
- export GRADLE_USER_HOME=$PWD/.gradle
|
||||
|
||||
cache:
|
||||
key: "$CI_COMMIT_REF_SLUG"
|
||||
paths:
|
||||
- .gradle/wrapper
|
||||
- .gradle/caches
|
||||
|
||||
script:
|
||||
- OPTIONAL_TESTS=org.briarproject.bramble.plugin.tor.BridgeTest ./gradlew --info bramble-java:test --tests BridgeTest
|
||||
|
||||
after_script:
|
||||
# these file change every time but should not be cached
|
||||
- rm -f $GRADLE_USER_HOME/caches/modules-2/modules-2.lock
|
||||
- rm -fr $GRADLE_USER_HOME/caches/*/plugin-resolution/
|
||||
extends: .base-test
|
||||
|
||||
bridge test:
|
||||
extends: .optional_tests
|
||||
rules:
|
||||
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
||||
when: on_success
|
||||
allow_failure: true
|
||||
allow_failure: false
|
||||
- if: '$CI_COMMIT_TAG == null'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
script:
|
||||
- OPTIONAL_TESTS=org.briarproject.bramble.plugin.tor.BridgeTest ./gradlew --info bramble-java:test --tests BridgeTest
|
||||
|
||||
mailbox integration test:
|
||||
extends: .optional_tests
|
||||
rules:
|
||||
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
||||
when: on_success
|
||||
allow_failure: false
|
||||
- if: '$CI_COMMIT_TAG == null'
|
||||
when: manual
|
||||
allow_failure: false
|
||||
script:
|
||||
# start mailbox
|
||||
- cd /opt && git clone --depth 1 https://code.briarproject.org/briar/briar-mailbox.git briar-mailbox
|
||||
- cd briar-mailbox
|
||||
- mkdir -p /root/.local/share # create directory that mailbox (currently) expects to exist
|
||||
- ./gradlew run --args="--debug --setup-token 54686973206973206120736574757020746f6b656e20666f722042726961722e" &
|
||||
# run mailbox integration test once mailbox has started
|
||||
- cd "$CI_PROJECT_DIR"
|
||||
- bramble-core/src/test/bash/wait-for-mailbox.sh
|
||||
- OPTIONAL_TESTS=org.briarproject.bramble.mailbox.MailboxIntegrationTest ./gradlew --info bramble-core:test --tests MailboxIntegrationTest
|
||||
|
||||
pre_release_tests:
|
||||
extends: .optional_tests
|
||||
script:
|
||||
- OPTIONAL_TESTS=org.briarproject.bramble.plugin.tor.BridgeTest ./gradlew --info bramble-java:test --tests BridgeTest
|
||||
only:
|
||||
- tags
|
||||
|
||||
@@ -22,6 +22,15 @@ our site.
|
||||
|
||||
[Wiki](https://code.briarproject.org/briar/briar/-/wikis/home)
|
||||
|
||||
## Reproducible builds
|
||||
|
||||
We provide [docker images](https://code.briarproject.org/briar/briar-reproducer#briar-reproducer)
|
||||
to ease the task of verifying that the published APK binaries
|
||||
include nothing but our publicly available source code.
|
||||
|
||||
You can either use those images or use them as a blueprint to build your own environment
|
||||
for reproduction.
|
||||
|
||||
## Donate
|
||||
|
||||
[](https://liberapay.com/Briar/donate) [](https://flattr.com/t/592836/)
|
||||
|
||||
@@ -15,8 +15,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 30
|
||||
versionCode 10403
|
||||
versionName "1.4.3"
|
||||
versionCode 10404
|
||||
versionName "1.4.4"
|
||||
consumerProguardFiles 'proguard-rules.txt'
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
@@ -53,7 +53,7 @@ dependencies {
|
||||
testImplementation "junit:junit:$junit_version"
|
||||
testImplementation "org.jmock:jmock:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-junit4:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-legacy:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-imposters:$jmock_version"
|
||||
}
|
||||
|
||||
def torBinariesDir = 'src/main/res/raw'
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
-keep,includedescriptorclasses class org.briarproject.** { *; }
|
||||
|
||||
-keep class org.h2.** { *; }
|
||||
# Keep the H2 classes that are loaded via reflection
|
||||
-keep class org.h2.Driver { *; }
|
||||
-keep class org.h2.engine.Engine { *; }
|
||||
-keep class org.h2.store.fs.** { *; }
|
||||
# Don't warn about unused dependencies of H2 classes
|
||||
-dontwarn org.h2.**
|
||||
-dontnote org.h2.**
|
||||
|
||||
@@ -15,5 +17,4 @@
|
||||
-dontwarn sun.misc.Unsafe
|
||||
-dontnote com.google.common.**
|
||||
|
||||
# UPnP library isn't used
|
||||
-dontwarn org.bitlet.weupnp.**
|
||||
-dontwarn com.fasterxml.jackson.databind.ext.Java7SupportImpl
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.briarproject.bramble.api.db.DatabaseConfig;
|
||||
import org.briarproject.bramble.api.identity.IdentityManager;
|
||||
import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -44,7 +44,7 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
|
||||
private AndroidAccountManager accountManager;
|
||||
|
||||
public AndroidAccountManagerTest() {
|
||||
context.setImposteriser(ClassImposteriser.INSTANCE);
|
||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
||||
app = context.mock(Application.class);
|
||||
applicationInfo = new ApplicationInfo();
|
||||
applicationInfo.dataDir = testDir.getAbsolutePath();
|
||||
|
||||
@@ -13,7 +13,6 @@ dependencies {
|
||||
testImplementation "junit:junit:$junit_version"
|
||||
testImplementation "org.jmock:jmock:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-junit4:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-legacy:$jmock_version"
|
||||
|
||||
signature 'org.codehaus.mojo.signature:java16:1.1@signature'
|
||||
}
|
||||
|
||||
@@ -10,4 +10,10 @@ public interface FeatureFlags {
|
||||
boolean shouldEnableProfilePictures();
|
||||
|
||||
boolean shouldEnableDisappearingMessages();
|
||||
|
||||
boolean shouldEnablePrivateGroupsInCore();
|
||||
|
||||
boolean shouldEnableForumsInCore();
|
||||
|
||||
boolean shouldEnableBlogsInCore();
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.briarproject.briar.feed;
|
||||
package org.briarproject.bramble.api;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
|
||||
@@ -13,7 +13,7 @@ import javax.inject.Provider;
|
||||
* collected.
|
||||
*/
|
||||
@NotNullByDefault
|
||||
abstract class WeakSingletonProvider<T> implements Provider<T> {
|
||||
public abstract class WeakSingletonProvider<T> implements Provider<T> {
|
||||
|
||||
private final Object lock = new Object();
|
||||
@GuardedBy("lock")
|
||||
@@ -31,5 +31,5 @@ abstract class WeakSingletonProvider<T> implements Provider<T> {
|
||||
}
|
||||
}
|
||||
|
||||
abstract T createInstance();
|
||||
public abstract T createInstance();
|
||||
}
|
||||
@@ -113,6 +113,26 @@ public interface ContactManager {
|
||||
*/
|
||||
String getHandshakeLink(Transaction txn) throws DbException;
|
||||
|
||||
/**
|
||||
* Creates a {@link PendingContact} from the given handshake link and
|
||||
* alias, adds it to the database and returns it.
|
||||
*
|
||||
* @param link The handshake link received from the pending contact
|
||||
* @param alias The alias the user has given this pending contact
|
||||
* @throws UnsupportedVersionException If the link uses a format version
|
||||
* that is not supported
|
||||
* @throws FormatException If the link is invalid
|
||||
* @throws GeneralSecurityException If the pending contact's handshake
|
||||
* public key is invalid
|
||||
* @throws ContactExistsException If a contact with the same handshake
|
||||
* public key already exists
|
||||
* @throws PendingContactExistsException If a pending contact with the same
|
||||
* handshake public key already exists
|
||||
*/
|
||||
PendingContact addPendingContact(Transaction txn, String link, String alias)
|
||||
throws DbException, FormatException, GeneralSecurityException,
|
||||
ContactExistsException, PendingContactExistsException;
|
||||
|
||||
/**
|
||||
* Creates a {@link PendingContact} from the given handshake link and
|
||||
* alias, adds it to the database and returns it.
|
||||
@@ -146,6 +166,13 @@ public interface ContactManager {
|
||||
Collection<Pair<PendingContact, PendingContactState>> getPendingContacts()
|
||||
throws DbException;
|
||||
|
||||
/**
|
||||
* Returns a list of {@link PendingContact PendingContacts} and their
|
||||
* {@link PendingContactState states}.
|
||||
*/
|
||||
Collection<Pair<PendingContact, PendingContactState>> getPendingContacts(Transaction txn)
|
||||
throws DbException;
|
||||
|
||||
/**
|
||||
* Removes a {@link PendingContact}.
|
||||
*/
|
||||
|
||||
@@ -31,6 +31,7 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
@@ -46,6 +47,7 @@ import static org.briarproject.bramble.api.sync.ClientId.MAX_CLIENT_ID_LENGTH;
|
||||
import static org.briarproject.bramble.api.sync.SyncConstants.MAX_GROUP_DESCRIPTOR_LENGTH;
|
||||
import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH;
|
||||
import static org.briarproject.bramble.util.StringUtils.getRandomString;
|
||||
import static org.briarproject.bramble.util.StringUtils.toHexString;
|
||||
|
||||
public class TestUtils {
|
||||
|
||||
@@ -209,6 +211,10 @@ public class TestUtils {
|
||||
getAgreementPublicKey(), verified);
|
||||
}
|
||||
|
||||
public static String getMailboxSecret() {
|
||||
return toHexString(getRandomBytes(32)).toLowerCase(Locale.US);
|
||||
}
|
||||
|
||||
public static double getMedian(Collection<? extends Number> samples) {
|
||||
int size = samples.size();
|
||||
if (size == 0) throw new IllegalArgumentException();
|
||||
|
||||
@@ -10,13 +10,18 @@ apply from: '../dagger.gradle'
|
||||
|
||||
dependencies {
|
||||
implementation project(path: ':bramble-api', configuration: 'default')
|
||||
implementation 'org.bouncycastle:bcprov-jdk15on:1.69'
|
||||
implementation 'org.bouncycastle:bcprov-jdk15to18:1.70'
|
||||
//noinspection GradleDependency
|
||||
implementation 'com.h2database:h2:1.4.192' // The last version that supports Java 1.6
|
||||
implementation 'org.bitlet:weupnp:0.1.4'
|
||||
implementation 'net.i2p.crypto:eddsa:0.2.0'
|
||||
implementation 'org.whispersystems:curve25519-java:0.5.0'
|
||||
implementation 'org.briarproject:jtorctl:0.3'
|
||||
|
||||
//noinspection GradleDependency
|
||||
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
|
||||
implementation "com.fasterxml.jackson.core:jackson-databind:$jackson_version"
|
||||
|
||||
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
||||
|
||||
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
|
||||
@@ -25,7 +30,8 @@ dependencies {
|
||||
testImplementation "junit:junit:$junit_version"
|
||||
testImplementation "org.jmock:jmock:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-junit4:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-legacy:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-imposters:$jmock_version"
|
||||
testImplementation "com.squareup.okhttp3:mockwebserver:4.9.3"
|
||||
|
||||
testAnnotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
||||
|
||||
|
||||
@@ -131,22 +131,29 @@ class ContactManagerImpl implements ContactManager, EventListener {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PendingContact addPendingContact(String link, String alias)
|
||||
public PendingContact addPendingContact(Transaction txn, String link, String alias)
|
||||
throws DbException, FormatException, GeneralSecurityException {
|
||||
PendingContact p =
|
||||
pendingContactFactory.createPendingContact(link, alias);
|
||||
AuthorId local = identityManager.getLocalAuthor(txn).getId();
|
||||
db.addPendingContact(txn, p, local);
|
||||
KeyPair ourKeyPair = identityManager.getHandshakeKeys(txn);
|
||||
keyManager.addPendingContact(txn, p.getId(), p.getPublicKey(),
|
||||
ourKeyPair);
|
||||
return p;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PendingContact addPendingContact(String link, String alias)
|
||||
throws DbException, FormatException, GeneralSecurityException {
|
||||
Transaction txn = db.startTransaction(false);
|
||||
try {
|
||||
AuthorId local = identityManager.getLocalAuthor(txn).getId();
|
||||
db.addPendingContact(txn, p, local);
|
||||
KeyPair ourKeyPair = identityManager.getHandshakeKeys(txn);
|
||||
keyManager.addPendingContact(txn, p.getId(), p.getPublicKey(),
|
||||
ourKeyPair);
|
||||
PendingContact p = addPendingContact(txn, link, alias);
|
||||
db.commitTransaction(txn);
|
||||
return p;
|
||||
} finally {
|
||||
db.endTransaction(txn);
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -158,8 +165,13 @@ class ContactManagerImpl implements ContactManager, EventListener {
|
||||
@Override
|
||||
public Collection<Pair<PendingContact, PendingContactState>> getPendingContacts()
|
||||
throws DbException {
|
||||
Collection<PendingContact> pendingContacts =
|
||||
db.transactionWithResult(true, db::getPendingContacts);
|
||||
return db.transactionWithResult(true, this::getPendingContacts);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Pair<PendingContact, PendingContactState>> getPendingContacts(Transaction txn)
|
||||
throws DbException {
|
||||
Collection<PendingContact> pendingContacts = db.getPendingContacts(txn);
|
||||
List<Pair<PendingContact, PendingContactState>> pairs =
|
||||
new ArrayList<>(pendingContacts.size());
|
||||
for (PendingContact p : pendingContacts) {
|
||||
|
||||
@@ -1,18 +1,49 @@
|
||||
package org.briarproject.bramble.io;
|
||||
|
||||
import org.briarproject.bramble.api.WeakSingletonProvider;
|
||||
import org.briarproject.bramble.api.io.TimeoutMonitor;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.inject.Singleton;
|
||||
import javax.net.SocketFactory;
|
||||
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
import okhttp3.Dns;
|
||||
import okhttp3.OkHttpClient;
|
||||
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
|
||||
@Module
|
||||
public class IoModule {
|
||||
|
||||
private static final int CONNECT_TIMEOUT = 60_000; // Milliseconds
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
TimeoutMonitor provideTimeoutMonitor(TimeoutMonitorImpl timeoutMonitor) {
|
||||
return timeoutMonitor;
|
||||
}
|
||||
|
||||
// Share an HTTP client instance between requests where possible, while
|
||||
// allowing the client to be garbage-collected between requests. The
|
||||
// provider keeps a weak reference to the last client instance and reuses
|
||||
// the instance until it gets garbage-collected. See
|
||||
// https://medium.com/@leandromazzuquini/if-you-are-using-okhttp-you-should-know-this-61d68e065a2b
|
||||
@Provides
|
||||
@Singleton
|
||||
WeakSingletonProvider<OkHttpClient> provideOkHttpClientProvider(
|
||||
SocketFactory torSocketFactory, Dns noDnsLookups) {
|
||||
return new WeakSingletonProvider<OkHttpClient>() {
|
||||
@Override
|
||||
@Nonnull
|
||||
public OkHttpClient createInstance() {
|
||||
return new OkHttpClient.Builder()
|
||||
.socketFactory(torSocketFactory)
|
||||
.dns(noDnsLookups) // Don't make local DNS lookups
|
||||
.connectTimeout(CONNECT_TIMEOUT, MILLISECONDS)
|
||||
.build();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
package org.briarproject.bramble.mailbox;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
|
||||
import org.briarproject.bramble.api.contact.ContactId;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxProperties;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
|
||||
interface MailboxApi {
|
||||
|
||||
/**
|
||||
* Sets up the mailbox with the setup token.
|
||||
*
|
||||
* @param properties MailboxProperties with the setup token
|
||||
* @return the owner token
|
||||
* @throws ApiException for 401 response.
|
||||
*/
|
||||
String setup(MailboxProperties properties)
|
||||
throws IOException, ApiException;
|
||||
|
||||
/**
|
||||
* Checks the status of the mailbox.
|
||||
*
|
||||
* @return true if the status is OK, false otherwise.
|
||||
* @throws ApiException for 401 response.
|
||||
*/
|
||||
boolean checkStatus(MailboxProperties properties)
|
||||
throws IOException, ApiException;
|
||||
|
||||
/**
|
||||
* Adds a new contact to the mailbox.
|
||||
*
|
||||
* @throws TolerableFailureException if response code is 409
|
||||
* (contact was already added).
|
||||
*/
|
||||
void addContact(MailboxProperties properties, MailboxContact contact)
|
||||
throws IOException, ApiException, TolerableFailureException;
|
||||
|
||||
/**
|
||||
* Deletes a contact from the mailbox.
|
||||
* This should get called after a contact was removed from Briar.
|
||||
*
|
||||
* @throws TolerableFailureException if response code is 404
|
||||
* (contact probably was already deleted).
|
||||
*/
|
||||
void deleteContact(MailboxProperties properties, ContactId contactId)
|
||||
throws IOException, ApiException, TolerableFailureException;
|
||||
|
||||
/**
|
||||
* Gets a list of {@link ContactId}s from the mailbox.
|
||||
* These are the contacts that the mailbox already knows about.
|
||||
*/
|
||||
Collection<ContactId> getContacts(MailboxProperties properties)
|
||||
throws IOException, ApiException;
|
||||
|
||||
@Immutable
|
||||
@JsonSerialize
|
||||
class MailboxContact {
|
||||
public final int contactId;
|
||||
public final String token, inboxId, outboxId;
|
||||
|
||||
MailboxContact(ContactId contactId,
|
||||
String token,
|
||||
String inboxId,
|
||||
String outboxId) {
|
||||
this.contactId = contactId.getInt();
|
||||
this.token = token;
|
||||
this.inboxId = inboxId;
|
||||
this.outboxId = outboxId;
|
||||
}
|
||||
}
|
||||
|
||||
@Immutable
|
||||
class ApiException extends Exception {
|
||||
}
|
||||
|
||||
/**
|
||||
* A failure that does not need to be retried,
|
||||
* e.g. when adding a contact that already exists.
|
||||
*/
|
||||
@Immutable
|
||||
class TolerableFailureException extends Exception {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
package org.briarproject.bramble.mailbox;
|
||||
|
||||
import com.fasterxml.jackson.core.JacksonException;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.json.JsonMapper;
|
||||
|
||||
import org.briarproject.bramble.api.WeakSingletonProvider;
|
||||
import org.briarproject.bramble.api.contact.ContactId;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxProperties;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import okhttp3.MediaType;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.RequestBody;
|
||||
import okhttp3.Response;
|
||||
import okhttp3.ResponseBody;
|
||||
|
||||
import static com.fasterxml.jackson.databind.MapperFeature.BLOCK_UNSAFE_POLYMORPHIC_BASE_TYPES;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static okhttp3.internal.Util.EMPTY_REQUEST;
|
||||
import static org.briarproject.bramble.util.StringUtils.fromHexString;
|
||||
|
||||
@NotNullByDefault
|
||||
class MailboxApiImpl implements MailboxApi {
|
||||
|
||||
private final WeakSingletonProvider<OkHttpClient> httpClientProvider;
|
||||
private final JsonMapper mapper = JsonMapper.builder()
|
||||
.enable(BLOCK_UNSAFE_POLYMORPHIC_BASE_TYPES)
|
||||
.build();
|
||||
private static final MediaType JSON =
|
||||
requireNonNull(MediaType.parse("application/json; charset=utf-8"));
|
||||
|
||||
@Inject
|
||||
MailboxApiImpl(WeakSingletonProvider<OkHttpClient> httpClientProvider) {
|
||||
this.httpClientProvider = httpClientProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String setup(MailboxProperties properties)
|
||||
throws IOException, ApiException {
|
||||
if (!properties.isOwner()) throw new IllegalArgumentException();
|
||||
Request request = getRequestBuilder(properties.getAuthToken())
|
||||
.url(properties.getOnionAddress() + "/setup")
|
||||
.put(EMPTY_REQUEST)
|
||||
.build();
|
||||
OkHttpClient client = httpClientProvider.get();
|
||||
Response response = client.newCall(request).execute();
|
||||
// TODO consider throwing a special exception for the 401 case
|
||||
if (response.code() == 401) throw new ApiException();
|
||||
if (!response.isSuccessful()) throw new ApiException();
|
||||
ResponseBody body = response.body();
|
||||
if (body == null) throw new ApiException();
|
||||
try {
|
||||
JsonNode node = mapper.readTree(body.string());
|
||||
JsonNode tokenNode = node.get("token");
|
||||
if (tokenNode == null) {
|
||||
throw new ApiException();
|
||||
}
|
||||
String ownerToken = tokenNode.textValue();
|
||||
if (ownerToken == null || !isValidToken(ownerToken)) {
|
||||
throw new ApiException();
|
||||
}
|
||||
return ownerToken;
|
||||
} catch (JacksonException e) {
|
||||
throw new ApiException();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isValidToken(String token) {
|
||||
if (token.length() != 64) return false;
|
||||
try {
|
||||
// try to convert to bytes
|
||||
fromHexString(token);
|
||||
return true;
|
||||
} catch (IllegalArgumentException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkStatus(MailboxProperties properties)
|
||||
throws IOException, ApiException {
|
||||
if (!properties.isOwner()) throw new IllegalArgumentException();
|
||||
Response response = sendGetRequest(properties, "/status");
|
||||
if (response.code() == 401) throw new ApiException();
|
||||
return response.isSuccessful();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addContact(MailboxProperties properties, MailboxContact contact)
|
||||
throws IOException, ApiException,
|
||||
TolerableFailureException {
|
||||
if (!properties.isOwner()) throw new IllegalArgumentException();
|
||||
byte[] bodyBytes = mapper.writeValueAsBytes(contact);
|
||||
RequestBody body = RequestBody.create(JSON, bodyBytes);
|
||||
Request request = getRequestBuilder(properties.getAuthToken())
|
||||
.url(properties.getOnionAddress() + "/contacts")
|
||||
.post(body)
|
||||
.build();
|
||||
OkHttpClient client = httpClientProvider.get();
|
||||
Response response = client.newCall(request).execute();
|
||||
if (response.code() == 409) throw new TolerableFailureException();
|
||||
if (!response.isSuccessful()) throw new ApiException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteContact(MailboxProperties properties, ContactId contactId)
|
||||
throws IOException, ApiException, TolerableFailureException {
|
||||
if (!properties.isOwner()) throw new IllegalArgumentException();
|
||||
String url = properties.getOnionAddress() + "/contacts/" +
|
||||
contactId.getInt();
|
||||
Request request = getRequestBuilder(properties.getAuthToken())
|
||||
.delete()
|
||||
.url(url)
|
||||
.build();
|
||||
OkHttpClient client = httpClientProvider.get();
|
||||
Response response = client.newCall(request).execute();
|
||||
if (response.code() == 404) throw new TolerableFailureException();
|
||||
if (response.code() != 200) throw new ApiException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ContactId> getContacts(MailboxProperties properties)
|
||||
throws IOException, ApiException {
|
||||
if (!properties.isOwner()) throw new IllegalArgumentException();
|
||||
Response response = sendGetRequest(properties, "/contacts");
|
||||
if (response.code() != 200) throw new ApiException();
|
||||
|
||||
ResponseBody body = response.body();
|
||||
if (body == null) throw new ApiException();
|
||||
try {
|
||||
JsonNode node = mapper.readTree(body.string());
|
||||
JsonNode contactsNode = node.get("contacts");
|
||||
if (contactsNode == null || !contactsNode.isArray()) {
|
||||
throw new ApiException();
|
||||
}
|
||||
List<ContactId> list = new ArrayList<>();
|
||||
for (JsonNode contactNode : contactsNode) {
|
||||
if (!contactNode.isNumber()) throw new ApiException();
|
||||
int id = contactNode.intValue();
|
||||
if (id < 1) throw new ApiException();
|
||||
list.add(new ContactId(id));
|
||||
}
|
||||
return list;
|
||||
} catch (JacksonException e) {
|
||||
throw new ApiException();
|
||||
}
|
||||
}
|
||||
|
||||
private Response sendGetRequest(MailboxProperties properties, String path)
|
||||
throws IOException {
|
||||
Request request = getRequestBuilder(properties.getAuthToken())
|
||||
.url(properties.getOnionAddress() + path)
|
||||
.build();
|
||||
OkHttpClient client = httpClientProvider.get();
|
||||
return client.newCall(request).execute();
|
||||
}
|
||||
|
||||
private Request.Builder getRequestBuilder(String token) {
|
||||
return new Request.Builder()
|
||||
.addHeader("Authorization", "Bearer " + token);
|
||||
}
|
||||
|
||||
}
|
||||
21
bramble-core/src/test/bash/wait-for-mailbox.sh
Executable file
21
bramble-core/src/test/bash/wait-for-mailbox.sh
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
URL="http://127.0.0.1:8000/status"
|
||||
attempt_counter=0
|
||||
max_attempts=200 # 10min - CI for mailbox currently takes ~5min
|
||||
|
||||
echo "Waiting for mailbox to come online at $URL"
|
||||
|
||||
until [[ "$(curl -s -o /dev/null -w '%{http_code}' $URL)" == "401" ]]; do
|
||||
if [ ${attempt_counter} -eq ${max_attempts} ]; then
|
||||
echo "Timed out waiting for mailbox"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf '.'
|
||||
attempt_counter=$((attempt_counter + 1))
|
||||
sleep 3
|
||||
done
|
||||
|
||||
echo "Mailbox started"
|
||||
@@ -13,7 +13,7 @@ import org.briarproject.bramble.api.sync.Message;
|
||||
import org.briarproject.bramble.api.sync.MessageContext;
|
||||
import org.briarproject.bramble.test.ValidatorTestCase;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.briarproject.bramble.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE;
|
||||
@@ -38,7 +38,7 @@ public class BdfMessageValidatorTest extends ValidatorTestCase {
|
||||
private final Metadata meta = new Metadata();
|
||||
|
||||
public BdfMessageValidatorTest() {
|
||||
context.setImposteriser(ClassImposteriser.INSTANCE);
|
||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
||||
}
|
||||
|
||||
@Test(expected = InvalidMessageException.class)
|
||||
|
||||
@@ -11,9 +11,9 @@ import org.briarproject.bramble.api.keyagreement.PayloadEncoder;
|
||||
import org.briarproject.bramble.test.BrambleTestCase;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.auto.Mock;
|
||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
||||
import org.jmock.integration.junit4.JUnitRuleMockery;
|
||||
import org.jmock.lib.concurrent.Synchroniser;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
@@ -35,7 +35,7 @@ public class KeyAgreementProtocolTest extends BrambleTestCase {
|
||||
@Rule
|
||||
public JUnitRuleMockery context = new JUnitRuleMockery() {{
|
||||
// So we can mock concrete classes like KeyAgreementTransport
|
||||
setImposteriser(ClassImposteriser.INSTANCE);
|
||||
setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
||||
setThreadingPolicy(new Synchroniser());
|
||||
}};
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ import org.briarproject.bramble.api.record.RecordWriterFactory;
|
||||
import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||
import org.briarproject.bramble.test.CaptureArgumentAction;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.InputStream;
|
||||
@@ -58,7 +58,7 @@ public class KeyAgreementTransportTest extends BrambleMockTestCase {
|
||||
private KeyAgreementTransport kat;
|
||||
|
||||
public KeyAgreementTransportTest() {
|
||||
context.setImposteriser(ClassImposteriser.INSTANCE);
|
||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
||||
inputStream = context.mock(InputStream.class);
|
||||
outputStream = context.mock(OutputStream.class);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,383 @@
|
||||
package org.briarproject.bramble.mailbox;
|
||||
|
||||
import org.briarproject.bramble.api.WeakSingletonProvider;
|
||||
import org.briarproject.bramble.api.contact.ContactId;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxProperties;
|
||||
import org.briarproject.bramble.mailbox.MailboxApi.ApiException;
|
||||
import org.briarproject.bramble.mailbox.MailboxApi.MailboxContact;
|
||||
import org.briarproject.bramble.mailbox.MailboxApi.TolerableFailureException;
|
||||
import org.briarproject.bramble.test.BrambleTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.net.SocketFactory;
|
||||
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.mockwebserver.MockResponse;
|
||||
import okhttp3.mockwebserver.MockWebServer;
|
||||
import okhttp3.mockwebserver.RecordedRequest;
|
||||
|
||||
import static java.util.Collections.singletonList;
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
import static org.briarproject.bramble.test.TestUtils.getContactId;
|
||||
import static org.briarproject.bramble.test.TestUtils.getMailboxSecret;
|
||||
import static org.briarproject.bramble.util.StringUtils.getRandomString;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertThrows;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class MailboxApiTest extends BrambleTestCase {
|
||||
|
||||
private final OkHttpClient client = new OkHttpClient.Builder()
|
||||
.socketFactory(SocketFactory.getDefault())
|
||||
.connectTimeout(60_000, MILLISECONDS)
|
||||
.build();
|
||||
private final WeakSingletonProvider<OkHttpClient> httpClientProvider =
|
||||
new WeakSingletonProvider<OkHttpClient>() {
|
||||
@Override
|
||||
@Nonnull
|
||||
public OkHttpClient createInstance() {
|
||||
return client;
|
||||
}
|
||||
};
|
||||
private final MailboxApiImpl api = new MailboxApiImpl(httpClientProvider);
|
||||
|
||||
private final String token = getMailboxSecret();
|
||||
private final String token2 = getMailboxSecret();
|
||||
private final ContactId contactId = getContactId();
|
||||
private final String contactToken = getMailboxSecret();
|
||||
private final String contactInboxId = getMailboxSecret();
|
||||
private final String contactOutboxId = getMailboxSecret();
|
||||
private final MailboxContact mailboxContact = new MailboxContact(
|
||||
contactId, contactToken, contactInboxId, contactOutboxId);
|
||||
|
||||
@Test
|
||||
public void testSetup() throws Exception {
|
||||
String validResponse = "{\"token\":\"" + token2 + "\"}";
|
||||
String invalidResponse = "{\"foo\":\"bar\"}";
|
||||
String invalidTokenResponse = "{\"token\":{\"foo\":\"bar\"}}";
|
||||
String invalidTokenResponse2 =
|
||||
"{\"token\":\"" + getRandomString(64) + "\"}";
|
||||
|
||||
MockWebServer server = new MockWebServer();
|
||||
server.enqueue(new MockResponse().setBody(validResponse));
|
||||
server.enqueue(new MockResponse());
|
||||
server.enqueue(new MockResponse().setBody(invalidResponse));
|
||||
server.enqueue(new MockResponse().setResponseCode(401));
|
||||
server.enqueue(new MockResponse().setResponseCode(500));
|
||||
server.enqueue(new MockResponse().setBody(invalidTokenResponse));
|
||||
server.enqueue(new MockResponse().setBody(invalidTokenResponse2));
|
||||
server.start();
|
||||
String baseUrl = getBaseUrl(server);
|
||||
MailboxProperties properties =
|
||||
new MailboxProperties(baseUrl, token, true);
|
||||
MailboxProperties properties2 =
|
||||
new MailboxProperties(baseUrl, token2, true);
|
||||
|
||||
// valid response with valid token
|
||||
assertEquals(token2, api.setup(properties));
|
||||
RecordedRequest request1 = server.takeRequest();
|
||||
assertEquals("/setup", request1.getPath());
|
||||
assertEquals("PUT", request1.getMethod());
|
||||
assertToken(request1, token);
|
||||
|
||||
// empty body
|
||||
assertThrows(ApiException.class, () -> api.setup(properties));
|
||||
RecordedRequest request2 = server.takeRequest();
|
||||
assertEquals("/setup", request2.getPath());
|
||||
assertEquals("PUT", request2.getMethod());
|
||||
assertToken(request2, token);
|
||||
|
||||
// invalid response
|
||||
assertThrows(ApiException.class, () -> api.setup(properties));
|
||||
RecordedRequest request3 = server.takeRequest();
|
||||
assertEquals("/setup", request3.getPath());
|
||||
assertEquals("PUT", request3.getMethod());
|
||||
assertToken(request3, token);
|
||||
|
||||
// 401 response
|
||||
assertThrows(ApiException.class, () -> api.setup(properties2));
|
||||
RecordedRequest request4 = server.takeRequest();
|
||||
assertEquals("/setup", request4.getPath());
|
||||
assertEquals("PUT", request4.getMethod());
|
||||
assertToken(request4, token2);
|
||||
|
||||
// 500 response
|
||||
assertThrows(ApiException.class, () -> api.setup(properties));
|
||||
RecordedRequest request5 = server.takeRequest();
|
||||
assertEquals("/setup", request5.getPath());
|
||||
assertEquals("PUT", request5.getMethod());
|
||||
assertToken(request5, token);
|
||||
|
||||
// invalid json dict token response
|
||||
assertThrows(ApiException.class, () -> api.setup(properties));
|
||||
RecordedRequest request6 = server.takeRequest();
|
||||
assertEquals("/setup", request6.getPath());
|
||||
assertEquals("PUT", request6.getMethod());
|
||||
assertToken(request6, token);
|
||||
|
||||
// invalid non-hex string token response
|
||||
assertThrows(ApiException.class, () -> api.setup(properties));
|
||||
RecordedRequest request7 = server.takeRequest();
|
||||
assertEquals("/setup", request7.getPath());
|
||||
assertEquals("PUT", request7.getMethod());
|
||||
assertToken(request7, token);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetupOnlyForOwner() {
|
||||
MailboxProperties properties =
|
||||
new MailboxProperties("", token, false);
|
||||
assertThrows(
|
||||
IllegalArgumentException.class,
|
||||
() -> api.setup(properties)
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStatus() throws Exception {
|
||||
MockWebServer server = new MockWebServer();
|
||||
server.enqueue(new MockResponse());
|
||||
server.enqueue(new MockResponse().setResponseCode(401));
|
||||
server.enqueue(new MockResponse().setResponseCode(500));
|
||||
server.start();
|
||||
String baseUrl = getBaseUrl(server);
|
||||
MailboxProperties properties =
|
||||
new MailboxProperties(baseUrl, token, true);
|
||||
MailboxProperties properties2 =
|
||||
new MailboxProperties(baseUrl, token2, true);
|
||||
|
||||
assertTrue(api.checkStatus(properties));
|
||||
RecordedRequest request1 = server.takeRequest();
|
||||
assertEquals("/status", request1.getPath());
|
||||
assertToken(request1, token);
|
||||
|
||||
assertThrows(ApiException.class, () -> api.checkStatus(properties2));
|
||||
RecordedRequest request2 = server.takeRequest();
|
||||
assertEquals("/status", request2.getPath());
|
||||
assertToken(request2, token2);
|
||||
|
||||
assertFalse(api.checkStatus(properties));
|
||||
RecordedRequest request3 = server.takeRequest();
|
||||
assertEquals("/status", request3.getPath());
|
||||
assertToken(request3, token);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStatusOnlyForOwner() {
|
||||
MailboxProperties properties =
|
||||
new MailboxProperties("", token, false);
|
||||
assertThrows(
|
||||
IllegalArgumentException.class,
|
||||
() -> api.checkStatus(properties)
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddContact() throws Exception {
|
||||
MockWebServer server = new MockWebServer();
|
||||
server.enqueue(new MockResponse());
|
||||
server.enqueue(new MockResponse().setResponseCode(401));
|
||||
server.enqueue(new MockResponse().setResponseCode(409));
|
||||
server.start();
|
||||
String baseUrl = getBaseUrl(server);
|
||||
MailboxProperties properties =
|
||||
new MailboxProperties(baseUrl, token, true);
|
||||
|
||||
// contact gets added as expected
|
||||
api.addContact(properties, mailboxContact);
|
||||
RecordedRequest request1 = server.takeRequest();
|
||||
assertEquals("/contacts", request1.getPath());
|
||||
assertToken(request1, token);
|
||||
String expected = "{\"contactId\":" + contactId.getInt() +
|
||||
",\"token\":\"" + contactToken +
|
||||
"\",\"inboxId\":\"" + contactInboxId +
|
||||
"\",\"outboxId\":\"" + contactOutboxId +
|
||||
"\"}";
|
||||
assertEquals(expected, request1.getBody().readUtf8());
|
||||
|
||||
// request is not successful
|
||||
assertThrows(ApiException.class, () ->
|
||||
api.addContact(properties, mailboxContact));
|
||||
RecordedRequest request2 = server.takeRequest();
|
||||
assertEquals("/contacts", request2.getPath());
|
||||
assertToken(request2, token);
|
||||
|
||||
// contact already exists
|
||||
assertThrows(TolerableFailureException.class, () ->
|
||||
api.addContact(properties, mailboxContact));
|
||||
RecordedRequest request3 = server.takeRequest();
|
||||
assertEquals("/contacts", request3.getPath());
|
||||
assertToken(request3, token);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddContactOnlyForOwner() {
|
||||
MailboxProperties properties =
|
||||
new MailboxProperties("", token, false);
|
||||
assertThrows(IllegalArgumentException.class, () ->
|
||||
api.addContact(properties, mailboxContact));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteContact() throws Exception {
|
||||
MockWebServer server = new MockWebServer();
|
||||
server.enqueue(new MockResponse());
|
||||
server.enqueue(new MockResponse().setResponseCode(205));
|
||||
server.enqueue(new MockResponse().setResponseCode(401));
|
||||
server.enqueue(new MockResponse().setResponseCode(404));
|
||||
server.start();
|
||||
String baseUrl = getBaseUrl(server);
|
||||
MailboxProperties properties =
|
||||
new MailboxProperties(baseUrl, token, true);
|
||||
|
||||
// contact gets deleted as expected
|
||||
api.deleteContact(properties, contactId);
|
||||
RecordedRequest request1 = server.takeRequest();
|
||||
assertEquals("DELETE", request1.getMethod());
|
||||
assertEquals("/contacts/" + contactId.getInt(), request1.getPath());
|
||||
assertToken(request1, token);
|
||||
|
||||
// request is not returning 200
|
||||
assertThrows(ApiException.class, () ->
|
||||
api.deleteContact(properties, contactId));
|
||||
RecordedRequest request2 = server.takeRequest();
|
||||
assertEquals("DELETE", request2.getMethod());
|
||||
assertEquals("/contacts/" + contactId.getInt(), request2.getPath());
|
||||
assertToken(request2, token);
|
||||
|
||||
// request is not authorized
|
||||
assertThrows(ApiException.class, () ->
|
||||
api.deleteContact(properties, contactId));
|
||||
RecordedRequest request3 = server.takeRequest();
|
||||
assertEquals("DELETE", request3.getMethod());
|
||||
assertEquals("/contacts/" + contactId.getInt(), request3.getPath());
|
||||
assertToken(request3, token);
|
||||
|
||||
// tolerable 404 not found error
|
||||
assertThrows(TolerableFailureException.class,
|
||||
() -> api.deleteContact(properties, contactId));
|
||||
RecordedRequest request4 = server.takeRequest();
|
||||
assertEquals("/contacts/" + contactId.getInt(), request4.getPath());
|
||||
assertEquals("DELETE", request4.getMethod());
|
||||
assertToken(request4, token);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteContactOnlyForOwner() {
|
||||
MailboxProperties properties =
|
||||
new MailboxProperties("", token, false);
|
||||
assertThrows(IllegalArgumentException.class, () ->
|
||||
api.deleteContact(properties, contactId));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetContacts() throws Exception {
|
||||
ContactId contactId2 = getContactId();
|
||||
String validResponse1 = "{\"contacts\": [" + contactId.getInt() + "] }";
|
||||
String validResponse2 = "{\"contacts\": [" + contactId.getInt() + ", " +
|
||||
contactId2.getInt() + "] }";
|
||||
String invalidResponse1 = "{\"foo\":\"bar\"}";
|
||||
String invalidResponse2 = "{\"contacts\":{\"foo\":\"bar\"}}";
|
||||
String invalidResponse3 = "{\"contacts\": [1, 2, \"foo\"] }";
|
||||
|
||||
MockWebServer server = new MockWebServer();
|
||||
server.enqueue(new MockResponse().setBody(validResponse1));
|
||||
server.enqueue(new MockResponse().setBody(validResponse2));
|
||||
server.enqueue(new MockResponse());
|
||||
server.enqueue(new MockResponse().setBody(invalidResponse1));
|
||||
server.enqueue(new MockResponse().setBody(invalidResponse2));
|
||||
server.enqueue(new MockResponse().setBody(invalidResponse3));
|
||||
server.enqueue(new MockResponse().setResponseCode(401));
|
||||
server.enqueue(new MockResponse().setResponseCode(500));
|
||||
server.start();
|
||||
String baseUrl = getBaseUrl(server);
|
||||
MailboxProperties properties =
|
||||
new MailboxProperties(baseUrl, token, true);
|
||||
|
||||
// valid response with two contacts
|
||||
assertEquals(singletonList(contactId), api.getContacts(properties));
|
||||
RecordedRequest request1 = server.takeRequest();
|
||||
assertEquals("/contacts", request1.getPath());
|
||||
assertEquals("GET", request1.getMethod());
|
||||
assertToken(request1, token);
|
||||
|
||||
// valid response with two contacts
|
||||
List<ContactId> contacts = new ArrayList<>();
|
||||
contacts.add(contactId);
|
||||
contacts.add(contactId2);
|
||||
assertEquals(contacts, api.getContacts(properties));
|
||||
RecordedRequest request2 = server.takeRequest();
|
||||
assertEquals("/contacts", request2.getPath());
|
||||
assertEquals("GET", request2.getMethod());
|
||||
assertToken(request2, token);
|
||||
|
||||
// empty body
|
||||
assertThrows(ApiException.class, () -> api.getContacts(properties));
|
||||
RecordedRequest request3 = server.takeRequest();
|
||||
assertEquals("/contacts", request3.getPath());
|
||||
assertEquals("GET", request3.getMethod());
|
||||
assertToken(request3, token);
|
||||
|
||||
// invalid response: no contacts key
|
||||
assertThrows(ApiException.class, () -> api.getContacts(properties));
|
||||
RecordedRequest request4 = server.takeRequest();
|
||||
assertEquals("/contacts", request4.getPath());
|
||||
assertEquals("GET", request4.getMethod());
|
||||
assertToken(request4, token);
|
||||
|
||||
// invalid response: no list in contacts
|
||||
assertThrows(ApiException.class, () -> api.getContacts(properties));
|
||||
RecordedRequest request5 = server.takeRequest();
|
||||
assertEquals("/contacts", request5.getPath());
|
||||
assertEquals("GET", request5.getMethod());
|
||||
assertToken(request5, token);
|
||||
|
||||
// invalid response: list with non-numbers
|
||||
assertThrows(ApiException.class, () -> api.getContacts(properties));
|
||||
RecordedRequest request6 = server.takeRequest();
|
||||
assertEquals("/contacts", request6.getPath());
|
||||
assertEquals("GET", request6.getMethod());
|
||||
assertToken(request6, token);
|
||||
|
||||
// 401 not authorized
|
||||
assertThrows(ApiException.class, () -> api.getContacts(properties));
|
||||
RecordedRequest request7 = server.takeRequest();
|
||||
assertEquals("/contacts", request7.getPath());
|
||||
assertEquals("GET", request7.getMethod());
|
||||
assertToken(request7, token);
|
||||
|
||||
// 500 internal server error
|
||||
assertThrows(ApiException.class, () -> api.getContacts(properties));
|
||||
RecordedRequest request8 = server.takeRequest();
|
||||
assertEquals("/contacts", request8.getPath());
|
||||
assertEquals("GET", request8.getMethod());
|
||||
assertToken(request8, token);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetContactsOnlyForOwner() {
|
||||
MailboxProperties properties =
|
||||
new MailboxProperties("", token, false);
|
||||
assertThrows(
|
||||
IllegalArgumentException.class,
|
||||
() -> api.getContacts(properties)
|
||||
);
|
||||
}
|
||||
|
||||
private String getBaseUrl(MockWebServer server) {
|
||||
String baseUrl = server.url("").toString();
|
||||
return baseUrl.substring(0, baseUrl.length() - 1);
|
||||
}
|
||||
|
||||
private void assertToken(RecordedRequest request, String token) {
|
||||
assertNotNull(request.getHeader("Authorization"));
|
||||
assertEquals("Bearer " + token, request.getHeader("Authorization"));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
package org.briarproject.bramble.mailbox;
|
||||
|
||||
import org.briarproject.bramble.api.WeakSingletonProvider;
|
||||
import org.briarproject.bramble.api.contact.ContactId;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxProperties;
|
||||
import org.briarproject.bramble.mailbox.MailboxApi.ApiException;
|
||||
import org.briarproject.bramble.mailbox.MailboxApi.MailboxContact;
|
||||
import org.briarproject.bramble.mailbox.MailboxApi.TolerableFailureException;
|
||||
import org.briarproject.bramble.test.BrambleTestCase;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.net.SocketFactory;
|
||||
|
||||
import okhttp3.OkHttpClient;
|
||||
|
||||
import static java.util.Collections.emptyList;
|
||||
import static java.util.Collections.singletonList;
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
import static org.briarproject.bramble.test.TestUtils.getMailboxSecret;
|
||||
import static org.briarproject.bramble.test.TestUtils.isOptionalTestEnabled;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertThrows;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assume.assumeTrue;
|
||||
|
||||
public class MailboxIntegrationTest extends BrambleTestCase {
|
||||
|
||||
private final static String URL_BASE = "http://127.0.0.1:8000";
|
||||
private final static String SETUP_TOKEN =
|
||||
"54686973206973206120736574757020746f6b656e20666f722042726961722e";
|
||||
|
||||
private final OkHttpClient client = new OkHttpClient.Builder()
|
||||
.socketFactory(SocketFactory.getDefault())
|
||||
.connectTimeout(60_000, MILLISECONDS)
|
||||
.build();
|
||||
private final WeakSingletonProvider<OkHttpClient> httpClientProvider =
|
||||
new WeakSingletonProvider<OkHttpClient>() {
|
||||
@Override
|
||||
@Nonnull
|
||||
public OkHttpClient createInstance() {
|
||||
return client;
|
||||
}
|
||||
};
|
||||
private final MailboxApiImpl api = new MailboxApiImpl(httpClientProvider);
|
||||
// needs to be static to keep values across different tests
|
||||
private static MailboxProperties ownerProperties;
|
||||
|
||||
/**
|
||||
* Called before each test to make sure the mailbox is setup once
|
||||
* before starting with individual tests.
|
||||
* {@link BeforeClass} needs to be static, so we can't use the API class.
|
||||
*/
|
||||
@Before
|
||||
public void ensureSetup() throws IOException, ApiException {
|
||||
// Skip this test unless it's explicitly enabled in the environment
|
||||
assumeTrue(isOptionalTestEnabled(MailboxIntegrationTest.class));
|
||||
|
||||
if (ownerProperties != null) return;
|
||||
MailboxProperties setupProperties =
|
||||
new MailboxProperties(URL_BASE, SETUP_TOKEN, true);
|
||||
String ownerToken = api.setup(setupProperties);
|
||||
ownerProperties = new MailboxProperties(URL_BASE, ownerToken, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStatus() throws Exception {
|
||||
assertTrue(api.checkStatus(ownerProperties));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testContactApi() throws Exception {
|
||||
ContactId contactId1 = new ContactId(1);
|
||||
ContactId contactId2 = new ContactId(2);
|
||||
MailboxContact mailboxContact1 = getMailboxContact(contactId1);
|
||||
MailboxContact mailboxContact2 = getMailboxContact(contactId2);
|
||||
|
||||
// no contacts initially
|
||||
assertEquals(emptyList(), api.getContacts(ownerProperties));
|
||||
// added contact gets returned
|
||||
api.addContact(ownerProperties, mailboxContact1);
|
||||
assertEquals(singletonList(contactId1),
|
||||
api.getContacts(ownerProperties));
|
||||
// second contact also gets returned
|
||||
api.addContact(ownerProperties, mailboxContact2);
|
||||
assertEquals(Arrays.asList(contactId1, contactId2),
|
||||
api.getContacts(ownerProperties));
|
||||
|
||||
// after both contacts get deleted, the list is empty again
|
||||
api.deleteContact(ownerProperties, contactId1);
|
||||
api.deleteContact(ownerProperties, contactId2);
|
||||
assertEquals(emptyList(), api.getContacts(ownerProperties));
|
||||
|
||||
// deleting again is tolerable
|
||||
assertThrows(TolerableFailureException.class,
|
||||
() -> api.deleteContact(ownerProperties, contactId2));
|
||||
}
|
||||
|
||||
private MailboxContact getMailboxContact(ContactId contactId) {
|
||||
return new MailboxContact(contactId, getMailboxSecret(),
|
||||
getMailboxSecret(), getMailboxSecret());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -25,7 +25,7 @@ import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||
import org.briarproject.bramble.test.ImmediateExecutor;
|
||||
import org.briarproject.bramble.test.RunAction;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
@@ -69,7 +69,7 @@ public class PollerImplTest extends BrambleMockTestCase {
|
||||
private PollerImpl poller;
|
||||
|
||||
public PollerImplTest() {
|
||||
context.setImposteriser(ClassImposteriser.INSTANCE);
|
||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
||||
random = context.mock(SecureRandom.class);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,21 @@ public class TestFeatureFlagModule {
|
||||
public boolean shouldEnableDisappearingMessages() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldEnablePrivateGroupsInCore() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldEnableForumsInCore() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldEnableBlogsInCore() {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
dependencyVerification {
|
||||
verify = [
|
||||
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
|
||||
'com.fasterxml.jackson.core:jackson-annotations:2.13.0:jackson-annotations-2.13.0.jar:81f9724d8843e8b08f8f6c0609e7a2b030d00c34861c4ac7e2099a7235047d6f',
|
||||
'com.fasterxml.jackson.core:jackson-core:2.13.0:jackson-core-2.13.0.jar:348bc59b348df2e807b356f1d62d2afb41a974073328abc773eb0932b855d2c8',
|
||||
'com.fasterxml.jackson.core:jackson-databind:2.13.0:jackson-databind-2.13.0.jar:9c826d27176268777adcf97e1c6e2051c7e33a7aaa2c370c2e8c6077fd9da3f4',
|
||||
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
|
||||
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
||||
'com.google.dagger:dagger-compiler:2.33:dagger-compiler-2.33.jar:aa8a0d8370c578fd6999802d0d90b9829377a46d2c1141e11b8f737970e7155e',
|
||||
@@ -15,6 +18,11 @@ dependencyVerification {
|
||||
'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99',
|
||||
'com.google.j2objc:j2objc-annotations:1.1:j2objc-annotations-1.1.jar:2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6',
|
||||
'com.h2database:h2:1.4.192:h2-1.4.192.jar:225b22e9857235c46c93861410b60b8c81c10dc8985f4faf188985ba5445126c',
|
||||
'com.squareup.okhttp3:mockwebserver:4.9.3:mockwebserver-4.9.3.jar:9c8c581c29f22f877a35d11380462f75bb24bf1886204fe835ee695594a2784e',
|
||||
'com.squareup.okhttp3:okhttp:3.12.13:okhttp-3.12.13.jar:508234e024ef7e270ab1a6d5b356f5b98e786511239ca986d684fd1e2cf7bc82',
|
||||
'com.squareup.okhttp3:okhttp:4.9.3:okhttp-4.9.3.jar:93ecd6cba19d87dccfe566ec848d91aae799e3cf16c00709358ea69bd9227219',
|
||||
'com.squareup.okio:okio:1.15.0:okio-1.15.0.jar:693fa319a7e8843300602b204023b7674f106ebcb577f2dd5807212b66118bd2',
|
||||
'com.squareup.okio:okio:2.8.0:okio-jvm-2.8.0.jar:4496b06e73982fcdd8a5393f46e5df2ce2fa4465df5895454cac68a32f09bbc8',
|
||||
'com.squareup:javapoet:1.13.0:javapoet-1.13.0.jar:4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291',
|
||||
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
|
||||
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
||||
@@ -26,7 +34,7 @@ dependencyVerification {
|
||||
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
||||
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
|
||||
'org.bitlet:weupnp:0.1.4:weupnp-0.1.4.jar:88df7e6504929d00bdb832863761385c68ab92af945b04f0770b126270a444fb',
|
||||
'org.bouncycastle:bcprov-jdk15on:1.69:bcprov-jdk15on-1.69.jar:e469bd39f936999f256002631003ff022a22951da9d5bd9789c7abfa9763a292',
|
||||
'org.bouncycastle:bcprov-jdk15to18:1.70:bcprov-jdk15to18-1.70.jar:7df4c54f29ce2dd616dc3b198ca4db3dfcc79e3cb397c084a0aff97b85c0bf38',
|
||||
'org.briarproject:jtorctl:0.3:jtorctl-0.3.jar:f2939238a097898998432effe93b0334d97a787972ab3a91a8973a1d309fc864',
|
||||
'org.checkerframework:checker-compat-qual:2.5.3:checker-compat-qual-2.5.3.jar:d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d',
|
||||
'org.checkerframework:checker-qual:2.5.2:checker-qual-2.5.2.jar:64b02691c8b9d4e7700f8ee2e742dce7ea2c6e81e662b7522c9ee3bf568c040a',
|
||||
@@ -38,7 +46,11 @@ dependencyVerification {
|
||||
'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
|
||||
'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
|
||||
'org.hsqldb:hsqldb:2.3.5:hsqldb-2.3.5.jar:6676a6977ac98997a80f827ddbd3fe8ca1e0853dad1492512135fd1a222ccfad',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.4.10:kotlin-stdlib-common-1.4.10.jar:4681f2d436a68c7523595d84ed5758e1382f9da0f67c91e6a848690d711274fe',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.4.20:kotlin-stdlib-common-1.4.20.jar:a7112c9b3cefee418286c9c9372f7af992bd1e6e030691d52f60cb36dbec8320',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10:kotlin-stdlib-jdk7-1.4.10.jar:f9566380c08722c780ce33ceee23e98ddf765ca98fabd3e2fabae7975c8d232b',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10:kotlin-stdlib-jdk8-1.4.10.jar:39b7a9442d7a3865e0f4a732c56c1d5da0e11ffb3bb82a461d32deb0c0ca7673',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib:1.4.10:kotlin-stdlib-1.4.10.jar:01ecb09782c042b931c1839acf21a188340b295d05400afd6e3415d4475b8daa',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib:1.4.20:kotlin-stdlib-1.4.20.jar:b8ab1da5cdc89cb084d41e1f28f20a42bd431538642a5741c52bbfae3fa3e656',
|
||||
'org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.1.0:kotlinx-metadata-jvm-0.1.0.jar:9753bb39efef35957c5c15df9a3cb769aabf2cdfa74b47afcb7760e5146be3b5',
|
||||
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
|
||||
|
||||
@@ -27,7 +27,6 @@ dependencies {
|
||||
testImplementation "junit:junit:$junit_version"
|
||||
testImplementation "org.jmock:jmock:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-junit4:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-legacy:$jmock_version"
|
||||
|
||||
testAnnotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
||||
}
|
||||
|
||||
@@ -26,8 +26,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 30
|
||||
versionCode 10403
|
||||
versionName "1.4.3"
|
||||
versionCode 10404
|
||||
versionName "1.4.4"
|
||||
applicationId "org.briarproject.briar.android"
|
||||
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
@@ -131,17 +131,17 @@ dependencies {
|
||||
def espressoVersion = '3.3.0'
|
||||
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
|
||||
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
|
||||
testImplementation 'androidx.test:runner:1.3.0'
|
||||
testImplementation 'androidx.test.ext:junit:1.1.2'
|
||||
testImplementation 'androidx.fragment:fragment-testing:1.3.4'
|
||||
testImplementation 'androidx.test:runner:1.4.0'
|
||||
testImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
testImplementation 'androidx.fragment:fragment-testing:1.4.0'
|
||||
testImplementation "androidx.arch.core:core-testing:2.1.0"
|
||||
testImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
|
||||
testImplementation 'org.robolectric:robolectric:4.3.1'
|
||||
testImplementation 'org.robolectric:robolectric:4.4'
|
||||
testImplementation 'org.mockito:mockito-core:3.9.0'
|
||||
testImplementation "junit:junit:$junit_version"
|
||||
testImplementation "org.jmock:jmock:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-junit4:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-legacy:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-imposters:$jmock_version"
|
||||
testAnnotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
||||
|
||||
androidTestImplementation project(path: ':bramble-api', configuration: 'testOutput')
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
-dontobfuscate
|
||||
-keepattributes SourceFile, LineNumberTable, *Annotation*, Signature, InnerClasses, EnclosingMethod
|
||||
|
||||
-keep,includedescriptorclasses class org.briarproject.briar.android.**,org.briarproject.briar.api.android.** { *; }
|
||||
|
||||
# QR codes
|
||||
-keep class com.google.zxing.Result
|
||||
-keepclassmembers enum * {
|
||||
|
||||
@@ -99,6 +99,10 @@
|
||||
android:name="org.briarproject.briar.android.splash.ExpiredActivity"
|
||||
android:label="@string/app_name" />
|
||||
|
||||
<activity
|
||||
android:name="org.briarproject.briar.android.splash.ExpiredOldAndroidActivity"
|
||||
android:label="@string/app_name" />
|
||||
|
||||
<activity
|
||||
android:name="org.briarproject.briar.android.login.StartupActivity"
|
||||
android:label="@string/app_name" />
|
||||
|
||||
@@ -339,6 +339,21 @@ public class AppModule {
|
||||
public boolean shouldEnableDisappearingMessages() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldEnablePrivateGroupsInCore() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldEnableForumsInCore() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldEnableBlogsInCore() {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.briarproject.briar.android;
|
||||
|
||||
import org.briarproject.briar.BuildConfig;
|
||||
|
||||
import static android.os.Build.VERSION.SDK_INT;
|
||||
import static java.util.concurrent.TimeUnit.DAYS;
|
||||
|
||||
public interface TestingConstants {
|
||||
@@ -19,10 +20,15 @@ public interface TestingConstants {
|
||||
*/
|
||||
boolean PREVENT_SCREENSHOTS = !IS_DEBUG_BUILD;
|
||||
|
||||
boolean IS_OLD_ANDROID = SDK_INT <= 19;
|
||||
long OLD_ANDROID_WARN_DATE = 1659225600_000L; // 2022-07-31
|
||||
long OLD_ANDROID_EXPIRY_DATE = 1675123200_000L; // 2023-01-31
|
||||
|
||||
/**
|
||||
* Debug builds expire after 90 days. Release builds expire after 292
|
||||
* million years.
|
||||
* Debug builds expire after 90 days. Release builds running on Android 4
|
||||
* expire at a set date, otherwise they expire after 292 million years.
|
||||
*/
|
||||
long EXPIRY_DATE = IS_DEBUG_BUILD ?
|
||||
BuildConfig.BuildTimestamp + DAYS.toMillis(90) : Long.MAX_VALUE;
|
||||
BuildConfig.BuildTimestamp + DAYS.toMillis(90)
|
||||
: (IS_OLD_ANDROID ? OLD_ANDROID_EXPIRY_DATE : Long.MAX_VALUE);
|
||||
}
|
||||
|
||||
@@ -80,6 +80,7 @@ import org.briarproject.briar.android.sharing.ShareBlogFragment;
|
||||
import org.briarproject.briar.android.sharing.ShareForumActivity;
|
||||
import org.briarproject.briar.android.sharing.ShareForumFragment;
|
||||
import org.briarproject.briar.android.sharing.SharingModule;
|
||||
import org.briarproject.briar.android.splash.ExpiredOldAndroidActivity;
|
||||
import org.briarproject.briar.android.splash.SplashScreenActivity;
|
||||
import org.briarproject.briar.android.test.TestDataActivity;
|
||||
|
||||
@@ -182,6 +183,8 @@ public interface ActivityComponent {
|
||||
|
||||
void inject(RemovableDriveActivity activity);
|
||||
|
||||
void inject(ExpiredOldAndroidActivity activity);
|
||||
|
||||
// Fragments
|
||||
|
||||
void inject(SetupFragment fragment);
|
||||
|
||||
@@ -75,12 +75,15 @@ import static org.briarproject.bramble.api.plugin.Plugin.State.ENABLING;
|
||||
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
|
||||
import static org.briarproject.briar.android.BriarService.EXTRA_STARTUP_FAILED;
|
||||
import static org.briarproject.briar.android.BriarService.EXTRA_START_RESULT;
|
||||
import static org.briarproject.briar.android.TestingConstants.EXPIRY_DATE;
|
||||
import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
|
||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD;
|
||||
import static org.briarproject.briar.android.navdrawer.IntentRouter.handleExternalIntent;
|
||||
import static org.briarproject.briar.android.util.UiUtils.formatDateFull;
|
||||
import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry;
|
||||
import static org.briarproject.briar.android.util.UiUtils.observeOnce;
|
||||
import static org.briarproject.briar.android.util.UiUtils.resolveColorAttribute;
|
||||
import static org.briarproject.briar.android.util.UiUtils.shouldWarnOldAndroidExpiry;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
@@ -137,9 +140,11 @@ public class NavDrawerActivity extends BriarActivity implements
|
||||
setContentView(R.layout.activity_nav_drawer);
|
||||
|
||||
BriarApplication app = (BriarApplication) getApplication();
|
||||
if (IS_DEBUG_BUILD && !app.isInstrumentationTest()) {
|
||||
navDrawerViewModel.showExpiryWarning()
|
||||
.observe(this, this::showExpiryWarning);
|
||||
if (!app.isInstrumentationTest()) {
|
||||
if (IS_DEBUG_BUILD || shouldWarnOldAndroidExpiry()) {
|
||||
navDrawerViewModel.showExpiryWarning()
|
||||
.observe(this, this::showExpiryWarning);
|
||||
}
|
||||
}
|
||||
navDrawerViewModel.shouldAskForDozeWhitelisting().observe(this, ask -> {
|
||||
if (ask) showDozeDialog(getString(R.string.setup_doze_intro));
|
||||
@@ -207,7 +212,9 @@ public class NavDrawerActivity extends BriarActivity implements
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
lockManager.checkIfLockable();
|
||||
if (IS_DEBUG_BUILD) navDrawerViewModel.checkExpiryWarning();
|
||||
if (IS_DEBUG_BUILD || shouldWarnOldAndroidExpiry()) {
|
||||
navDrawerViewModel.checkExpiryWarning();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -377,14 +384,23 @@ public class NavDrawerActivity extends BriarActivity implements
|
||||
return;
|
||||
}
|
||||
|
||||
String text;
|
||||
if (IS_DEBUG_BUILD) {
|
||||
text = getResources().getQuantityString(
|
||||
R.plurals.expiry_warning, (int) daysUntilExpiry,
|
||||
(int) daysUntilExpiry);
|
||||
} else {
|
||||
text = getResources().getQuantityString(
|
||||
R.plurals.old_android_expiry_warning, (int) daysUntilExpiry,
|
||||
formatDateFull(this, EXPIRY_DATE),
|
||||
(int) daysUntilExpiry);
|
||||
}
|
||||
|
||||
ViewGroup expiryWarning = findViewById(R.id.expiryWarning);
|
||||
if (show) {
|
||||
// show expiry warning text
|
||||
TextView expiryWarningText =
|
||||
expiryWarning.findViewById(R.id.expiryWarningText);
|
||||
String text = getResources().getQuantityString(
|
||||
R.plurals.expiry_warning, (int) daysUntilExpiry,
|
||||
(int) daysUntilExpiry);
|
||||
expiryWarningText.setText(text);
|
||||
// make close button functional
|
||||
ImageView expiryWarningClose =
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
package org.briarproject.briar.android.splash;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||
import org.briarproject.briar.android.activity.BaseActivity;
|
||||
import org.briarproject.briar.android.controller.BriarController;
|
||||
import org.briarproject.briar.android.logout.ExitActivity;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
|
||||
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
|
||||
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
||||
import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
public class ExpiredOldAndroidActivity extends BaseActivity {
|
||||
|
||||
@Inject
|
||||
BriarController briarController;
|
||||
@Inject
|
||||
AndroidWakeLockManager wakeLockManager;
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle state) {
|
||||
super.onCreate(state);
|
||||
|
||||
setContentView(R.layout.activity_expired_old_android);
|
||||
findViewById(R.id.delete_account_button).setOnClickListener(v -> {
|
||||
// Hold a wake lock to ensure we exit before the device goes to sleep
|
||||
wakeLockManager.runWakefully(() -> {
|
||||
// we're not signed in, just go ahead and delete
|
||||
briarController.deleteAccount();
|
||||
// remove from recent apps
|
||||
Intent i = new Intent(this, ExitActivity.class);
|
||||
i.addFlags(FLAG_ACTIVITY_NEW_TASK
|
||||
| FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
|
||||
| FLAG_ACTIVITY_NO_ANIMATION
|
||||
| FLAG_ACTIVITY_CLEAR_TASK);
|
||||
startActivity(i);
|
||||
}, "DeleteAccount");
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectActivity(ActivityComponent component) {
|
||||
component.inject(this);
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,7 @@ import static java.lang.System.currentTimeMillis;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.briarproject.briar.android.BriarApplication.ENTRY_ACTIVITY;
|
||||
import static org.briarproject.briar.android.TestingConstants.EXPIRY_DATE;
|
||||
import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
@@ -65,8 +66,13 @@ public class SplashScreenActivity extends BaseActivity {
|
||||
getResources().getInteger(R.integer.splashScreenDuration);
|
||||
new Handler().postDelayed(() -> {
|
||||
if (currentTimeMillis() >= EXPIRY_DATE) {
|
||||
LOG.info("Expired");
|
||||
startNextActivity(ExpiredActivity.class);
|
||||
if (IS_DEBUG_BUILD) {
|
||||
LOG.info("Expired: debug build");
|
||||
startNextActivity(ExpiredActivity.class);
|
||||
} else {
|
||||
LOG.info("Expired: running on old Android");
|
||||
startNextActivity(ExpiredOldAndroidActivity.class);
|
||||
}
|
||||
} else {
|
||||
startNextActivity(ENTRY_ACTIVITY);
|
||||
}
|
||||
|
||||
@@ -10,12 +10,14 @@ import androidx.activity.result.contract.ActivityResultContract;
|
||||
import androidx.activity.result.contract.ActivityResultContracts.CreateDocument;
|
||||
import androidx.activity.result.contract.ActivityResultContracts.GetContent;
|
||||
import androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import static android.app.Activity.RESULT_CANCELED;
|
||||
import static android.bluetooth.BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE;
|
||||
import static android.bluetooth.BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION;
|
||||
import static android.content.Intent.EXTRA_MIME_TYPES;
|
||||
import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION;
|
||||
import static android.os.Build.VERSION.SDK_INT;
|
||||
import static org.briarproject.bramble.util.AndroidUtils.getSupportedImageContentTypes;
|
||||
|
||||
@@ -23,6 +25,7 @@ import static org.briarproject.bramble.util.AndroidUtils.getSupportedImageConten
|
||||
public class ActivityLaunchers {
|
||||
|
||||
public static class CreateDocumentAdvanced extends CreateDocument {
|
||||
@NonNull
|
||||
@Override
|
||||
public Intent createIntent(Context context, String input) {
|
||||
Intent i = super.createIntent(context, input);
|
||||
@@ -32,20 +35,24 @@ public class ActivityLaunchers {
|
||||
}
|
||||
|
||||
public static class GetContentAdvanced extends GetContent {
|
||||
@NonNull
|
||||
@Override
|
||||
public Intent createIntent(Context context, String input) {
|
||||
Intent i = super.createIntent(context, input);
|
||||
putShowAdvancedExtra(i);
|
||||
i.addFlags(FLAG_GRANT_READ_URI_PERMISSION);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
public static class GetImageAdvanced extends GetContent {
|
||||
@NonNull
|
||||
@Override
|
||||
public Intent createIntent(Context context, String input) {
|
||||
Intent i = super.createIntent(context, input);
|
||||
putShowAdvancedExtra(i);
|
||||
i.setType("image/*");
|
||||
i.addFlags(FLAG_GRANT_READ_URI_PERMISSION);
|
||||
if (SDK_INT >= 19)
|
||||
i.putExtra(EXTRA_MIME_TYPES, getSupportedImageContentTypes());
|
||||
return i;
|
||||
@@ -54,11 +61,13 @@ public class ActivityLaunchers {
|
||||
|
||||
@TargetApi(18)
|
||||
public static class GetMultipleImagesAdvanced extends GetMultipleContents {
|
||||
@NonNull
|
||||
@Override
|
||||
public Intent createIntent(Context context, String input) {
|
||||
Intent i = super.createIntent(context, input);
|
||||
putShowAdvancedExtra(i);
|
||||
i.setType("image/*");
|
||||
i.addFlags(FLAG_GRANT_READ_URI_PERMISSION);
|
||||
if (SDK_INT >= 19)
|
||||
i.putExtra(EXTRA_MIME_TYPES, getSupportedImageContentTypes());
|
||||
return i;
|
||||
@@ -67,6 +76,7 @@ public class ActivityLaunchers {
|
||||
|
||||
public static class RequestBluetoothDiscoverable
|
||||
extends ActivityResultContract<Integer, Boolean> {
|
||||
@NonNull
|
||||
@Override
|
||||
public Intent createIntent(Context context, Integer duration) {
|
||||
Intent i = new Intent(ACTION_REQUEST_DISCOVERABLE);
|
||||
|
||||
@@ -110,6 +110,8 @@ import static java.util.logging.Level.WARNING;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.briar.BuildConfig.APPLICATION_ID;
|
||||
import static org.briarproject.briar.android.TestingConstants.EXPIRY_DATE;
|
||||
import static org.briarproject.briar.android.TestingConstants.IS_OLD_ANDROID;
|
||||
import static org.briarproject.briar.android.TestingConstants.OLD_ANDROID_WARN_DATE;
|
||||
import static org.briarproject.briar.android.reporting.CrashReportActivity.EXTRA_APP_LOGCAT;
|
||||
import static org.briarproject.briar.android.reporting.CrashReportActivity.EXTRA_APP_START_TIME;
|
||||
import static org.briarproject.briar.android.reporting.CrashReportActivity.EXTRA_INITIAL_COMMENT;
|
||||
@@ -197,6 +199,11 @@ public class UiUtils {
|
||||
return DateUtils.formatDateTime(ctx, time, flags);
|
||||
}
|
||||
|
||||
public static String formatDateFull(Context ctx, long time) {
|
||||
return DateUtils.formatDateTime(ctx, time,
|
||||
FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR | FORMAT_ABBREV_ALL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the given duration in a human-friendly format. For example,
|
||||
* "7 days" or "1 hour 3 minutes".
|
||||
@@ -232,6 +239,11 @@ public class UiUtils {
|
||||
return (EXPIRY_DATE - now) / DAYS.toMillis(1);
|
||||
}
|
||||
|
||||
public static boolean shouldWarnOldAndroidExpiry() {
|
||||
return IS_OLD_ANDROID &&
|
||||
System.currentTimeMillis() >= OLD_ANDROID_WARN_DATE;
|
||||
}
|
||||
|
||||
public static SpannableStringBuilder getTeaser(Context ctx, Spanned text) {
|
||||
if (text.length() < TEASER_LENGTH)
|
||||
throw new IllegalArgumentException(
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/margin_large"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/margin_medium"
|
||||
android:gravity="center"
|
||||
android:text="@string/old_android_expiry_date_reached"
|
||||
android:textSize="@dimen/text_size_large" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/margin_medium"
|
||||
android:gravity="center"
|
||||
android:text="@string/create_new_account"
|
||||
android:textSize="@dimen/text_size_large" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/margin_medium"
|
||||
android:gravity="center"
|
||||
android:text="@string/old_android_delete_account"
|
||||
android:textSize="@dimen/text_size_large" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/delete_account_button"
|
||||
style="@style/BriarButton"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/margin_medium"
|
||||
android:text="@string/delete_account_button" />
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
@@ -54,6 +54,7 @@
|
||||
<string name="download_briar">За да продължите да използвате Briar изтеглете последното издание.</string>
|
||||
<string name="create_new_account">Ще трябва да създадете нов профил, но ще можете да използвате същия прякор.</string>
|
||||
<string name="download_briar_button">Изтегляне</string>
|
||||
<string name="delete_account_button">Премахване на профил</string>
|
||||
<string name="startup_open_database">Хранилището се дешифрира…</string>
|
||||
<string name="startup_migrate_database">Хранилището се обновява…</string>
|
||||
<string name="startup_compact_database">Хранилището се уплътнява…</string>
|
||||
@@ -280,7 +281,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">Вече има чакаща заявка за контакт с тази препратка: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Вече има контакт с тази препратка: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s и %s един и същи човек ли са?</string>
|
||||
<string name="duplicate_link_dialog_text_2">%1$s и %2$s един и същи човек ли са?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -289,7 +290,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Не</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s и %s са изпратили еднакви препратки.\n\nЕдиния от двамата вероятно се опитва да разбере кои са контактите ви.\n\nНе им споделяйте, че сте получили същата препратка от друг човек.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s и %2$s са изпратили еднакви препратки.\n\nЕдиният от двамата вероятно се опитва да разбере кои са контактите ви.\n\nНе им споделяйте, че сте получили същата препратка от друг човек.</string>
|
||||
<string name="pending_contact_updated_toast">Обновена чакаща заявка за контакт</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Запознаване на контакти</string>
|
||||
@@ -510,11 +511,11 @@
|
||||
<!--Settings Security and Panic-->
|
||||
<string name="security_settings_title">Сигурност</string>
|
||||
<string name="pref_lock_title">Заключване на приложението</string>
|
||||
<string name="pref_lock_summary">Заключва се екрана, за да предпази Briar докато сте вписани</string>
|
||||
<string name="pref_lock_summary">Екранът се заключва, за да се предпази Briar докато сте вписани</string>
|
||||
<string name="pref_lock_disabled_summary">За да се възползвате от тази възможност, настройте заключване на екрана</string>
|
||||
<string name="pref_lock_timeout_title">Заключване при бездействие</string>
|
||||
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
||||
<string name="pref_lock_timeout_summary">При неактивност Briar автоматично се заключав след %s</string>
|
||||
<string name="pref_lock_timeout_summary">При неактивност Briar автоматично се заключва след %s</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_1">1 минута</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
@@ -534,7 +535,7 @@
|
||||
<string name="password_changed">Паролата е променена.</string>
|
||||
<string name="panic_setting">Настройка на бутон за паника</string>
|
||||
<string name="panic_setting_title">Бутон за паника</string>
|
||||
<string name="panic_setting_hint">Настройва се реакцията на Briar при използване на приложение за бутон за паника</string>
|
||||
<string name="panic_setting_hint">Настройва се действието на Briar при използване на приложение за бутон за паника</string>
|
||||
<string name="panic_app_setting_title">Приложение бутон за паника</string>
|
||||
<string name="unknown_app">непознато приложение</string>
|
||||
<string name="panic_app_setting_summary">Няма зададено приложение</string>
|
||||
@@ -605,6 +606,7 @@
|
||||
<string name="dev_report_memory">Памет</string>
|
||||
<string name="dev_report_storage">Хранилище</string>
|
||||
<string name="dev_report_connectivity">Свързаност</string>
|
||||
<string name="dev_report_network_usage">Използване на мрежа</string>
|
||||
<string name="dev_report_build_config">Настройка на изданието</string>
|
||||
<string name="dev_report_logcat">Журнал на приложението</string>
|
||||
<string name="dev_report_device_features">Характеристики</string>
|
||||
@@ -647,6 +649,8 @@
|
||||
<string name="transports_help_text">Briar може да се свърже с контактите ви през интернет, Wi-Fi или Bluetooth.\n\nЗа повече поверителност цялата връзка към интернет се пренасочва през мрежата на Tor.\n\nАко даден контакт може да бъде достъпен чрез няколко метода Briar ги използва успоредно.</string>
|
||||
<!--Share app offline-->
|
||||
<string name="hotspot_title">Споделяне на приложението извън мрежа</string>
|
||||
<string name="hotspot_intro">Споделете приложението с някого наблизо без използване на интернет, а с през Wi-Fi на устройствата.
|
||||
\n\nВашето устройство ще създаде безжична точка за достъп. Хората наблизо биха могли да се свържат към нея и да изтеглят Briar от вашето устройство.</string>
|
||||
<string name="hotspot_button_start_sharing">Включване на безжична точка</string>
|
||||
<string name="hotspot_button_stop_sharing">Спиране на безжична точка</string>
|
||||
<string name="hotspot_progress_text_start">Настройване на безжична точка…</string>
|
||||
@@ -681,9 +685,21 @@
|
||||
<string name="website_download_outro">След като файлът се изтегли, отворете го и го инсталирайте.</string>
|
||||
<string name="website_troubleshooting_title">Отстраняване на неизправности</string>
|
||||
<string name="website_troubleshooting_1">Ако не можете да изтеглите приложението пробвайте с друг мрежов четец.</string>
|
||||
<string name="hotspot_help_wifi_title">Проблеми при свързване чрез Wi-Fi:</string>
|
||||
<string name="hotspot_help_site_title">Проблеми при посещаване на страницата:</string>
|
||||
<string name="hotspot_help_fallback_title">Нищо не става?</string>
|
||||
<string name="hotspot_help_fallback_intro">Запазете приложението като файл на APK и го споделете по друг начин. След като бъде получен от другото устройство може да бъде използван за инсталиране на Briar.
|
||||
\n\nЗабележка: За да го споделите чрез Bluetooth може да се наложи първо да го преименувате, така че да завършва на .zip.</string>
|
||||
<string name="hotspot_help_fallback_button">Запазване на приложение</string>
|
||||
<!--error handling-->
|
||||
<string name="hotspot_error_intro">Нещо се обърка при споделяне на приложението чрез Wi-Fi:</string>
|
||||
<string name="hotspot_error_no_wifi_direct">Устройството не поддържа Wi-Fi Direct.</string>
|
||||
<string name="hotspot_error_start_callback_failed">Безжичната точка не може да стартира: грешката е %s</string>
|
||||
<string name="hotspot_error_start_callback_failed_unknown">Безжичната точка не може да стартира поради неизвестна грешка: причината е %d</string>
|
||||
<string name="hotspot_error_start_callback_no_group_info">Безжичната точка не може да стартира: няма информация за група</string>
|
||||
<string name="hotspot_error_web_server_start">Грешка при стартиране на уеб сървър</string>
|
||||
<!--Transfer Data via Removable Drives-->
|
||||
<string name="removable_drive_menu_title">Свързване чрез преносим диск</string>
|
||||
<string name="removable_drive_title_send">Изпращане на сведения</string>
|
||||
<string name="removable_drive_title_receive">Получаване на сведения</string>
|
||||
<string name="removable_drive_send_intro">Докоснете бутона по-долу, за да бъде създаден файл, който ще съдържа шифрованите съобщения. Можете да изберете къде да бъде запазен този файл.\n\nАко желаете да го запазите на преносим диск го включете сега.</string>
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
<string name="download_briar">Per continuar utilitzant Briar, baixeu la darrera versió.</string>
|
||||
<string name="create_new_account">Haureu de crear un compte nou, però podeu utilitzar el mateix sobrenom.</string>
|
||||
<string name="download_briar_button">Descarrega la darrera versió</string>
|
||||
<string name="delete_account_button">Esborreu el compte</string>
|
||||
<string name="startup_open_database">S\'està desxifrant la base de dades...</string>
|
||||
<string name="startup_migrate_database">S\'està actualitzant la base de dades...</string>
|
||||
<string name="startup_compact_database">S\'està compactant la base de dades...</string>
|
||||
@@ -276,7 +277,6 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="duplicate_link_dialog_text_1">Teniu una sol·licitud de contacte pendent amb l\'enllaç %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Ja teniu un contacte amb aquest enllaç: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s i %s són la mateixa persona?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -285,7 +285,6 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Persones diferents</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s i %s us han enviat el mateix enllaç.\n\nUn d\'ells pot estar provant de descobrir quins són els vostres contactes.\n\nNo els hi digueu que heu rebut el mateix enllaç d\'algú altre.</string>
|
||||
<string name="pending_contact_updated_toast">S\'ha actualitzat la sol·licitud de contacte pendent</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Presenteu als vostres contactes</string>
|
||||
|
||||
@@ -42,21 +42,28 @@
|
||||
<string name="dialog_message_lost_password">Dein Briar-Konto ist verschlüsselt auf deinem Gerät und nicht in der Cloud gespeichert, deshalb kannst du dein Passwort nicht zurücksetzen. Willst du dein Konto löschen und neu beginnen?\n\nAchtung: Deine bestehenden Identitäten, Kontakte und Nachrichten gehen dann für immer verloren.</string>
|
||||
<string name="startup_failed_activity_title">Fehler beim Starten von Briar</string>
|
||||
<string name="startup_failed_clock_error">Briar konnte nicht gestartet werden, weil die Uhr deines Geräts falsch eingestellt ist.\n\Bitte stelle die Uhr deines Geräts auf die richtige Zeit ein und versuche es erneut.</string>
|
||||
<string name="startup_failed_db_error">Briar konnte die Datenbank, die dein Konto, deine Kontakte und deine Nachrichten enthält, nicht öffnen.\n\nBitte aktualisiere auf die neueste Version der App und versuche es erneut, oder richte ein neues Konto ein, indem du bei der Passwortabfrage \"Ich habe mein Passwort vergessen\" wählst.</string>
|
||||
<string name="startup_failed_data_too_old_error">Dein Konto wurde mit einer alten Version dieser App erstellt und kann mit dieser Version nicht geöffnet werden. Du musst entweder die alte Version neu installieren oder ein neues Konto einrichten, indem du bei der Passwortabfrage \"Ich habe mein Passwort vergessen\" wählst.</string>
|
||||
<string name="startup_failed_data_too_new_error">Dein Konto wurde mit einer neueren Version dieser App erstellt und kann mit dieser Version nicht geöffnet werden.\n\nBitte aktualisiere auf die aktuelle Version und versuche es erneut.</string>
|
||||
<string name="startup_failed_db_error">Briar konnte die Datenbank mit deinem Konto, deinen Kontakten und deinen Nachrichten nicht öffnen.\n\nBitte aktualisiere auf die neueste Version der App und versuche es erneut, oder richte ein neues Konto ein, indem du bei der Passwortabfrage \"Ich habe mein Passwort vergessen\" wählst.</string>
|
||||
<string name="startup_failed_data_too_old_error">Dein Konto wurde mit einer alten Version dieser App erstellt und kann mit dieser Version nicht geöffnet werden.\n\nDu musst entweder die alte Version neu installieren oder ein neues Konto einrichten, indem du bei der Passwortabfrage \"Ich habe mein Passwort vergessen\" wählst.</string>
|
||||
<string name="startup_failed_data_too_new_error">Dein Konto wurde mit einer neueren Version dieser App erstellt und kann mit dieser Version nicht geöffnet werden.\n\nBitte aktualisiere auf die neueste Version und versuche es erneut.</string>
|
||||
<string name="startup_failed_service_error">Briar konnte eine erforderliche Komponente nicht starten.\n\nBitte aktualisiere auf die neueste Version der App und versuche es erneut.</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="one">Dies ist eine Testversion von Briar. Dein Konto läuft in %d Tag ab und kann nicht verlängert werden.</item>
|
||||
<item quantity="other">Dies ist eine Testversion von Briar. Dein Konto läuft in %d Tagen ab und kann nicht verlängert werden.</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="one">Android 4 wird nicht mehr unterstützt. Briar wird nicht mehr auf %s funktionieren (in %d Tag). Bitte installiere es auf einem neueren Gerät und erstelle ein neues Konto.</item>
|
||||
<item quantity="other">Android 4 wird nicht mehr unterstützt. Briar wird nicht mehr auf %s funktionieren (in %dTagen). Bitte installiere es auf einem neueren Gerät und erstelle ein neues Konto.</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">Diese Software ist abgelaufen.\nDanke, dass du Briar getestet hast!</string>
|
||||
<string name="download_briar">Bitte lade die aktuelle Version von Briar herunter, um es weiter zu benutzen.</string>
|
||||
<string name="create_new_account">Du wirst ein neues Konto erstellen müssen, wobei du jedoch wieder denselben Benutzernamen verwenden kannst.</string>
|
||||
<string name="download_briar_button">Aktuelle Version herunterladen</string>
|
||||
<string name="old_android_expiry_date_reached">Briar wird auf Android 4 nicht mehr unterstützt.\nBitte installiere Briar auf einem neueren Gerät.</string>
|
||||
<string name="old_android_delete_account">Du kannst auf die Schaltfläche unten tippen, um dein Konto von diesem Gerät zu löschen.</string>
|
||||
<string name="delete_account_button">Konto löschen</string>
|
||||
<string name="startup_open_database">Datenbank wird entschlüsselt...</string>
|
||||
<string name="startup_migrate_database">Datenbank wird aktualisiert...</string>
|
||||
<string name="startup_compact_database">Datenbank wird komprimiert ...</string>
|
||||
<string name="startup_compact_database">Datenbank wird komprimiert…</string>
|
||||
<!--Navigation Drawer-->
|
||||
<string name="nav_drawer_open_description">Navigationsleiste öffnen</string>
|
||||
<string name="nav_drawer_close_description">Navigationsleiste schliessen</string>
|
||||
@@ -261,7 +268,7 @@
|
||||
<string name="adding_contact_failed">Hinzufügen von Kontakt ist fehlgeschlagen</string>
|
||||
<string name="dialog_title_remove_pending_contact">Entfernung bestätigen</string>
|
||||
<string name="dialog_message_remove_pending_contact">Dieser Kontakt befindet sich noch beim Hinzufügen. Wenn er jetzt entfernt wird, wird das Hinzufügen abgebrochen.</string>
|
||||
<string name="own_link_error">Gebe den Link deines Kontakts ein, nicht deinen eigenen.</string>
|
||||
<string name="own_link_error">Gib den Link deines Kontakts ein, nicht deinen eigenen</string>
|
||||
<string name="nickname_missing">Bitte gib einen Spitznamen an</string>
|
||||
<string name="invalid_link">Ungültiger Link</string>
|
||||
<string name="unsupported_link">Dieser Link kommt von einer neueren Version von Briar. Bitte führe eine Aktualisierung auf die aktuelle Version durch und versuche es dann nochmal. </string>
|
||||
@@ -276,11 +283,11 @@
|
||||
<item quantity="other">%d neue Kontakte hinzugefügt.</item>
|
||||
</plurals>
|
||||
<string name="offline_state">Keine Internetverbindung</string>
|
||||
<string name="duplicate_link_dialog_title">Link duplizieren</string>
|
||||
<string name="duplicate_link_dialog_title">Gleicher Link</string>
|
||||
<string name="duplicate_link_dialog_text_1">Du hast bereits einen Kontakt mit diesem Link ausstehend: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Du hast bereits einen Kontakt mit diesem Link: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Sind %s und %s dieselbe Person?</string>
|
||||
<string name="duplicate_link_dialog_text_2">Sind %1$s und %2$s dieselbe Person?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -289,7 +296,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Andere Person</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s und %s haben Dir denselben Link geschickt.\n\nMöglicherweise versucht einer der beiden mehr über deine Kontakte zu erfahren.\n\nDu solltest deswegen niemandem sagen, dass du diesen Link auch von jemand anderem erhalten hast.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s und %2$s haben dir denselben Link geschickt.\n\nMöglicherweise versucht einer der beiden mehr über deine Kontakte zu erfahren.\n\nDu solltest deswegen niemandem sagen, dass du diesen Link auch von jemand anderem erhalten hast.</string>
|
||||
<string name="pending_contact_updated_toast">Ausstehender Kontakt aktualisiert</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Mache deine Kontakte untereinander bekannt</string>
|
||||
@@ -307,7 +314,7 @@
|
||||
<string name="introduction_request_exists_received">%1$s schlägt vor, dich als Kontakt an %2$s zu empfehlen. %2$s ist allerdings bereits in deiner Kontaktliste. Da %1$s das vielleicht nicht weiss, kannst du trotzdem antworten:</string>
|
||||
<string name="introduction_request_answered_received">%1$s schlägt vor, dich als Kontakt an %2$s zu empfehlen. </string>
|
||||
<string name="introduction_response_accepted_sent">Du hast die Kontaktempfehlung von %1$s angenommen.</string>
|
||||
<string name="introduction_response_accepted_sent_info">Bevor %1$s zu deinen Kontakten hinzugefügt werden, müssen sie die Kontaktempfehlung ebenfalls akzeptieren. Dies kann eine Weile dauern.</string>
|
||||
<string name="introduction_response_accepted_sent_info">Bevor %1$s zu deinen Kontakten hinzugefügt wird, muss die Kontaktempfehlung ebenfalls akzeptieren werden. Dies kann eine Weile dauern.</string>
|
||||
<string name="introduction_response_declined_sent">Du hast die Kontaktempfehlung von %1$s abgelehnt.</string>
|
||||
<string name="introduction_response_declined_auto">Die Kontaktempfehlung mit %1$s wurde automatisch abgelehnt.</string>
|
||||
<string name="introduction_response_accepted_received">%1$s hat die Kontaktempfehlung für %2$s angenommen.</string>
|
||||
@@ -326,9 +333,9 @@
|
||||
<!--Private Groups-->
|
||||
<string name="groups_list_empty">Keine Gruppen vorhanden</string>
|
||||
<string name="groups_list_empty_action">Tippe auf das + Symbol, um eine Gruppe anzulegen oder frage deine Kontakte, Gruppen mit dir zu teilen</string>
|
||||
<string name="groups_created_by">Erstellt durch %s</string>
|
||||
<string name="groups_created_by">Erstellt von %s</string>
|
||||
<plurals name="messages">
|
||||
<item quantity="one">%d Nachrichten</item>
|
||||
<item quantity="one">%d Nachricht</item>
|
||||
<item quantity="other">%d Nachrichten</item>
|
||||
</plurals>
|
||||
<string name="groups_group_is_empty">Diese Gruppe ist leer</string>
|
||||
@@ -364,7 +371,7 @@
|
||||
<item quantity="one">%d offene Gruppeneinladung</item>
|
||||
<item quantity="other">%d offene Gruppeneinladungen</item>
|
||||
</plurals>
|
||||
<string name="groups_invitations_response_accepted_sent">Gruppeneinladung von %s angenommen.</string>
|
||||
<string name="groups_invitations_response_accepted_sent">Du hast die Gruppeneinladung von %s angenommen.</string>
|
||||
<string name="groups_invitations_response_declined_sent">Du hast die Gruppeneinladung abgelehnt von %s abgelehnt.</string>
|
||||
<string name="groups_invitations_response_declined_auto">Die Gruppeneinladung von %s wurde automatisch abgelehnt.</string>
|
||||
<string name="groups_invitations_response_accepted_received">%s hat die Gruppeneinladung angenommen.</string>
|
||||
@@ -415,7 +422,7 @@
|
||||
<string name="forum_declined_toast">Einladung abgelehnt</string>
|
||||
<string name="shared_by_format">Geteilt durch %s</string>
|
||||
<string name="forum_invitation_already_sharing">Bereits geteilt.</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Du hast die Forumseinladung von %s angenommen.</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Du hast die Forumeinladung von %s angenommen.</string>
|
||||
<string name="forum_invitation_response_declined_sent">Du hast die Forumeinladung von %s abgelehnt.</string>
|
||||
<string name="forum_invitation_response_declined_auto">Die Forumeinladung von %s wurde automatisch abgelehnt.</string>
|
||||
<string name="forum_invitation_response_accepted_received">%s hat die Forumeinladung angenommen.</string>
|
||||
@@ -456,7 +463,7 @@
|
||||
<string name="blogs_sharing_response_accepted_received">%s hat die Blogeinladung angenommen.</string>
|
||||
<string name="blogs_sharing_response_declined_received">%s hat die Blogeinladung abgelehnt.</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$shat den Blog \"%2$s\" mit dir geteilt.</string>
|
||||
<string name="blogs_sharing_invitation_sent">Du teilst den Blog \"%1$s\" mit %2$s.</string>
|
||||
<string name="blogs_sharing_invitation_sent">Du hast den Blog \"%1$s\" mit %2$s geteilt.</string>
|
||||
<string name="blogs_sharing_invitations_title">Blogeinladungen</string>
|
||||
<string name="blogs_sharing_joined_toast">Blog abonniert</string>
|
||||
<string name="blogs_sharing_declined_toast">Einladung abgelehnt</string>
|
||||
@@ -609,6 +616,7 @@
|
||||
<string name="dev_report_memory">Speicher</string>
|
||||
<string name="dev_report_storage">Speicher</string>
|
||||
<string name="dev_report_connectivity">Konnektivität</string>
|
||||
<string name="dev_report_network_usage">Netzwerknutzung</string>
|
||||
<string name="dev_report_build_config">Buildkonfiguration</string>
|
||||
<string name="dev_report_logcat">App-Log</string>
|
||||
<string name="dev_report_device_features">Geräteeigenschaften</string>
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
<string name="download_briar">Para continuar usando Briar, por favor descarga la versión mas reciente.</string>
|
||||
<string name="create_new_account">Necesitarás crear una nueva cuenta, pero puedes usar el mismo nombre de usuario.</string>
|
||||
<string name="download_briar_button">Descargar la última versión.</string>
|
||||
<string name="delete_account_button">Borrar cuenta</string>
|
||||
<string name="startup_open_database">Descifrando la base de datos...</string>
|
||||
<string name="startup_migrate_database">Actualizando la base de datos...</string>
|
||||
<string name="startup_compact_database">Compactando base de datos...</string>
|
||||
@@ -280,7 +281,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">Ya tiene un contacto pendiente con este enlace: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Ya tienes un contacto con este enlace: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">¿Son %s y %s la misma persona?</string>
|
||||
<string name="duplicate_link_dialog_text_2">¿Son %1$s y %2$s la misma persona?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -289,7 +290,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Diferente Persona</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s y %s le envió el mismo enlace.\n\nUno de ellos puede estar tratando de descubrir quiénes son sus contactos.\n\nNo les diga que recibió el mismo enlace de otra persona.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s y %2$s te enviaron el mismo enlace.\n\nUno de ellos puede estar tratando de descubrir quiénes son tus contactos.\n\nNo les digas que recibiste el mismo enlace de otra persona.</string>
|
||||
<string name="pending_contact_updated_toast">Contacto pendiente actualizado</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Presenta a tus contactos</string>
|
||||
|
||||
@@ -54,12 +54,19 @@
|
||||
<item quantity="one">این یک نسخه آزمایشی از Briar (برایر) می باشد. حساب کاربری شما در %d روز آینده به پایان می رسد و امکان تمدید آن وجود نخواهد داشت.</item>
|
||||
<item quantity="other">این یک نسخه آزمایشی از Briar (برایر) می باشد. حساب کاربری شما در %d روز آینده به پایان می رسد و امکان تمدید آن وجود نخواهد داشت.</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="one">اندروید 4 دیگر پشتیبانی نمیشود. Briar (در عرض %d روز) کار بر روی %s را متوقف خواهد کرد. لطفا Briar را در دستگاه جدیدتر نصب کنید و یک حساب کاربری جدید ایجاد کنید.</item>
|
||||
<item quantity="other">اندروید 4 دیگر پشتیبانی نمیشود. Briar (در عرض %d روز) کار بر روی %s را متوقف خواهد کرد. لطفا Briar را در دستگاه جدیدتر نصب کنید و یک حساب کاربری جدید ایجاد کنید.</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">این نرم افزار منقضی شده است.
|
||||
|
||||
بابت تست از شما سپاسگزاریم.</string>
|
||||
<string name="download_briar">برای ادامه استفاده از Briar، لطفا آخرین نسخه را دانلود کنید.</string>
|
||||
<string name="create_new_account">لازم است تا یک حساب کاربری جدید ایجاد کنید، ولی می توانید از همان نام مستعار استفاده کنید.</string>
|
||||
<string name="download_briar_button">دانلود آخرین نسخه</string>
|
||||
<string name="old_android_expiry_date_reached">Briar دیگر روی اندروید 4 اجرا نمیشود.\nلطفا Briar را روی دستگاه جدیدتر نصب کنید. </string>
|
||||
<string name="old_android_delete_account">برای حذف حساب کاربری خود از این دستگاه میتوانید روی دکمه زیر ضربه بزنید.</string>
|
||||
<string name="delete_account_button">حذف حساب کاربری</string>
|
||||
<string name="startup_open_database">در حال رمزگشایی سیستم ...</string>
|
||||
<string name="startup_migrate_database">در حال ارتقا سیستم ...</string>
|
||||
<string name="startup_compact_database">درحال فشرده سازی پایگاه داده...</string>
|
||||
@@ -294,7 +301,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">شما هم اکنون یک مخاطب معلق با این پیوند دارید: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">شما هم اکنون یک مخاطب با این پیوند دارید: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">آیا %s و %s یک شخص می باشند؟</string>
|
||||
<string name="duplicate_link_dialog_text_2">آیا %1$s و %2$s یک شخص هستند؟</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -303,11 +310,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">شخص متفاوت</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s و %s پیوند یکسانی را به شما ارسال کردند.
|
||||
|
||||
یکی از آن ها ممکن است سعی در شناسایی مخاطبان شما داشته باشد.
|
||||
|
||||
به آن ها نگویید که همان لینک را از یک شخص دیگر دریافت کرده اید.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s و %2$s یک پیوند یکسان را به شما ارسال کردند.\n\nشاید یکی از آنها قصد شناسایی مخاطبین شما را دارد.\n\nبه آنها نگویید که همان لینک را از فرد دیگری نیز دریافت کردهاید.</string>
|
||||
<string name="pending_contact_updated_toast">مخاطب معلق به روز رسانی شد</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">معرفی مخاطبان</string>
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
<string name="download_briar">Pour continuer à utiliser Briar, veuillez télécharger la dernière version.</string>
|
||||
<string name="create_new_account">Vous devrez créer un nouveau compte, mais vous pouvez utiliser le même pseudonyme.</string>
|
||||
<string name="download_briar_button">Télécharger la dernière version</string>
|
||||
<string name="delete_account_button">Supprimer le compte</string>
|
||||
<string name="startup_open_database">Déchiffrement de la base de données…</string>
|
||||
<string name="startup_migrate_database">Mise à niveau de la base de données…</string>
|
||||
<string name="startup_compact_database">Compactage de la base de données…</string>
|
||||
@@ -280,7 +281,6 @@
|
||||
<string name="duplicate_link_dialog_text_1">Vous avez déjà un contact en attente avec ce lien : %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Vous avez déjà un contact avec ce lien : %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s et %s sont-elles la même personne ?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -289,7 +289,6 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Une personne différente</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s et %s vous ont envoyé le même lien.\n\nL\'une d’elle pourrait tenter de découvrir qui sont vos contacts.\n\nNe lui dites pas que vous avez reçu le même lien de quelqu’un d’autre.</string>
|
||||
<string name="pending_contact_updated_toast">Le contact en attente a été mis à jour</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Présenter vos contacts</string>
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
<string name="download_briar">Para seguir utilizando Briar, descarga por favor a última versión.</string>
|
||||
<string name="create_new_account">Precisas crear unha nova conta, pero podes utilizar o mesmo alcume.</string>
|
||||
<string name="download_briar_button">Descargar Última Versión</string>
|
||||
<string name="delete_account_button">Eliminar conta</string>
|
||||
<string name="startup_open_database">Descifrando a Base de datos...</string>
|
||||
<string name="startup_migrate_database">Actualizando a Base de datos...</string>
|
||||
<string name="startup_compact_database">Compactando a base de datos...</string>
|
||||
@@ -268,7 +269,6 @@
|
||||
<string name="duplicate_link_dialog_text_1">Xa tes un contacto pendente con esta ligazón: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Xa tes un contacto con esta ligazón: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Son %s e %s a mesma persoa?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -277,7 +277,6 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Diferente Persoa</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s e %s enviáronche a mesma ligazón.\n\nUnha delas podería estar a intentar descubrir os teus contactos.\n\nNon lles digas que recibiches a mesma ligazón de alguén máis.</string>
|
||||
<string name="pending_contact_updated_toast">Contacto pendente actualizado</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Presenta aos seus contactos</string>
|
||||
@@ -643,6 +642,7 @@
|
||||
<string name="website_troubleshooting_title">Solución de problemas</string>
|
||||
<!--error handling-->
|
||||
<!--Transfer Data via Removable Drives-->
|
||||
<string name="removable_drive_menu_title">Conectar vía Disco Extraíble</string>
|
||||
<string name="removable_drive_success_receive_title">Importación exitosa</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
<string name="download_briar">כדי להמשיך להשתמש ב־Briar, אנא הורד את השחרור האחרון.</string>
|
||||
<string name="create_new_account">יהיה צריך ליצור חשבון חדש, אבל אפשר להשתמש באותו הכינוי.</string>
|
||||
<string name="download_briar_button">הורד שחרור אחרון</string>
|
||||
<string name="delete_account_button">מחק חשבון</string>
|
||||
<string name="startup_open_database">מפענח מסד נתונים…</string>
|
||||
<string name="startup_migrate_database">משדרג מסד נתונים…</string>
|
||||
<string name="startup_compact_database">מצופף מסד נתונים…</string>
|
||||
@@ -256,7 +257,6 @@
|
||||
<string name="duplicate_link_dialog_text_1">יש לך כבר איש קשר ממתין עם קישור זה: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">יש לך כבר איש קשר עם קישור זה: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">האם %s ו־%s הם אותו איש?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -265,7 +265,6 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">איש שונה</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s ו־%s שלחו לך את אותו הקישור.\n\nייתכן שאחד מהם מנסה לגלות מי הם אנשי הקשר שלך.\n\nאל תגיד לו שקיבלת את אותו הקישור ממישהו אחר.</string>
|
||||
<string name="pending_contact_updated_toast">איש קשר ממתין עודכן</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">הכר בין אנשי הקשר שלך</string>
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
<string name="download_briar">A Briar használatának folytatásához kérjük töltse le a legújabb verziót.</string>
|
||||
<string name="create_new_account">Új fiókot kell létrehoznia, de használhatja ugyanazt a becenevet.</string>
|
||||
<string name="download_briar_button">Legújabb verzió letöltése</string>
|
||||
<string name="delete_account_button">Fiók törlése</string>
|
||||
<string name="startup_open_database">Adatbázis dekódolása...</string>
|
||||
<string name="startup_migrate_database">Adatbázis frissítése</string>
|
||||
<string name="startup_compact_database">Adatbázis tömörítése...</string>
|
||||
@@ -278,7 +279,6 @@ Kérjük frissítsen a legutolsó verzióra és próbálja újra.</string>
|
||||
<string name="duplicate_link_dialog_text_1">Önnek már van várakozó kapcsolata ezzel a linkkel: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Önnek már van kapcsolata ezzel a linkkel: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s és %s ugyanaz a személy?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -287,7 +287,6 @@ Kérjük frissítsen a legutolsó verzióra és próbálja újra.</string>
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Másik személy</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s és %s ugyanazt a linket küldte.\n\nEgyikük lehet, hogy megpróbálja kikutatni, hogy kik a kapcsolatai.\n\nNe árulja el nekik, hogy ugyanazt a linket már megkapta mástól.</string>
|
||||
<string name="pending_contact_updated_toast">Várakozó kapcsolat frissítve</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Kapcsolatai bemutatása</string>
|
||||
@@ -661,6 +660,7 @@ Vigyázat: Ez végleg törli az identitásait, kapcsolatait és üzeneteit</stri
|
||||
<string name="website_troubleshooting_title">Hibaelhárítás</string>
|
||||
<!--error handling-->
|
||||
<!--Transfer Data via Removable Drives-->
|
||||
<string name="removable_drive_menu_title">Csatlakozás eltávolítható adathordozón keresztül</string>
|
||||
<string name="removable_drive_success_receive_title">Sikeres importálás</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
|
||||
@@ -42,16 +42,25 @@
|
||||
<string name="dialog_message_lost_password">Notandaaðgangur þinn í Briar er geymdur dulritaður á tækinu þínu, ekki í tölvuskýi, þannig að við getum ekki endurstillt lykilorðið þitt. Myndirðu vilja eyða notandaaðgangnum þínum og byrja aftur?\n\nVarúð: Auðkennin þín, tengiliðir og skilaboð munu tapast óendurkræft.</string>
|
||||
<string name="startup_failed_activity_title">Bilun í ræsingu Briar</string>
|
||||
<string name="startup_failed_clock_error">Briar gat ekki farið af stað því klukka tækisins þíns er ekki rétt stillt.\n\nLeiðréttu klukku tækisins og prófaðu síðan aftur.</string>
|
||||
<string name="startup_failed_db_error">Briar tókst ekki að opna gagnagrunninn sem inniheldur aðganginn þinn, tengiliðina þína og skilaboð.\n\nAthugaðu hvort Briar sé þegar keyrandi á þessu tæki. Annars skaltu uppfæra í nýjustu útgáfuna og prófa síðan aftur, eða setja upp nýjan aðgang með því að velja \'Ég hef gleymt lykilorðinu mínu\' þar sem spurt er um lykilorð.</string>
|
||||
<string name="startup_failed_data_too_old_error">Notandaaðgangurinn þinn var útbúinn með eldri útgáfu forritsins og er ekki hægt að opna hann með þessari útgáfu.\n\Þú þarft annað hvort að setja gömlu útgáfuna upp aftur, eða setja upp nýjan notandaaðgang með því að velja \'Ég hef gleymt lykilorðinu mínu\' þegar beðið er um lykilorð.</string>
|
||||
<string name="startup_failed_data_too_new_error">Notandaaðgangurinn þinn var útbúinn með nýrri útgáfu forritsins og er ekki hægt að opna hann með þessari útgáfu.\n\Þú þarft að setja upp nýjustu útgáfuna og prófa svo aftur.</string>
|
||||
<string name="startup_failed_service_error">Briar tókst ekki að ræsa nauðsynlega einingu.\n\nUppfærðu í nýjustu útgáfuna og prófaðu síðan aftur.</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="one">Þetta er prufuútgáfa af Briar. Notandaaðgangurinn þinn mun renna út eftir %d dag og er ekki hægt að endurnýja hann.</item>
|
||||
<item quantity="other">Þetta er prufuútgáfa af Briar. Notandaaðgangurinn þinn mun renna út eftir %d daga og er ekki hægt að endurnýja hann.</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="one">Android 4 er ekki lengur stutt. Briar mun hætta að virka á %s (eftir %d dag). Settu Briar upp á nýrra tæki og útbúðu nýjan aðgang.</item>
|
||||
<item quantity="other">Android 4 er ekki lengur stutt. Briar mun hætta að virka á %s (eftir %d daga). Settu Briar upp á nýrra tæki og útbúðu nýjan aðgang.</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">Þessi hugbúnaður er úreltur.\nTakk fyrir að hafa tekið þátt í prófunum!</string>
|
||||
<string name="download_briar">Til að halda áfram að nota Briar, ættirðu að sækja nýjustu útgáfuna.</string>
|
||||
<string name="create_new_account">Þú þarft að búa til nýjan notandaaðgang, en þú getur notað áfram sama stuttnefni.</string>
|
||||
<string name="download_briar_button">Ná í nýjustu útgáfu</string>
|
||||
<string name="old_android_expiry_date_reached">Briar keyrir ekki lengur á Android 4.\nSettu Briar upp á nýrra tæki.</string>
|
||||
<string name="old_android_delete_account">Þú getur ýtt á hnappinn hér fyrir neðan til að eyða aðgangnum þínum af þessu tæki.</string>
|
||||
<string name="delete_account_button">Eyða notandaaðgangi</string>
|
||||
<string name="startup_open_database">Afkóða gagnagrunn…</string>
|
||||
<string name="startup_migrate_database">Uppfæri gagnagrunn…</string>
|
||||
<string name="startup_compact_database">Þjappa gagnagrunni…</string>
|
||||
@@ -278,7 +287,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">Þú ert þegar með tengilið í bið sem er með þessum tengli: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Þú ert þegar með tengilið með þessum tengli: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Eru %s og %s sami einstaklingurinn?</string>
|
||||
<string name="duplicate_link_dialog_text_2">Eru %1$s og %2$s sami einstaklingurinn?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -287,7 +296,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Annar einstaklingur</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s og %s sendu þér sama tengilinn.\n\nAnnar þeirra gæti verið að reyna að finna út hverjir tengiliðirnir þínir eru.\n\nEkki segja þeim að þú hafir fengið sama tengil frá einhverjum öðrum.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s og %2$s sendu þér sama tengilinn.\n\nAnnar þeirra gæti verið að reyna að finna út hverjir tengiliðirnir þínir eru.\n\nEkki segja þeim að þú hafir fengið sama tengil frá einhverjum öðrum.</string>
|
||||
<string name="pending_contact_updated_toast">Tengiliður í bið uppfærður</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Kynntu tengiliðina þína</string>
|
||||
@@ -314,6 +323,7 @@
|
||||
<!--Connect via Bluetooth-->
|
||||
<string name="menu_item_connect_via_bluetooth">Tengjast í gegnum Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_title">Tengjast í gegnum Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_intro">Í þeim tilfellum þegar Bluetooth-tengingar virka ekki sjálfkrafa, geturðu notað þennan skjá til að tengjast handvirkt.\n\nTengiliðurinn þinn þarf að vera nálægt svo þetta virkri.\n\nÞið ættuð báðir/bæði að ýta á \"Byrja\" á sama tíma.</string>
|
||||
<string name="connect_via_bluetooth_already_discovering">Er þegar að reyna að tengjast með Bluetooth. Prófaðu aftur eftir dálitla stund.</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">Get ekki haldið áfram án heimildar til að nota staðsetningu</string>
|
||||
<string name="connect_via_bluetooth_start">Tengist í gegnum Bluetooth…</string>
|
||||
@@ -606,6 +616,7 @@
|
||||
<string name="dev_report_memory">Minni</string>
|
||||
<string name="dev_report_storage">Geymslurými</string>
|
||||
<string name="dev_report_connectivity">Tengingar</string>
|
||||
<string name="dev_report_network_usage">Notkun netkerfis</string>
|
||||
<string name="dev_report_build_config">Byggingaruppsetning</string>
|
||||
<string name="dev_report_logcat">Atvikaskrá forrits</string>
|
||||
<string name="dev_report_device_features">Eiginleikar tækis</string>
|
||||
@@ -648,22 +659,26 @@
|
||||
<string name="transports_help_text">Briar getur tengst við tengiliðina þína í gegnum internet, Wi-Fi eða Bluetooth.\n\nAllar internettengingar fara í gegnum Tor-netkerfið til að gæta gagnaleyndar.\n\nEf hægt er að nálgast tengilið með mörgum leiðum, notar Briar þær samhliða.</string>
|
||||
<!--Share app offline-->
|
||||
<string name="hotspot_title">Deila þessu forriti án nettengingar</string>
|
||||
<string name="hotspot_button_start_sharing">Ræsa tengipunkt</string>
|
||||
<string name="hotspot_button_stop_sharing">Stöðva tengipunkt</string>
|
||||
<string name="hotspot_progress_text_start">Set upp tengipunkt…</string>
|
||||
<string name="hotspot_notification_channel_title">Þráðlaus Wi-Fi tengipunktur</string>
|
||||
<string name="hotspot_intro">Deildu þessu forriti til einhvers í næsta nágrenni án internet-tengingar með því að nota Wi-Fi kerfi símans.
|
||||
\n\nSnjallsíminn þinn mun setja í gang Wi-Fi aðgangsstað. Fólk í nágrenninu getur tengst aðgangsstaðnum og sótt Briar-forritið frá símanum þínum.</string>
|
||||
<string name="hotspot_button_start_sharing">Ræsa aðgangsstað</string>
|
||||
<string name="hotspot_button_stop_sharing">Stöðva aðgangsstað</string>
|
||||
<string name="hotspot_progress_text_start">Set upp aðgangsstað…</string>
|
||||
<string name="hotspot_notification_channel_title">Þráðlaus Wi-Fi aðgangsstaður</string>
|
||||
<string name="hotspot_notification_title">Deiling Briar án nettengingar</string>
|
||||
<string name="hotspot_button_connected">Næsta</string>
|
||||
<string name="permission_hotspot_location_request_body">Til að útbúa Wi-Fi-aðgangsstað, þarf Briar heimild til að nota staðsetningu þína.\n\nBriar geymir ekki staðsetningar eða deilir þeim með neinum.</string>
|
||||
<string name="permission_hotspot_location_request_body">Til að útbúa Wi-Fi aðgangsstað, þarf Briar heimild til að nota staðsetningu þína.\n\nBriar geymir ekki staðsetningar eða deilir þeim með neinum.</string>
|
||||
<string name="permission_hotspot_location_denied_body">Þú hefur hafnað aðgangi að staðsetningu, en Briar þarf þessa heimild til að geta útbúið Wi-Fi-aðgangsstað.\n\nÍhugaðu að veita þennan aðgang.</string>
|
||||
<string name="wifi_settings_title">Wi-Fi-stillingar</string>
|
||||
<string name="wifi_settings_request_enable_body">Til að útbúa Wi-Fi aðgangsstað þarf Briar að nota Wi-Fi. Virkjaðu það.</string>
|
||||
<string name="hotspot_tab_manual">Handvirk</string>
|
||||
<string name="hotspot_tab_manual">Handvirkt</string>
|
||||
<!--The placeholder to be inserted into the string 'hotspot_manual_wifi': People can connect by %s-->
|
||||
<string name="hotspot_scanning_a_qr_code">skönnun QR-kóða</string>
|
||||
<string name="hotspot_scanning_a_qr_code">skanna QR-kóða</string>
|
||||
<!--Wi-Fi setup-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_wifi">Síminn þinn er að reka Wi-Fi aðgangsstað. Fólk sem vill sækja Briar getur tengst aðgangsstaðnum með því að bæta honum við í Wi-Fi stillingum tækisins síns með upplýsingunum hér fyrir neðan eða með því að %s. Þegar þau hafa tengst aðgangsstaðnum er ýtt á \'Næsta\'.</string>
|
||||
<string name="hotspot_manual_wifi_ssid">Heiti netkerfis</string>
|
||||
<string name="hotspot_qr_wifi">Síminn þinn er að reka Wi-Fi aðgangsstað. Fólk sem vill sækja Briar getur tengst aðgangsstaðnum með því að skanna þennan QR-kóða. Þegar þau hafa tengst aðgangsstaðnum er ýtt á \'Næsta\'.</string>
|
||||
<string name="hotspot_no_peers_connected">Engin tæki tengd</string>
|
||||
<plurals name="hotspot_peers_connected">
|
||||
<item quantity="one">%s tæki tengt</item>
|
||||
@@ -671,40 +686,61 @@
|
||||
</plurals>
|
||||
<!--Download link-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_site">Síminn þinn er að reka Wi-Fi aðgangsstað. Fólk sem er tengt aðgangsstaðnum getur sótt Briar með því að skrifa eftirfarandi slóð inn í vafra eða %s.</string>
|
||||
<string name="hotspot_manual_site_address">Vistfang (URL)</string>
|
||||
<string name="hotspot_qr_site">Síminn þinn er að reka Wi-Fi aðgangsstað. Fólk sem er tengt aðgangsstaðnum getur sótt Briar með því að skanna þennan QR-kóða.</string>
|
||||
<!--e.g. Download Briar 1.2.20-->
|
||||
<string name="website_download_title">Sækja %s</string>
|
||||
<string name="website_download_intro">Einhver í nágrenninu hefur deilt %s með þér.</string>
|
||||
<string name="website_download_outro">Eftir að niðurhalinu er lokið, skaltu opna sóttu skrána og setja hana upp.</string>
|
||||
<string name="website_troubleshooting_title">Lausn á vandamálum</string>
|
||||
<string name="website_troubleshooting_1">Ef þú getur ekki sótt forritið, ættirðu að prófa það með öðrum vafra.</string>
|
||||
<string name="website_troubleshooting_2_old">Til að setja upp forritið sem þú sóttir, gætirðu þurft að leyfa uppsetningar á forritum af \"Óþekktum uppruna - Unknown sources\" í kerfisstillingunum. Síðan gætirðu þurft að ná aftur í forritið. Við mælum með að stillingin \"Óþekktur uppruni - Unknown sources\" sé gert óvirkt aftur eftir að forritið hefur verið sett upp.</string>
|
||||
<string name="website_troubleshooting_2_new">Til að setja upp forritið sem þú sóttir, gætirðu þurft að leyfa vafranum uppsetningar á forritum af óþekktum uppruna. Við mælum með að heimild vafrans til uppsetningar frá óþekktum uppruna sé gert óvirk aftur eftir að forritið hefur verið sett upp.</string>
|
||||
<string name="hotspot_help_wifi_title">Vandamál við að tengjast við Wi-Fi:</string>
|
||||
<string name="hotspot_help_wifi_1">Prófaðu að gera Wi-Fi óvirkt og virkja það aftur á báðum símunum og reyndu svo aftur.</string>
|
||||
<string name="hotspot_help_wifi_2">Ef síminn þinn kvartar yfir að Wi-Fi kerfið sé ekki með neina internettengingu, skaltu segjast vilja samt halda tengingunni.</string>
|
||||
<string name="hotspot_help_wifi_3">Endurræstu símann sem er að keyra Wi-Fi aðgangsstaðinn, ræstu síðan Briar og prófaðu aftur að deila.</string>
|
||||
<string name="hotspot_help_site_title">Vandamál við að skoða staðvært vefsvæði:</string>
|
||||
<string name="hotspot_help_site_1">Gakktu úr skugga um að þú hafir sett vistfangið inn nákvæmlega eins og sýnt er. Smávægileg frávik valta því að þetta virkar ekki.</string>
|
||||
<string name="hotspot_help_site_2">Gakktu úr skugga um að síminn þinn sé ennþá tengdur við rétta Wi-Fi netið (sjá fyrir ofan) þegar þú reynir að tengjast vefsvæðinu.</string>
|
||||
<string name="hotspot_help_site_3">Ef þú ert með eldveggjarhugbúnað í gangi, skaltu vera viss um að það sé ekki að loka fyrir aðgang.</string>
|
||||
<string name="hotspot_help_site_4">Ef þú getur skoðað vefsvæðið en ekki sótt Briar-forritið, ættirðu að prófa það með öðrum vafra.</string>
|
||||
<string name="hotspot_help_fallback_title">Virkar ekkert?</string>
|
||||
<string name="hotspot_help_fallback_intro">Þú getur reynt að vista forritið sem .apk skrá til að deila því á einhvern annan máta. Þegar skráin hefur verið færð yfir á hitt tækið, má nota hana til að setja upp Briar.
|
||||
\n\nÁbending: Til að deila í gegnum Bluetooth, gætirðu fyrst þurft að endurnefna hana þannig að nafnið endi á .zip.</string>
|
||||
<string name="hotspot_help_fallback_button">Vista forrit</string>
|
||||
<!--error handling-->
|
||||
<string name="hotspot_error_intro">Eitthvað fór úrskeiðis þegar reynt var að deila forritinu með Wi-Fi:</string>
|
||||
<string name="hotspot_error_no_wifi_direct">Þetta tæki styður ekki beint Wi-Fi samband.</string>
|
||||
<string name="hotspot_error_start_callback_failed">Tengipunktur ræstist ekki: villa %s</string>
|
||||
<string name="hotspot_error_start_callback_failed_unknown">Tengipunktur ræstist ekki vegna óþekktrar villu, ástæðan er %d</string>
|
||||
<string name="hotspot_error_start_callback_no_group_info">Tengipunktur ræstist ekki: engar hópupplýsingar</string>
|
||||
<string name="hotspot_error_start_callback_failed">Aðgangsstaður ræstist ekki: villa %s</string>
|
||||
<string name="hotspot_error_start_callback_failed_unknown">Aðgangsstaður ræstist ekki vegna óþekktrar villu, ástæðan er %d</string>
|
||||
<string name="hotspot_error_start_callback_no_group_info">Aðgangsstaður ræstist ekki: engar hópupplýsingar</string>
|
||||
<string name="hotspot_error_web_server_start">Villa við að ræsa vefþjón</string>
|
||||
<string name="hotspot_error_web_server_serve">Villa við að birta vefsvæði.\n\nSendu umsögn (með naflausum gögnum) í gegnum Briar forritið ef vandamálið er viðvarandi.</string>
|
||||
<string name="hotspot_flag_test">Aðvörun: Þetta forrit var sett upp með Android Studio og er EKKI hægt að setja upp á öðru tæki.</string>
|
||||
<string name="hotspot_error_framework_busy">Tekst ekki að ræsa aðgangsstaðinn.\n\nEf þú ert að keyra annan aðgangsstað eða ert að deila internettengingunni þinni í gegnum Wi-Fi, skaltu slökkva á því og prófa síðan aftur.</string>
|
||||
<!--Transfer Data via Removable Drives-->
|
||||
<string name="removable_drive_menu_title">Tengjast í gegnum útskiptanlegt drif</string>
|
||||
<string name="removable_drive_intro">Ef þú nærð ekki að tengjast tengiliðnum þínum í gegnum internet, Wi-Fi eða Bluetooth, getur Briar einnig flutt skilaboð á útskiptanleg drif á borð við USB-minnislykil eða SD-minniskort.</string>
|
||||
<string name="removable_drive_explanation">Ef þú nærð ekki að tengjast tengiliðnum þínum í gegnum internet, Wi-Fi eða Bluetooth, getur Briar einnig flutt skilaboð á útskiptanleg drif á borð við USB-minnislykil eða SD-minniskort.\n\nÞegar þú sérð hnappinn \"Senda gögn\", verða öll gögn sem bíða eftir að verða send til tengiliðarins skrifuð á útskiptanlega drifið. Þar má telja einkaskilaboð, viðhengi, blogg, spjallsvæði og einkahópar.\n\nAlltsaman verður dulritað áður en það er skrifað á útskiptanlega drifið.\n\nÞegar tengiliðurinn fær svo útskiptanlega drifið í hendurnar, getur hann notað hnappinn \"Taka við gögnum\" til að flytja öll skilaboðin inn í Briar.</string>
|
||||
<string name="removable_drive_title_send">Senda gögn</string>
|
||||
<string name="removable_drive_title_receive">Taka við gögnum</string>
|
||||
<string name="removable_drive_send_intro">Ýttu á hnappinn hér fyrir neðan til að útbúa nýja skrá sem inniheldur dulrituðu skilaboðin. Þú getur valið hvar skráin verður vistuð.\n\nEf þú ætlar að vista skrána á útskiptanlegt drif, skaltu setja það í samband núna.</string>
|
||||
<string name="removable_drive_send_no_data">Það eru engin skilaboð sem bíða eftir að vera send til þessa tengiliðar.</string>
|
||||
<string name="removable_drive_send_not_supported">Þessi tengiliður er að nota gamla útgáfu af Briar eða gamalt tæki sem styður ekki þennan eiginleika.</string>
|
||||
<string name="removable_drive_send_button">Veldu skrá til að flytja út</string>
|
||||
<string name="removable_drive_ongoing">Bíddu eftir að verk sem er í gangi klárist</string>
|
||||
<string name="removable_drive_receive_intro">Ýttu á hnappinn hér fyrir neðan til að velja skrána sem tengiliðurinn sendi þér.\n\nEf skráin er á útskiptanlegu drifi, skaltu tengja það núna.</string>
|
||||
<string name="removable_drive_receive_button">Veldu skrá til að flytja inn</string>
|
||||
<string name="removable_drive_success_send_title">Útflutningur tókst</string>
|
||||
<string name="removable_drive_success_send_text">Tókst að flytja út gögn. Þú hefur núna 28 daga til að koma skránni til tengiliðarins þíns.\n\nEf skráin er á útskiptanlegu drifi, skaltu nota táknið í stöðustikunni til að spýta út drifinu áður en þú aftengir það.</string>
|
||||
<string name="removable_drive_success_receive_title">Innflutningur tókst</string>
|
||||
<string name="removable_drive_success_receive_text">Öll dulrituð skilaboð inni í þessari skrá hafa verið móttekin.</string>
|
||||
<string name="removable_drive_error_send_title">Villa við útflutning gagna</string>
|
||||
<string name="removable_drive_error_send_text">Villa kom upp við að skrifa gögn í skrána.\n\nEf þú ert að nota útskiptanlegt drif, gakkti þá úr skugga um að það sé rétt tengt og prófaðu svo aftur.\n\nEf villan heldur áfram að birtast, skaltu endilega senda Briar-teyminu línu og láta þau vita af vandamálinu.</string>
|
||||
<string name="removable_drive_error_receive_title">Villa í innflutningi gagna</string>
|
||||
<string name="removable_drive_error_receive_text">Valda skráin innihélt ekkert sem Briar gat lagt kennsl á.\n\nVertu viss um að þú hafir valið rétta skrá.\n\nEf tengiliðurinn þinn útbjó skrána fyrir meira en 28 dögum síðan, mun Briar ekki geta þekkt hana.</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_alice">Lísa</string>
|
||||
|
||||
@@ -50,10 +50,17 @@
|
||||
<item quantity="one">Questa è una versione di prova di Briar. Il tuo account scadrà fra %d giorno e non può essere rinnovato.</item>
|
||||
<item quantity="other">Questa è una versione di prova di Briar. Il tuo account scadrà fra %d giorni e non può essere rinnovato.</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="one">Android 4 non è più supportato. Briar smetterà di funzionare il %s (tra %d giorno). Installa Briar in un dispositivo più recente e crea un nuovo account.</item>
|
||||
<item quantity="other">Android 4 non è più supportato. Briar smetterà di funzionare il %s (tra %d giorni). Installa Briar in un dispositivo più recente e crea un nuovo account.</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">Questo software è scaduto.\nGrazie per il test!</string>
|
||||
<string name="download_briar">Per continuare a utilizzare Briar, scarica l\'ultima versione.</string>
|
||||
<string name="create_new_account">Avrai bisogno di creare un nuovo account, ma puoi usare lo stesso nickname.</string>
|
||||
<string name="download_briar_button">Scarica l\'ultima versione</string>
|
||||
<string name="old_android_expiry_date_reached">Briar non funziona più su Android 4.\nInstallalo in un dispositivo più recente.</string>
|
||||
<string name="old_android_delete_account">Puoi toccare il pulsante sottostante per eliminare il tuo account da questo dispositivo.</string>
|
||||
<string name="delete_account_button">Cancella Account</string>
|
||||
<string name="startup_open_database">Decrittazione del database...</string>
|
||||
<string name="startup_migrate_database">Aggiornamento del database...</string>
|
||||
<string name="startup_compact_database">Compattazione del database…</string>
|
||||
@@ -280,7 +287,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">Hai già un contatto in attesa con questo link: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Hai già un contatto con questo link: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s e %s sono la stessa persona?</string>
|
||||
<string name="duplicate_link_dialog_text_2">Sono %1$s e %2$s la stessa persona?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -289,30 +296,30 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Persone diverse</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s e %s ti hanno inviato lo stesso link.\n\nUno dei due potrebbe tentare di scoprire chi sono i tuoi contatti.\n\nNon dirgli che hai ricevuto lo stesso link da qualcun altro.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s e %2$s ti hanno inviato lo stesso link.\n\nUno dei due potrebbe tentare di scoprire chi sono i tuoi contatti.\n\nNon dirgli che hai ricevuto lo stesso link da qualcun altro.</string>
|
||||
<string name="pending_contact_updated_toast">Contatto in attesa aggiornato</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Introduzione tuoi contatti</string>
|
||||
<string name="introduction_onboarding_title">Presenta i tuoi contatti</string>
|
||||
<string name="introduction_onboarding_text">Puoi presentare i tuoi contatti fra di loro, così non hanno bisogno di incontrarsi di persona per connettersi a Briar.</string>
|
||||
<string name="introduction_menu_item">Crea l\'introduzione</string>
|
||||
<string name="introduction_activity_title">Seleziona Contatto</string>
|
||||
<string name="introduction_not_possible">Hai già un introduzione in corso con questi contatti. Si prega di consentire che prima questo finisca. Se tu o i tuoi contatti sono raramente online, questo potrebbe richiedere un po\' di tempo.</string>
|
||||
<string name="introduction_message_title">Introduzione Contatti</string>
|
||||
<string name="introduction_not_possible">Ti stai già presentando con questi contatti. Prima attendi che finisca. Se tu o i tuoi contatti siete raramente online, potrebbe volerci un po\' di tempo.</string>
|
||||
<string name="introduction_message_title">Presenta i contatti</string>
|
||||
<string name="introduction_message_hint">Aggiungi un messaggio (facoltativo)</string>
|
||||
<string name="introduction_button">Crea l\'introduzione</string>
|
||||
<string name="introduction_sent">La tua introduzione è stata inviata.</string>
|
||||
<string name="introduction_sent">La tua presentazione è stata inviata.</string>
|
||||
<string name="introduction_error">C\'è stato un errore nella creazione dell\'introduzione</string>
|
||||
<string name="introduction_request_sent">Hai richiesto di introdurre %1$s a %2$s.</string>
|
||||
<string name="introduction_request_received">%1$s ha chiesto di introdurti in %2$s. Vuoi aggiungere %2$s alla tua lista contatti?</string>
|
||||
<string name="introduction_request_exists_received">%1$s ha chiesto di introdurti in %2$s, ma %2$s è già nella tua lista contatti. Dato che %1$s può non saperlo, puoi comunque rispondere:</string>
|
||||
<string name="introduction_request_answered_received">%1$s ha richiesto di introdurti a %2$s.</string>
|
||||
<string name="introduction_response_accepted_sent">Hai accettato l\'introduzione a %1$s.</string>
|
||||
<string name="introduction_request_sent">Hai chiesto di presentare %1$s a %2$s.</string>
|
||||
<string name="introduction_request_received">%1$s ha chiesto di presentarti a %2$s. Vuoi aggiungere %2$s alla tua lista contatti?</string>
|
||||
<string name="introduction_request_exists_received">%1$s ha chiesto di presentarti a %2$s, ma %2$s è già nella tua lista contatti. Dato che %1$s potrebbe non saperlo, puoi comunque rispondere:</string>
|
||||
<string name="introduction_request_answered_received">%1$s ha chiesto di presentarti a %2$s.</string>
|
||||
<string name="introduction_response_accepted_sent">Hai accettato di presentarti a %1$s.</string>
|
||||
<string name="introduction_response_accepted_sent_info">Prima che %1$s venga aggiunto ai tuoi contatti, dovranno anche loro accettare l\'introduzione. Questo potrebbe richiedere un po\' di tempo.</string>
|
||||
<string name="introduction_response_declined_sent">Hai declinato l\'introduzione a %1$s.</string>
|
||||
<string name="introduction_response_declined_sent">Hai rifiutato di presentarti a %1$s.</string>
|
||||
<string name="introduction_response_declined_auto">L\'introduzione a %1$s è stata rifiutata automaticamente.</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_by_introducee">%1$s dice che %2$s ha declinato l\'introduzione.</string>
|
||||
<string name="introduction_response_accepted_received">%1$s ha accettato di presentarsi a %2$s.</string>
|
||||
<string name="introduction_response_declined_received">%1$s ha rifiutato di presentarsi a %2$s.</string>
|
||||
<string name="introduction_response_declined_received_by_introducee">%1$s dice che %2$s ha rifiutato di presentarsi.</string>
|
||||
<!--Connect via Bluetooth-->
|
||||
<string name="menu_item_connect_via_bluetooth">Connessione attraverso Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_title">Connessione attraverso Bluetooth</string>
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
<string name="download_briar">Briarの使用を続けるならば、最新リリースをダウンロードしてください。</string>
|
||||
<string name="create_new_account">新しいアカウントを作成する必要があります。同じニックネームも使用できます。</string>
|
||||
<string name="download_briar_button">最新版をダウンロード</string>
|
||||
<string name="delete_account_button">アカウントを削除</string>
|
||||
<string name="startup_open_database">データベースの復号化中…</string>
|
||||
<string name="startup_migrate_database">データベースをアップグレード中…</string>
|
||||
<string name="startup_compact_database">データベースの圧縮中…</string>
|
||||
@@ -258,7 +259,6 @@
|
||||
<string name="duplicate_link_dialog_text_1">既に保留中の連絡先があります。リンク:%s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">既に連絡先があります。リンク:%s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%sと%sは同じ人ですか?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -267,7 +267,6 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">別の人</string>
|
||||
<string name="duplicate_link_dialog_text_3">%sと%sから同じリンクを受信しました。\n\nどちらかがあなたの連絡先の内容を知ろうとしている可能性があります。\n\n他の人から同じリンクを受け取ったことを伝えないでください。</string>
|
||||
<string name="pending_contact_updated_toast">保留中の連絡先が更新されました</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">連絡先を紹介</string>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<string name="setup_name_explanation">Jūsų slapyvardis bus rodomas šalia bet kokio jūsų skelbiamo turinio. Sukūrę paskyrą, slapyvardžio pakeisti nebegalėsite.</string>
|
||||
<string name="setup_next">Kitas</string>
|
||||
<string name="setup_password_intro">Pasirinkite slaptažodį</string>
|
||||
<string name="setup_password_explanation">Jūsų Briar paskyra yra saugoma šifruotu pavidalu jūsų įrenginyje, o ne debesijoje. Jei pamiršite savo slaptažodį ar pašalinsite Briar programėlę, daugiau nebegalėsite atkurti savo paskyros.\n\nPasirinkite ilgą slaptažodį, kurį sunku atspėti, kaip pavyzdžiui, keturis atsitiktinius žodžius ar dešimt atsitiktinių raidžių, skaitmenų ir simbolių.</string>
|
||||
<string name="setup_password_explanation">Jūsų Briar paskyra yra saugoma šifruotu pavidalu jūsų įrenginyje, o ne debesijoje. Jei pamiršite savo slaptažodį ar pašalinsite Briar programėlę, daugiau nebegalėsite atkurti savo paskyros.\n\nPasirinkite ilgą slaptažodį, kurį būtų sunku atspėti, pavyzdžiui, keturis atsitiktinius žodžius ar dešimt atsitiktinių raidžių, skaitmenų ir simbolių.</string>
|
||||
<string name="setup_doze_title">Foniniai ryšiai</string>
|
||||
<string name="setup_doze_intro">Norint gauti žinutes, Briar turi išlikti fone prisijungusi.</string>
|
||||
<string name="setup_doze_explanation">Norint gauti žinutes, Briar turi išlikti fone prisijungusi. Išjunkite akumuliatoriaus naudojimo optimizavimą, kad Briar galėtų išlikti prisijungusi.</string>
|
||||
@@ -19,7 +19,7 @@
|
||||
<string name="create_account_button">Sukurti paskyrą</string>
|
||||
<string name="more_info">Daugiau informacijos</string>
|
||||
<string name="don_t_ask_again">Daugiau nebeklausti</string>
|
||||
<string name="setup_huawei_text">Bakstelėkite žemiau esantį mygtuką ir įsitikinkite, kad \"Apsaugotų programėlių\" rodinyje Briar yra apsaugota.</string>
|
||||
<string name="setup_huawei_text">Bakstelėkite žemiau esantį mygtuką ir įsitikinkite, kad „Apsaugotų programėlių“ rodinyje Briar yra apsaugota.</string>
|
||||
<string name="setup_huawei_button">Apsaugoti Briar</string>
|
||||
<string name="setup_huawei_help">Jei Briar nebus pridėta į apsaugotų programėlių sąrašą, ji negalės veikti fone.</string>
|
||||
<string name="setup_huawei_app_launch_text">Bakstelėkite mygtuką žemiau, atverkite langą „Programų paleidimas (angl. App launch)“ ir įsitikinkite, kad Briar yra nustatyta į „Tvarkyti rankiniu būdu (angl. Manage manually)“.</string>
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="sign_in_button">Prisijungti</string>
|
||||
<string name="forgotten_password">Aš pamiršau savo slaptažodį</string>
|
||||
<string name="dialog_title_lost_password">Prarastas slaptažodis</string>
|
||||
<string name="dialog_message_lost_password">Jūsų Briar paskyra yra saugoma šifruotu pavidalu jūsų įrenginyje, o ne debesijoje, taigi, negalime atstatyti jūsų slaptažodžio. Ar norėtumėte ištrinti savo paskyrą ir pradėti iš naujo?\n\nDėmesio: Jūsų tapatybės, žinutės ir adresatai bus prarasti visiems laikams.</string>
|
||||
<string name="dialog_message_lost_password">Jūsų Briar paskyra yra saugoma šifruotu pavidalu jūsų įrenginyje, o ne debesijoje, todėl negalime atstatyti jūsų slaptažodžio. Ar norėtumėte ištrinti savo paskyrą ir pradėti iš naujo?\n\nDėmesio: Jūsų tapatybės, žinutės ir adresatai bus prarasti visiems laikams.</string>
|
||||
<string name="startup_failed_activity_title">Briar paleidimo nesėkmė</string>
|
||||
<string name="startup_failed_clock_error">Briar nepavyko pasileisti, nes jūsų įrenginio laikrodis rodo neteisingą laiką.\n\nNustatykite savo įrenginyje teisingą laiką ir bandykite dar kartą.</string>
|
||||
<string name="startup_failed_db_error">Briar nepavyko atverti duomenų bazės su jūsų paskyra, adresatais ir žinutėmis.\n\nAtnaujinkite programėlę į naujausią versiją ir bandykite dar kartą arba nusistatykite naują paskyrą, slaptažodžio užklausos ekrane pasirinkę „Aš pamiršau savo slaptažodį“.</string>
|
||||
@@ -52,10 +52,19 @@
|
||||
<item quantity="many">Tai yra bandomoji Briar versija. Jūsų paskyros galiojimas pasibaigs po %d dienų ir negalės būti pratęstas.</item>
|
||||
<item quantity="other">Tai yra bandomoji Briar versija. Jūsų paskyros galiojimas pasibaigs po %d dienos ir negalės būti pratęstas.</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="one">„Android“ 4 yra daugiau nebepalaikoma. Briar nustos veikti ties %s (po %d dienos). Įsidiekite Briar naujesniame įrenginyje ir susikurkite naują paskyrą.</item>
|
||||
<item quantity="few">„Android“ 4 yra daugiau nebepalaikoma. Briar nustos veikti ties %s (po %d dienų). Įsidiekite Briar naujesniame įrenginyje ir susikurkite naują paskyrą.</item>
|
||||
<item quantity="many">„Android“ 4 yra daugiau nebepalaikoma. Briar nustos veikti ties %s (po %d dienų). Įsidiekite Briar naujesniame įrenginyje ir susikurkite naują paskyrą.</item>
|
||||
<item quantity="other">„Android“ 4 yra daugiau nebepalaikoma. Briar nustos veikti ties %s (po %d dienos). Įsidiekite Briar naujesniame įrenginyje ir susikurkite naują paskyrą.</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">Programinės įrangos galiojimas pasibaigė.\nDėkojame, kad išbandėte!</string>
|
||||
<string name="download_briar">Norėdami ir toliau naudotis Briar, atsisiųskite naujausią programos laidą.</string>
|
||||
<string name="create_new_account">Jūs turėsite susikurti paskyrą, tačiau galėsite naudoti tą patį slapyvardį.</string>
|
||||
<string name="download_briar_button">Atsisiųsti naujausią laidą</string>
|
||||
<string name="old_android_expiry_date_reached">Briar daugiau nebeveikia įrenginiuose su „Android“ 4.\nĮsidiekite Briar naujesniame įrenginyje.</string>
|
||||
<string name="old_android_delete_account">Galite bakstelėti ant žemiau esančio mygtuko, norėdami ištrinti paskyrą iš šio įrenginio.</string>
|
||||
<string name="delete_account_button">Ištrinti paskyrą</string>
|
||||
<string name="startup_open_database">Iššifruojama duomenų bazė…</string>
|
||||
<string name="startup_migrate_database">Naujinama duomenų bazė…</string>
|
||||
<string name="startup_compact_database">Suspaudžiama duomenų bazė…</string>
|
||||
@@ -161,7 +170,7 @@
|
||||
<string name="error">Klaida</string>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">Nėra rodytinų adresatų</string>
|
||||
<string name="no_contacts_action">Norėdami pridėti adresatą, bakstelėkite + piktogramą</string>
|
||||
<string name="no_contacts_action">Norėdami pridėti adresatą, bakstelėkite „+“ piktogramą</string>
|
||||
<string name="date_no_private_messages">Žinučių nėra.</string>
|
||||
<string name="no_private_messages">Nėra rodytinų žinučių</string>
|
||||
<string name="message_hint">Nauja žinutė</string>
|
||||
@@ -298,7 +307,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">Jūs jau turite laukiančią adresato užklausą su šia nuoroda: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Jau turite adresatą su šia nuoroda: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Ar %s ir %s yra tas pats asmuo?</string>
|
||||
<string name="duplicate_link_dialog_text_2">Ar %1$s ir %2$s yra tas pats asmuo?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -307,7 +316,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Kitas asmuo</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s ir %s išsiuntė jums tą pačią nuorodą.\n\nGali būti, kad vienas iš šių asmenų bando sužinoti kas yra jūsų adresatų sąraše.\n\nNesakykite šiems asmenims, kad gavote tokią pačią nuorodą iš kito asmens.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s ir %2$s išsiuntė jums tą pačią nuorodą.\n\nGali būti, kad vienas iš šių asmenų bando sužinoti kas yra jūsų adresatų sąraše.\n\nNesakykite šiems asmenims, kad gavote tokią pačią nuorodą iš kito asmens.</string>
|
||||
<string name="pending_contact_updated_toast">Laukiantis adresatas atnaujintas</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Supažindinkite savo adresatus</string>
|
||||
@@ -343,7 +352,7 @@
|
||||
<string name="connect_via_bluetooth_error_not_supported">Įrenginys nepalaiko Bluetooth.</string>
|
||||
<!--Private Groups-->
|
||||
<string name="groups_list_empty">Nėra rodytinų grupių</string>
|
||||
<string name="groups_list_empty_action">Norėdami sukurti grupę ar paprašyti savo adresatų pradėti su jumis bendrinti grupes, bakstelėkite + piktogramą</string>
|
||||
<string name="groups_list_empty_action">Norėdami sukurti grupę ar paprašyti savo adresatų pradėti su jumis bendrinti grupes, bakstelėkite „+“ piktogramą</string>
|
||||
<string name="groups_created_by">Sukūrė %s</string>
|
||||
<plurals name="messages">
|
||||
<item quantity="one">%d žinutė</item>
|
||||
@@ -370,14 +379,14 @@
|
||||
<string name="groups_leave_dialog_message">Ar tikrai norite išeiti iš šios grupės?</string>
|
||||
<string name="groups_dissolve">Išformuoti grupę</string>
|
||||
<string name="groups_dissolve_dialog_title">Patvirtinkite grupės išformavimą</string>
|
||||
<string name="groups_dissolve_dialog_message">Ar tikrai norite išformuoti šią grupę?\n\nVisi kiti nariai negalės tęsti savo pokalbio ir gali nebegauti naujausių žinučių.</string>
|
||||
<string name="groups_dissolve_dialog_message">Ar tikrai norite išformuoti šią grupę?\n\nVisi kiti nariai nebegalės tęsti savo pokalbio ir gali nebegauti naujausių žinučių.</string>
|
||||
<string name="groups_dissolve_button">Išformuoti</string>
|
||||
<string name="groups_dissolved_dialog_title">Grupė išformuota</string>
|
||||
<string name="groups_dissolved_dialog_message">Šios grupės įkūrėjas ją išformavo.\n\nJūs daugiau nebegalite rašyti žinučių į šią grupę ir galite nebegauti visų parašytų įrašų.</string>
|
||||
<!--Private Group Invitations-->
|
||||
<string name="groups_invitations_title">Pakvietimai į grupę</string>
|
||||
<string name="groups_invitations_invitation_sent">Jūs pakvietėte, kad %1$s prisijungtų prie grupės \"%2$s\".</string>
|
||||
<string name="groups_invitations_invitation_received">%1$s pakvietė jus prisijungti prie grupės \"%2$s\".</string>
|
||||
<string name="groups_invitations_invitation_sent">Jūs pakvietėte, kad %1$s prisijungtų prie grupės „%2$s“.</string>
|
||||
<string name="groups_invitations_invitation_received">%1$s pakvietė jus prisijungti prie grupės „%2$s“.</string>
|
||||
<string name="groups_invitations_joined">Prisijungta prie grupės</string>
|
||||
<string name="groups_invitations_declined">Pakvietimas į grupę atmestas</string>
|
||||
<plurals name="groups_invitations_open">
|
||||
@@ -401,7 +410,7 @@
|
||||
<string name="groups_reveal_invisible">Adresatų sąryšiai nėra matomi grupei</string>
|
||||
<!--Forums-->
|
||||
<string name="no_forums">Nėra rodytinų forumų</string>
|
||||
<string name="no_forums_action">Norėdami sukurti forumą ar paprašyti savo adresatų pradėti su jumis bendrinti forumus, bakstelėkite + piktogramą</string>
|
||||
<string name="no_forums_action">Norėdami sukurti forumą ar paprašyti savo adresatų pradėti su jumis bendrinti forumus, bakstelėkite „+“ piktogramą</string>
|
||||
<string name="create_forum_title">Sukurkite forumą</string>
|
||||
<string name="choose_forum_hint">Pasirinkite savo forumo pavadinimą</string>
|
||||
<string name="create_forum_button">Sukurti forumą</string>
|
||||
@@ -431,14 +440,14 @@
|
||||
<string name="forum_shared_snackbar">Forumas bendrinamas su pasirinktais adresatais</string>
|
||||
<string name="forum_share_message">Pridėkite žinutę (nebūtina)</string>
|
||||
<string name="forum_share_error">Bendrinant šį forumą, įvyko klaida.</string>
|
||||
<string name="forum_invitation_received">%1$s pradėjo bendrinti su jumis forumą \"%2$s\".</string>
|
||||
<string name="forum_invitation_sent">Jūs pradėjote bendrinti su %2$s forumą \"%1$s\".</string>
|
||||
<string name="forum_invitation_received">%1$s pradėjo bendrinti su jumis forumą „%2$s“.</string>
|
||||
<string name="forum_invitation_sent">Jūs pradėjote bendrinti su %2$s forumą „%1$s“.</string>
|
||||
<string name="forum_invitations_title">Pakvietimai į forumą</string>
|
||||
<string name="forum_invitation_exists">Jūs jau priėmėte pakvietimą į šį forumą.\n\nPriėmus daugiau pakvietimų, jūsų ryšys su forumu taps greitesnis ir patikimesnis.</string>
|
||||
<string name="forum_joined_toast">Prisijungta prie forumo</string>
|
||||
<string name="forum_declined_toast">Pakvietimas atmestas</string>
|
||||
<string name="shared_by_format">Bendrina %s</string>
|
||||
<string name="forum_invitation_already_sharing">Jau bendrinamas</string>
|
||||
<string name="forum_invitation_already_sharing">Jau bendrinama</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Jūs priėmėte pakvietimą į forumą iš %s.</string>
|
||||
<string name="forum_invitation_response_declined_sent">Jūs atmetėte pakvietimą į forumą iš %s.</string>
|
||||
<string name="forum_invitation_response_declined_auto">Pakvietimas į forumą nuo %s buvo automatiškai atmestas.</string>
|
||||
@@ -481,8 +490,8 @@
|
||||
<string name="blogs_sharing_response_declined_auto">Pakvietimas į tinklaraštį nuo %s buvo automatiškai atmestas.</string>
|
||||
<string name="blogs_sharing_response_accepted_received">%s priėmė pakvietimą į tinklaraštį.</string>
|
||||
<string name="blogs_sharing_response_declined_received">%s atmetė pakvietimą į tinklaraštį.</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$s pradėjo bendrinti su jumis tinklaraštį \"%2$s\".</string>
|
||||
<string name="blogs_sharing_invitation_sent">Jūs pradėjote bendrinti su %2$s tinklaraštį \"%1$s\".</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$s pradėjo bendrinti su jumis tinklaraštį „%2$s“.</string>
|
||||
<string name="blogs_sharing_invitation_sent">Jūs pradėjote bendrinti su %2$s tinklaraštį „%1$s“.</string>
|
||||
<string name="blogs_sharing_invitations_title">Pakvietimai į tinklaraštį</string>
|
||||
<string name="blogs_sharing_joined_toast">Tinklaraštis užprenumeruotas</string>
|
||||
<string name="blogs_sharing_declined_toast">Pakvietimas atmestas</string>
|
||||
@@ -500,7 +509,7 @@
|
||||
<string name="blogs_rss_remove_feed">Šalinti kanalą</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Ar tikrai norite pašalinti šį kanalą?\n\nĮrašai bus pašalinti iš jūsų įrenginio, tačiau liks kitų žmonių įrenginiuose.\n\nBet kokie adresatai, su kuriais bendrinote šį kanalą, gali nustoti gauti atnaujinimus.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Šalinti</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Nėra rodytinų RSS kanalų\n\nNorėdami importuoti kanalą, bakstelėkite + piktogramą</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Nėra rodytinų RSS kanalų\n\nNorėdami importuoti kanalą, bakstelėkite „+“ piktogramą</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Įkeliant jūsų kanalus, atsirado problemų. Vėliau bandykite dar kartą.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
<string name="change_profile_picture">Bakstelėkite norėdami pasikeisti profilio paveikslą</string>
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
<string name="download_briar">Briar ကို ဆက်လက်အသုံးပြုရန် နောက်ဆုံးထွက်ထားသည်ကို ဒေါင်းလုဒ်လုပ်ပါ။</string>
|
||||
<string name="create_new_account">အကောင့်အသစ်ဖွင့်ရန် လိုအပ်သော်လည်း သုံးလက်စနာမည်ပြောင်ကို ဆက်သုံးနိုင်ပါသည်။</string>
|
||||
<string name="download_briar_button">နောက်ဆုံးထွက်ထားသည်ကို ဒေါင်းလုဒ်လုပ်မည်</string>
|
||||
<string name="delete_account_button">အကောင့် ဖျက်သိမ်းမယ်</string>
|
||||
<string name="startup_open_database">အချက်အလက်အစုကို ပြန်ဖြည်နေသည်…</string>
|
||||
<string name="startup_migrate_database">အချက်အလက်အစုကို အဆင့်မြှင့်နေသည်…</string>
|
||||
<string name="startup_compact_database">အချက်အလက်အစုကို သိပ်သည်းစေရန်လုပ်နေသည်…</string>
|
||||
@@ -207,7 +208,7 @@
|
||||
<string name="dialog_title_image_support">ရုပ်ပုံများကို ဤအဆက်အသွယ်လိပ်စာသို့ ပို့လို့ရပါပြီ</string>
|
||||
<string name="dialog_message_image_support">ဤအိုင်ကွန်ကို နှိပ်ပြီး ရုပ်ပုံများကို ပူးတွဲပါ</string>
|
||||
<string name="messaging_too_many_attachments_toast">ပထမဆုံး %d ရုပ်ပုံများသာလျှင် ပို့ပါမည်</string>
|
||||
<string name="menu_contact">အဆက်အသွယ်</string>
|
||||
<string name="menu_contact">ဆက်သွယ်ရန်</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">အနီးနားရှိ အဆက်အသွယ်အား ထည့်သွင်းမယ်</string>
|
||||
<string name="face_to_face">သင်သည် ဤလူပုဂ္ဂိုလ်အား အပြင်မှာတွေ့ရှိမှသာလျှင် ၎င်း၏အဆက်အသွယ်ကို ပေါင်းထည့်လို့ရပါမည်။ \n\n ဒါမှသာလျှင် နောင်တွင် အခြားလူများ သင့်အား အယောင်ဆောင်ခြင်း သို့မဟုတ် သင့်မက်ဆေ့ချ်များဖတ်ရှုခြင်း တို့ကို တားဆီးနိုင်ပါမည်။</string>
|
||||
@@ -270,7 +271,6 @@
|
||||
<string name="duplicate_link_dialog_text_1">သင့်မှာ ဒီလင့်ခ်နဲ့ ပတ်သက်ပြီး ဆိုင်းငံ့ထားသော အဆက်အသွယ်လိပ်စာ ရှိပြီးဖြစ်သည်: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">သင့်မှာ ဒီလင့်ခ်နဲ့ အဆက်အသွယ်လိပ်စာ ရှိပြီးဖြစ်သည်: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s နှင့် %s သည် တစ်ဦးတည်း ဖြစ်ပါသလား?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -279,7 +279,6 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">နောက်တစ်ယောက် </string>
|
||||
<string name="duplicate_link_dialog_text_3">%s နှင့် %s သည် သင့်စီသို့ တူညီသောလင့်ခ်တစ်ခု မျှဝေခဲ့ပါသည်။ \n\n သူတို့ထဲမှတစ်ဦးသည် သင့်အဆက်အသွယ်များကို ရှာဖွေနေနိုင်ပါသည်။ \n\n သူတို့အား နောက်တစ်ဦးစီမှ တူညီသောလင့်ခ်ရခဲ့သည်ကို မပြောပြပါနှင့်။</string>
|
||||
<string name="pending_contact_updated_toast">ဆိုင်းငံ့ထားသော အဆက်အသွယ်ကို အပ်ဒိတ်လုပ်ပြီး</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">သင့်ရဲ့ အဆက်အသွယ်လိပ်စာများကို မိတ်ဆက်ပါ</string>
|
||||
@@ -305,8 +304,8 @@
|
||||
<string name="introduction_response_declined_received_by_introducee">%2$s မှ မိတ်ဆက်ခြင်းအား ငြင်းဆိုခဲ့သည်ကို %1$s မှ ပြောပါသည်။</string>
|
||||
<!--Connect via Bluetooth-->
|
||||
<string name="menu_item_connect_via_bluetooth">ဘလူးတုသ် နှင့် ချိတ်မယ်</string>
|
||||
<string name="connect_via_bluetooth_title">ဘလူးတုသ် နှင့် ချိတ်မယ်</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">တည်နေရာသုံးခွင့် မပါဘဲ ဆက်လက်မလုပ်ဆောင်နိုင်ပါ</string>
|
||||
<string name="connect_via_bluetooth_title">ဘလူးတုသ်မှတစ်ဆင့် ချိတ်မည်</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">တည်နေရာ သုံးခွင့်မပါဘဲ ဆက်လက် မလုပ်ဆောင်နိုင်ပါ</string>
|
||||
<string name="connect_via_bluetooth_start">ဘလူးတုသ် နှင့် ချိတ်ဆက်နေသည်...</string>
|
||||
<string name="connect_via_bluetooth_success">ဘလူးတုသ် နှင့် အောင်မြင်စွာ ချိတ်ဆက်ပြီး</string>
|
||||
<!--Private Groups-->
|
||||
@@ -564,7 +563,7 @@
|
||||
<string name="learn_more">ထပ်မံလေ့လာမယ်</string>
|
||||
<string name="disappearing_messages_summary">၎င်းစကားပြောဆိုမှုထဲရှိ နောင်မက်ဆေ့ချ်များကို 7\u00A0 ရက်အကြာတွင် အလိုအလျောက် ဖျောက်ကွယ်မယ်။</string>
|
||||
<!--Settings Actions-->
|
||||
<string name="pref_category_actions">ဆောင်ရွက်ချက်များ</string>
|
||||
<string name="pref_category_actions">လုပ်ဆောင်မှုများ</string>
|
||||
<string name="send_feedback">တုံ့ပြန်ချက် ပေးပို့မယ်</string>
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">လင့်ခ် သတိပေးချက်</string>
|
||||
@@ -631,6 +630,7 @@
|
||||
<!--Connections Screen-->
|
||||
<string name="transports_help_text">Briar သည် သင့်အဆက်အသွယ်များကို အင်တာနက်၊ ဝိုင်ဖိုင်၊ သို့မဟုတ် ဘလူးတုသ် မှတစ်ဆင့် ချိတ်ဆက်နိုင်ပါသည်။ \n\n အင်တာနက်ချိတ်ဆက်မှုအားလုံးသည် လုံခြုံရေးအတွက် Tor ကွန်ယက်မှတစ်ဆင့် ဖြတ်သန်းပါသည်။ \n\n အဆက်အသွယ်တစ်ဦးကို နည်းမျိုးစုံနှင့် ဆက်သွယ်နိုင်ခဲ့လျှင် Briar သည် နည်းမျိုးစုံအား တစ်ပြိုင်နက်တည်း အသုံးပြုနေပါသည်။</string>
|
||||
<!--Share app offline-->
|
||||
<string name="hotspot_title">ဤအက်ပ်ကို အော့ဖ်လိုင်းမျှဝေမည်</string>
|
||||
<string name="hotspot_notification_channel_title">ဝိုင်ဖိုင် ဟော့စပေါ့</string>
|
||||
<string name="hotspot_button_connected">ရှေ့သို့</string>
|
||||
<!--The placeholder to be inserted into the string 'hotspot_manual_wifi': People can connect by %s-->
|
||||
@@ -639,7 +639,7 @@
|
||||
<!--Download link-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<!--e.g. Download Briar 1.2.20-->
|
||||
<string name="website_troubleshooting_title">အကူအညီ</string>
|
||||
<string name="website_troubleshooting_title">ပြဿနာရှာဖွေပြင်ဆင်ခြင်း</string>
|
||||
<!--error handling-->
|
||||
<!--Transfer Data via Removable Drives-->
|
||||
<string name="removable_drive_success_receive_text">ဤဖိုင်တွင်ပါဝင်သည့် လျှို့ဝှက်ကုဒ်ပြောင်းမက်ဆေ့ချ်အားလုံးကို လက်ခံရရှိပါပြီ။</string>
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
<string name="download_briar">Download de laatste versie om Briar te kunnen blijven gebruiken.</string>
|
||||
<string name="create_new_account">Je moet een nieuw account aanmaken. Je kan dezelfde bijnaam gebruiken.</string>
|
||||
<string name="download_briar_button">Download de laatste versie</string>
|
||||
<string name="delete_account_button">Verwijder account</string>
|
||||
<string name="startup_open_database">Database aan het ontsleutelen…</string>
|
||||
<string name="startup_migrate_database">Database aan het upgraden…</string>
|
||||
<string name="startup_compact_database">Database comprimeren...</string>
|
||||
@@ -244,7 +245,6 @@
|
||||
<string name="duplicate_link_dialog_text_1">Je hebt al en wachtend contact met deze link: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Je hebt al een contact met deze link: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Zijn %s en %s dezelfde persoon?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -253,7 +253,6 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Ander persoon</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s en %s hebben je dezelfde link gestuurd.\n\nEen van hen kan proberen te ontdekken wie jouw contacten zijn.\n\nVertel ze niet dat je dezelfde link al van een ander persoon hebt ontvangen.</string>
|
||||
<string name="pending_contact_updated_toast">Wachtend contact is bijgewerkt</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Introduceer je contacten</string>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!--Setup-->
|
||||
<string name="setup_title">Witaj w Briar</string>
|
||||
<string name="setup_name_explanation">Twoja nazwa użytkownika będzie wyświetlana przy każdej zamieszczonej przez Ciebie treści. Nie można jej zmienić po tworzeniu konta.</string>
|
||||
@@ -22,33 +22,49 @@
|
||||
<string name="setup_huawei_text">Proszę dotknąć przycisku poniżej i upewnić się, że Briar jest na liście chronionych aplikacji.</string>
|
||||
<string name="setup_huawei_button">Chroń Briar</string>
|
||||
<string name="setup_huawei_help">Jeśli Briar nie będzie na liście chronionych aplikacji, nie będzie miał możliwości aby działać w tle.</string>
|
||||
<string name="setup_huawei_app_launch_text">Dotknij przycisku poniżej, otwórz ekran „Uruchamianie aplikacji” i upewnij się, że Briar jest ustawiony na „Zarządzaj ręcznie”.</string>
|
||||
<string name="setup_huawei_app_launch_button">Otwórz Ustawienia Baterii</string>
|
||||
<string name="setup_huawei_app_launch_help">Jeśli Briar nie jest ustawiony na „Zarządzaj ręcznie” na ekranie „Uruchamianie aplikacji”, nie będzie mógł działać w tle.</string>
|
||||
<string name="setup_xiaomi_text">Aby działać w tle, Briar musi być zablokowany na liście ostatnich aplikacji.</string>
|
||||
<string name="setup_xiaomi_button">Chroń Briar</string>
|
||||
<string name="setup_xiaomi_help">Jeżeli Briar nie jest zablokowany na liście ostatnich aplikacji, nie będzie mógł działać w tle.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Otwórz listę ostatnich aplikacji (często nazywaną też przełącznikiem aplikacji)\n\n2. Przewiń w dół na obrazku Briara aby ukazała się ikonka kłódki\n\n3. Jeśli kłódka nie jest zablokowana, dotknij, aby ją zablokować</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Otwórz listę ostatnich aplikacji (często nazywaną też przełącznikiem aplikacji)\n\n2. Przyciśnij i przytrzymaj obrazek Briara aby ukazała się ikonka kłódki\n\n3. Jeśli kłódka nie jest zablokowana, dotknij, aby ją zablokować</string>
|
||||
<string name="warning_dozed">%s nie był wstanie działać w tle</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Hasło</string>
|
||||
<string name="try_again">Złe hasło, spróbuj ponownie</string>
|
||||
<string name="dialog_title_cannot_check_password">Nie można zweryfikować hasła</string>
|
||||
<string name="dialog_message_cannot_check_password">Briar nie może sprawdzić Twojego hasła. Spróbuj ponownie uruchomić urządzenie aby rozwiązać ten problem.</string>
|
||||
<string name="sign_in_button">Zaloguj Się</string>
|
||||
<string name="forgotten_password">Zapomniałem hasło</string>
|
||||
<string name="dialog_title_lost_password">Nie pamiętam hasła</string>
|
||||
<string name="dialog_message_lost_password">Twoje konto Briar jest zaszyfrowane na Twoim urządzeniu, nie w chmurze, więc nie będzie można zresetować Twojego hasła. Czy chcesz usunąć swoje konto i stworzyć nowe?\n\nUwaga: Twoje hasła, kontakty i wiadomości będą utracone.</string>
|
||||
<string name="startup_failed_notification_title">Briar nie mógł się uruchomić</string>
|
||||
<string name="startup_failed_notification_text">Naciśnij, aby uzyskać więcej informacji</string>
|
||||
<string name="startup_failed_activity_title">Briar nie mógł się uruchomić</string>
|
||||
<string name="startup_failed_db_error">Z jakiegoś powodu Twoja baza danych Briar została uszkodzona w stopniu uniemożliwiającym naprawę. Twoje konto, dane i kontakty zostały utracone. Niestety musisz przeinstalować Briar lub utworzyć nowe konto wybierając opcje \"Zapomniałem hasła\".</string>
|
||||
<string name="startup_failed_data_too_old_error">Twoje konto zostało stworzone przez starszą wersję aplikacji i nie może zostać otwarte w tej wersji. Musisz zainstalować starszą wersję aplikacji lub utworzyć nowe konto klikając \"Zapomniałem hasła\".</string>
|
||||
<string name="startup_failed_data_too_new_error">Ta wersja aplikacji jest zbyt stara. Proszę zaktualizować program do najnowszej wersji i spróbować ponownie.</string>
|
||||
<string name="startup_failed_service_error">Briar nie był w stanie uruchomić wybranego rozszerzenia. Przeinstalowanie Briar zwykle rozwiązuje ten problem. Pamiętaj jednak, że stracisz wtedy swoje konto i wszystkie powiązanie z nim dane, gdyż Briar nie używa centralnych serwerów by przechowywać dane.</string>
|
||||
<string name="startup_failed_clock_error">Briar nie mógł się uruchomić ponieważ zegar twojego urządzenia jest źle ustawiony.\n\nUstaw prawidłowy czas na twoim urządzeniu i spróbuj ponownie.</string>
|
||||
<string name="startup_failed_db_error">Briar nie mógł otworzyć bazy danych zawierającej Twoje konto, kontakty i wiadomości.\n\nUaktualnij do najnowszej wersji aplikacji i spróbuj ponownie lub utwórz nowe konto przez wybranie opcji \"Zapomniałem hasła\" przy prośbie o podanie hasła.</string>
|
||||
<string name="startup_failed_data_too_old_error">Twoje konto zostało stworzone przez starszą wersję aplikacji i nie może zostać otwarte w tej wersji.\n\nMusisz zainstalować starszą wersję aplikacji lub utworzyć nowe konto klikając \"Zapomniałem hasła\".</string>
|
||||
<string name="startup_failed_data_too_new_error">Twoje konto zostało utworzone przez nowszą wersję aplikacji i nie może być otworzone przez tą wersję.\n\nUaktualnij aplikację do najnowszej wersji i spróbuj ponownie</string>
|
||||
<string name="startup_failed_service_error">Briar nie mógł uruchomić wymaganego komponentu.\n\nUaktualnij do najnowszej wersji aplikacji i spróbuj ponownie</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="one">To jest testowa wersja Briar. Twoje konto wygaśnie za %d dzień i nie będzie odnowione.</item>
|
||||
<item quantity="few">To jest testowa wersja Briar. Twoje konto wygaśnie za %d dni i nie będzie odnowione.</item>
|
||||
<item quantity="many">To jest testowa wersja Briar. Twoje konto wygaśnie za %d dni i nie będzie odnowione.</item>
|
||||
<item quantity="other">To jest testowa wersja Briar. Twoje konto wygaśnie za %d dni i nie będzie odnowione.</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="one">Android 4 nie jest już wspierany. Briar przestanie działać %s (za %d dzień). Zainstaluj Briar na nowszym urządzeniu i utwórz nowe konto.</item>
|
||||
<item quantity="few">Android 4 nie jest już wspierany. Briar przestanie działać %s (za %d dni). Zainstaluj Briar na nowszym urządzeniu i utwórz nowe konto.</item>
|
||||
<item quantity="many">Android 4 nie jest już wspierany. Briar przestanie działać %s (za %d dni). Zainstaluj Briar na nowszym urządzeniu i utwórz nowe konto.</item>
|
||||
<item quantity="other">Android 4 nie jest już wspierany. Briar przestanie działać %s (za %d dni). Zainstaluj Briar na nowszym urządzeniu i utwórz nowe konto.</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">Ten program wygasł.\nDziękujemy za testy!</string>
|
||||
<string name="download_briar">Aby móc nadal korzystać z Briar, pobierz najnowszą wersję.</string>
|
||||
<string name="create_new_account">Musisz utworzyć nowe konto, ale możesz użyć takiej samej nazwy użytkownika.</string>
|
||||
<string name="download_briar_button">Pobierz najnowszą wersję</string>
|
||||
<string name="old_android_expiry_date_reached">Briar nie działa już na Androidzie 4.\nZainstaluj Briar na nowszym urządzeniu.</string>
|
||||
<string name="old_android_delete_account">Możesz nacisnąć przycisk poniżej w celu usunięcia twojego konta z tego urządzenia.</string>
|
||||
<string name="delete_account_button">Skasuj Konto</string>
|
||||
<string name="startup_open_database">Deszyfruję Bazę Danych...</string>
|
||||
<string name="startup_migrate_database">Aktualizuję Bazę Danych...</string>
|
||||
<string name="startup_compact_database">Kompaktowanie Bazy Danych…</string>
|
||||
@@ -66,13 +82,33 @@
|
||||
<string name="transports_onboarding_text">Dotknij tutaj aby zmienić w jaki sposób Briar łączy się z twoimi kontaktami.</string>
|
||||
<!--Transports: Tor-->
|
||||
<string name="transport_tor">Internet</string>
|
||||
<string name="tor_device_status_online_wifi">Twój telefon jest połączony z Internetem za pomocą Wi-Fi</string>
|
||||
<string name="tor_device_status_online_mobile">Twój telefon jest połączony z Internetem przez dane komórkowe</string>
|
||||
<string name="tor_device_status_offline">Twój telefon nie jest podłączony do Internetu</string>
|
||||
<string name="tor_plugin_status_enabling">Briar łączy się z Internetem</string>
|
||||
<string name="tor_plugin_status_active">Briar jest podłączony do Internetu</string>
|
||||
<string name="tor_plugin_status_inactive">Briar nie może połączyć się z Internetem</string>
|
||||
<string name="tor_plugin_status_disabled">Briar został skonfigurowany tak, aby nie łączył się z Internetem</string>
|
||||
<string name="tor_plugin_status_disabled_mobile_data">Briar został skonfigurowany tak, aby nie używać danych komórkowych</string>
|
||||
<string name="tor_plugin_status_disabled_battery"> Briar jest skonfigurowany tak, aby nie korzystał z Internetu podczas pracy na baterii</string>
|
||||
<string name="tor_plugin_status_disabled_country_blocked">Briar został skonfigurowany tak, aby nie łączył się z Internetem w tym kraju</string>
|
||||
<!--Transports: Wi-Fi-->
|
||||
<string name="transport_lan">Wi-Fi</string>
|
||||
<string name="transport_lan_long">Ta sama sieć Wi-Fi</string>
|
||||
<string name="lan_device_status_on">Twój telefon jest połączoczy z Wi-Fi</string>
|
||||
<string name="lan_device_status_off">Twój telefon nie jest połączoczy z Wi-Fi</string>
|
||||
<string name="lan_plugin_status_enabling">Briar łączy sie z siecią Wi-Fi</string>
|
||||
<string name="lan_plugin_status_active">Briar jest podłączony do sieci Wi-Fi</string>
|
||||
<string name="lan_plugin_status_inactive">Briar nie może połączyć się z siecią Wi-Fi</string>
|
||||
<string name="lan_plugin_status_disabled">Briar jest skonfigurowany tak, aby nie korzystać z sieci Wi-Fi</string>
|
||||
<!--Transports: Bluetooth-->
|
||||
<string name="transport_bt">Bluetooth</string>
|
||||
<string name="bt_device_status_on">Bluetooth jest włączony</string>
|
||||
<string name="bt_device_status_off">Bluetooth jest wyłączony</string>
|
||||
<string name="bt_plugin_status_enabling">Briar łączy się z Bluetooth</string>
|
||||
<string name="bt_plugin_status_active">Briar połączył się z Bluetooth</string>
|
||||
<string name="bt_plugin_status_inactive">Briar nie może połączyć się z Bluetoothem</string>
|
||||
<string name="bt_plugin_status_disabled">Briar został skonfigurowany tak, aby nie używał Bluetooth</string>
|
||||
<!--Notifications-->
|
||||
<string name="reminder_notification_title">Wylogowano z Briar</string>
|
||||
<string name="reminder_notification_text">Dotknij, aby zalogować się ponownie</string>
|
||||
@@ -121,6 +157,7 @@
|
||||
<string name="open">Otwórz</string>
|
||||
<string name="change">Zmień</string>
|
||||
<string name="start">Start</string>
|
||||
<string name="finish">Koniec</string>
|
||||
<string name="no_data">Brak danych</string>
|
||||
<string name="ellipsis">...</string>
|
||||
<string name="text_too_long">Wprowadzony tekst jest zbyt długi</string>
|
||||
@@ -128,7 +165,9 @@
|
||||
<string name="fix">Napraw</string>
|
||||
<string name="help">Pomoc</string>
|
||||
<string name="sorry">Przepraszam</string>
|
||||
<string name="error_start_activity">Nie dostępne na Twoim systemie</string>
|
||||
<string name="status_heading">Status</string>
|
||||
<string name="error">Błąd</string>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">Brak kontaktów do pokazania</string>
|
||||
<string name="no_contacts_action">Dotknij ikonki + aby dodać kontakt</string>
|
||||
@@ -136,6 +175,7 @@
|
||||
<string name="no_private_messages">Brak wiadomości do pokazania</string>
|
||||
<string name="message_hint">Nowa wiadomość</string>
|
||||
<string name="message_hint_auto_delete">Nowa znikająca wiadomość</string>
|
||||
<string name="message_error">Błąd przy wysyłaniu wiadomości</string>
|
||||
<string name="image_caption_hint">Dodaj podpis (opcjonalne)</string>
|
||||
<string name="image_attach">Załącz obraz</string>
|
||||
<string name="image_attach_error">Nie udało się dołączyć obrazu(ów)</string>
|
||||
@@ -144,18 +184,47 @@
|
||||
<string name="set_contact_alias">Zmień nazwę kontaktu</string>
|
||||
<string name="set_contact_alias_hint">Nazwa kontaktu</string>
|
||||
<string name="menu_item_disappearing_messages">Znikające wiadomości</string>
|
||||
<string name="menu_item_connect_via_bluetooth">Połącz przez Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_title">Połącz przez Bluetooth</string>
|
||||
<!--The first placeholder will show a duration like "7 days". The second placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_you_enabled">Twoje wiadomości znikną po %1$s. %2$s</string>
|
||||
<!--The placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_you_disabled">Twoje wiadomości nie znikną. %1$s</string>
|
||||
<!--The first placeholder will show a contact's name. The second placeholder will show a duration like "7 days". The third placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_contact_enabled">Wiadomości od %1$sznikną po %2$s. %3$s</string>
|
||||
<plurals name="duration_minutes">
|
||||
<item quantity="one">%d minuta</item>
|
||||
<item quantity="few">%d minuty</item>
|
||||
<item quantity="many">%d minut</item>
|
||||
<item quantity="other">%d minut</item>
|
||||
</plurals>
|
||||
<plurals name="duration_hours">
|
||||
<item quantity="one">%d godzina</item>
|
||||
<item quantity="few">%d godzina</item>
|
||||
<item quantity="many">%d godzina</item>
|
||||
<item quantity="other">%d godzin(y)</item>
|
||||
</plurals>
|
||||
<plurals name="duration_days">
|
||||
<item quantity="one">%d dzień</item>
|
||||
<item quantity="few">%d dni</item>
|
||||
<item quantity="many">%d dni</item>
|
||||
<item quantity="other">%d dni</item>
|
||||
</plurals>
|
||||
<!--The first placeholder will show a contact's name. The second placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_contact_disabled">Wiadomości od %1$snie znikną. %2$s</string>
|
||||
<string name="tap_to_learn_more">Dotknij tutaj aby dowiedzieć się więcej.</string>
|
||||
<string name="auto_delete_changed_warning_title">Znikające wiadomości zmienione</string>
|
||||
<string name="auto_delete_changed_warning_message_enabled">Ponieważ zacząłeś tworzyć wiadomość, znikające wiadomości zostały włączone.</string>
|
||||
<string name="auto_delete_changed_warning_message_disabled">Ponieważ zacząłeś tworzyć wiadomość, znikające wiadomości zostały wyłączone.</string>
|
||||
<string name="auto_delete_changed_warning_send">Wyślij mimo to</string>
|
||||
<string name="delete_all_messages">Usuń wszystkie wiadomości</string>
|
||||
<string name="dialog_title_delete_all_messages">Potwierdź usunięcie wiadomości</string>
|
||||
<string name="dialog_message_delete_all_messages">Na pewno chcesz usunąć wszystkie wiadomości?</string>
|
||||
<string name="dialog_title_not_all_messages_deleted">Nie mogłem usunąć wszystkich wiadomości</string>
|
||||
<string name="dialog_message_not_deleted_ongoing_both">Wiadomości związane z trwającymi zaproszeniami i przedstawieniami nie mogą zostać usunięte, dopóki się nie zakończą.</string>
|
||||
<string name="dialog_message_not_deleted_ongoing_introductions">Wiadomości związane z trwającymi przedstawieniami nie mogą zostać usunięte dopóki te nie zostaną zakończone</string>
|
||||
<string name="dialog_message_not_deleted_ongoing_invitations">Wiadomości związane z trwającymi zaproszeniami nie mogą zostać usunięte, dopóki te procesy nie zostaną zakończone</string>
|
||||
<string name="dialog_message_not_deleted_not_all_selected_both">Aby usunąć zaproszenie lub przedstawienie należy wybrać prośbę i odpowiedź</string>
|
||||
<string name="dialog_message_not_deleted_not_all_selected_introductions">Aby usunąć przedstawienie należy wybrać prośbę i odpowiedź</string>
|
||||
<string name="dialog_message_not_deleted_not_all_selected_invitations">Aby usunąć zaproszenie należy wybrać prośbę i odpowiedź</string>
|
||||
<string name="delete_contact">Usuń kontakt</string>
|
||||
<string name="dialog_title_delete_contact">Potwierdź usunięcie kontaktu</string>
|
||||
<string name="dialog_message_delete_contact">Czy na pewno chcesz usunąć ten kontakt i wszystkie wymienione z nim wiadomości?</string>
|
||||
@@ -171,6 +240,8 @@
|
||||
<string name="dialog_message_no_image_support">Briar twoich kontaktów nie obsługuje jeszcze obrazów jako załączników. Jak wykonają aktualizację, zobaczysz inną ikonę.</string>
|
||||
<string name="dialog_title_image_support">Możesz teraz wysyłać obrazy do tego kontaktu</string>
|
||||
<string name="dialog_message_image_support">Kliknij tą ikonę aby dołączyć obrazy</string>
|
||||
<string name="messaging_too_many_attachments_toast">Tylko pierwsze%dobrazy (ów) zostanie wysłane.</string>
|
||||
<string name="menu_contact">Kontakt</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Dodaj kontakt w pobliżu</string>
|
||||
<string name="face_to_face">Musisz spotkać się z osobą którą chcesz dodać jako kontakt.\n\nTo uniemożliwi komukolwiek udawanie Ciebie lub czytanie Twoich wiadomości w przyszłości.</string>
|
||||
@@ -205,7 +276,7 @@
|
||||
<string name="your_link">Podaj ten link kontaktowi, którego chcesz dodać</string>
|
||||
<string name="link_clip_label">Link Briar</string>
|
||||
<string name="link_copied_toast">Link skopiowany</string>
|
||||
<string name="adding_contact_error">Wystąpił błąd podczas dodawaniu kontaktu</string>
|
||||
<string name="adding_contact_error">Wystąpił błąd podczas dodawania kontaktu</string>
|
||||
<string name="pending_contact_requests_snackbar">Są prośby o dodanie do kontaktów</string>
|
||||
<string name="pending_contact_requests">Prośby o dodanie do kontaktów</string>
|
||||
<string name="no_pending_contacts">Brak próśb o dodanie do kontaktów</string>
|
||||
@@ -234,8 +305,9 @@
|
||||
<string name="offline_state">Brak połączenia z Internetem</string>
|
||||
<string name="duplicate_link_dialog_title">Duplikat Linku</string>
|
||||
<string name="duplicate_link_dialog_text_1">Masz już oczekujący kontakt z tym linkiem: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Masz już kontakt z tym linkiem: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Czy %s i %s to ta sama osoba?</string>
|
||||
<string name="duplicate_link_dialog_text_2">Czy %1$s i %2$s to ta sama osoba?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -244,7 +316,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Inna osoba</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s i %s wysłał ci ten sam link.\n\nJeden z nich może próbować odkryć, kim są twoje kontakty.\n\nNie mów im, że otrzymałeś ten sam link od kogoś innego.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$si %2$s wysłał ci ten sam link.\n\nJeden z nich może próbować odkryć, kim są twoje kontakty.\n\nNie mów im, że otrzymałeś ten sam link od kogoś innego.</string>
|
||||
<string name="pending_contact_updated_toast">Oczekujący kontakt zaktualizowany</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Przedstaw swoje kontakty.</string>
|
||||
@@ -264,9 +336,20 @@
|
||||
<string name="introduction_response_accepted_sent">Zaakceptowałeś przedstawienie kontaktowi %1$s.</string>
|
||||
<string name="introduction_response_accepted_sent_info">Zanim %1$s zostanie dodany jako Twój kontakt, musi także zaakceptować przedstawienie. To może trochę potrwać.</string>
|
||||
<string name="introduction_response_declined_sent">Odrzuciłeś przedstawienie dla kontaktu%1$s.</string>
|
||||
<string name="introduction_response_declined_auto">Przedstawienie %1$s zostało automatycznie odrzucone.</string>
|
||||
<string name="introduction_response_accepted_received">%1$s zaakceptował przedstawienie kontaktowi %2$s</string>
|
||||
<string name="introduction_response_declined_received">%1$s odrzucił przedstawienie kontaktowi %2$s</string>
|
||||
<string name="introduction_response_declined_received_by_introducee">%1$s mówi, że %2$s odrzucił przedstawienie</string>
|
||||
<!--Connect via Bluetooth-->
|
||||
<string name="menu_item_connect_via_bluetooth">Połącz przez Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_title">Połącz przez Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_intro">W przypadku gdy połączenia przez Bluetooth nie działają automatycznie, możesz użyć tego ekranu do połączenia ręcznego.\n\nTwój kontakt musi znajdować się w pobliżu, żeby to zadziałało.\n\nTy i Twój kontakt powinniście jednocześnie wcisnąć \"Start\".</string>
|
||||
<string name="connect_via_bluetooth_already_discovering">Próba połączenia przez Bluetooth jest już w trakcie. Spróbuj ponownie za chwilę.</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">Nie można kontynuować bez dostępu do lokalizacji</string>
|
||||
<string name="connect_via_bluetooth_start">Łączenie przez Bluetooth...</string>
|
||||
<string name="connect_via_bluetooth_success">Udało się połączyć przez Bluetooth.</string>
|
||||
<string name="connect_via_bluetooth_error">Nie można się połączyć przez Bluetooth.</string>
|
||||
<string name="connect_via_bluetooth_error_not_supported">Bluetooth nie jest obsługiwany przez to urządzenie.</string>
|
||||
<!--Private Groups-->
|
||||
<string name="groups_list_empty">Brak grup do pokazania</string>
|
||||
<string name="groups_list_empty_action">Dotknij ikonkę + aby stworzyć grupę, lub poprosić kontakty o ich udostępnienie</string>
|
||||
@@ -314,6 +397,7 @@
|
||||
</plurals>
|
||||
<string name="groups_invitations_response_accepted_sent">Przyjąłeś zaproszenie do grupy od %s.</string>
|
||||
<string name="groups_invitations_response_declined_sent">Odrzuciłeś zaproszenie do grupy od %s.</string>
|
||||
<string name="groups_invitations_response_declined_auto">Zaproszenie do grupy od %s zostało automatycznie odrzucone.</string>
|
||||
<string name="groups_invitations_response_accepted_received">%s przyjął zaproszenie do grupy.</string>
|
||||
<string name="groups_invitations_response_declined_received">%s odrzucił zaproszenie do grupy.</string>
|
||||
<string name="sharing_status_groups">Tylko osoba która utworzyła grupę może zapraszać nowych użytkowników do grupy. Poniżej są wszyscy aktualni członkowie grupy.</string>
|
||||
@@ -366,6 +450,7 @@
|
||||
<string name="forum_invitation_already_sharing">Już udostępnione</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Przyjąłeś zaproszenie do forum od %s</string>
|
||||
<string name="forum_invitation_response_declined_sent">Odrzuciłeś zaproszenie do forum od %s</string>
|
||||
<string name="forum_invitation_response_declined_auto">Zaproszenie do forum od %s zostało automatycznie odrzucone.</string>
|
||||
<string name="forum_invitation_response_accepted_received">%s przyjął zaproszenie do forum.</string>
|
||||
<string name="forum_invitation_response_declined_received">%s odrzucił zaproszenie do forum.</string>
|
||||
<string name="sharing_status">Status Udostępniania</string>
|
||||
@@ -402,6 +487,7 @@
|
||||
<string name="blogs_sharing_snackbar">Blog udostępniony wybranym kontaktom</string>
|
||||
<string name="blogs_sharing_response_accepted_sent">Zaakceptowano zaproszenie do bloga od %s</string>
|
||||
<string name="blogs_sharing_response_declined_sent">Odrzucono zaproszenie do bloga od %s</string>
|
||||
<string name="blogs_sharing_response_declined_auto">Zaproszenie do bloga od %s zostało automatycznie odrzucone.</string>
|
||||
<string name="blogs_sharing_response_accepted_received">Użytkownik %s zaakceptował zaproszenie do bloga.</string>
|
||||
<string name="blogs_sharing_response_declined_received">Użytkownik %s odrzucił zaproszenie do bloga.</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$s udostępnił/a Ci blog \"%2$s\"</string>
|
||||
@@ -426,7 +512,10 @@
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Brak RSS do wyświetlenia\n\nDotknij ikonki + aby zaimportować kanał.</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Wystąpił problem podczas ładowania twoich kanałów RSS. Proszę spróbować ponownie później.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
<string name="change_profile_picture">Kliknij, aby zmienić swoje zdjęcie profilowe</string>
|
||||
<string name="dialog_confirm_profile_picture_title">Zmień zdjęcie profilowe</string>
|
||||
<string name="dialog_confirm_profile_picture_remark">Tylko twoje kontakty mogą zobaczyć ten obraz</string>
|
||||
<string name="change_profile_picture_failed_message">Przepraszamy, ale coś nie wypaliło przy aktualizacji twojego zdjęcia profilowego.</string>
|
||||
<!--Settings Display-->
|
||||
<string name="pref_language_title">Język & region</string>
|
||||
<string name="pref_language_changed">Te ustawienia zostaną zastosowane gdy zrestartujesz Briar. Proszę się wylogować i zrestartować Briar.</string>
|
||||
@@ -439,11 +528,19 @@
|
||||
<string name="pref_theme_system">Domyślny systemu</string>
|
||||
<!--Settings Connections-->
|
||||
<string name="network_settings_title">Połączenia</string>
|
||||
<string name="bluetooth_setting">Połącz się do kontaktów przez Bluetooth</string>
|
||||
<string name="wifi_setting">Połącz się do kontaktów w tej samej sieci Wi-Fi</string>
|
||||
<string name="tor_enable_title">Połącz się do kontaktów przez internet</string>
|
||||
<string name="tor_enable_summary">Dla zapewnienia prywatności, wszystkie połączenia przechodzą przez sieć Tor</string>
|
||||
<string name="tor_network_setting">Metoda połączenia dla sieci Tor</string>
|
||||
<string name="tor_network_setting_automatic">Automatycznie bazując na lokalizacji</string>
|
||||
<string name="tor_network_setting_without_bridges">Używaj sieci Tor bez mostów</string>
|
||||
<string name="tor_network_setting_with_bridges">Używaj sieci Tor z mostami</string>
|
||||
<string name="tor_network_setting_never">Nie łącz się z internetem</string>
|
||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
||||
<string name="tor_network_setting_summary">Automatycznie: %1$s (za %2$s)</string>
|
||||
<string name="tor_mobile_data_title">Używaj danych komórkowych</string>
|
||||
<string name="tor_only_when_charging_title">Podłącz się do internetu tylko w czasie ładowania urządzenia</string>
|
||||
<string name="tor_only_when_charging_summary">Wyłącza połączenie Internetowe, gdy urządzenie pracuje na baterii</string>
|
||||
<!--Settings Security and Panic-->
|
||||
<string name="security_settings_title">Bezpieczeństwo</string>
|
||||
@@ -508,8 +605,19 @@
|
||||
<string name="cannot_load_ringtone">Nie mogę załadować dzwonka</string>
|
||||
<!--Conversation Settings-->
|
||||
<string name="disappearing_messages_title">Znikające wiadomości</string>
|
||||
<string name="disappearing_messages_explanation_long">Włączenie tego ustawienia spowoduje, że
|
||||
nowe wiadomości w tej konwersacji automatycznie znikną po 7\u00A0dniach.
|
||||
\n\nOdliczanie u nadawcy wiadomości zacznie się po jej dostarczeniu.
|
||||
Odliczanie u odbiorcy zacznie się po tym jak odczyta wiadomość.
|
||||
\n\nWiadomości, które znikną, są oznaczone ikoną bomby.
|
||||
\n\nMiej na uwadze, że odbiorcy nadal mogą zrobić kopie wiadomości, które wysyłasz.
|
||||
\n\nJeśli zmienisz to ustawienie, zostanie ono natychmiast zastosowane do Twoich nowych wiadomości i do wiadomości Twojego
|
||||
kontaktu po otrzymaniu przez niego Twojej następnej wiadomości.
|
||||
Twój kontakt może również zmienić to ustawienie dla was obojga.</string>
|
||||
<string name="learn_more">Dowiedz się więcej</string>
|
||||
<!--Settings Feedback-->
|
||||
<string name="disappearing_messages_summary">Spraw, aby przyszłe wiadomości w tej rozmowie automatycznie znikały po 7\u00A0dniach. </string>
|
||||
<!--Settings Actions-->
|
||||
<string name="pref_category_actions">Czynności</string>
|
||||
<string name="send_feedback">Wyślij opinię</string>
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">Ostrzeżenie o linku</string>
|
||||
@@ -518,7 +626,7 @@
|
||||
<string name="link_warning_open_link">Otwórz Link</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">Zgłoś awarię w Briar</string>
|
||||
<string name="briar_crashed">Przepraszamy, wystąpił awaria w Briar</string>
|
||||
<string name="briar_crashed">Przepraszam, Briar uległ awarii</string>
|
||||
<string name="not_your_fault">To nie Twoja wina.</string>
|
||||
<string name="please_send_report">Proszę pomóż nam ulepszać Briar wysyłając raport z awarii.</string>
|
||||
<string name="report_is_encrypted">Obiecujemy, że raport z awarii jest zaszyfrowany i wysyłany bezpiecznie.</string>
|
||||
@@ -528,21 +636,32 @@
|
||||
<string name="optional_contact_email">Twój adres email (opcjonalne)</string>
|
||||
<string name="include_debug_report_crash">Załącz anonimowe dane na temat awarii</string>
|
||||
<string name="include_debug_report_feedback">Załącz anonimowe dane o tym urządzeniu</string>
|
||||
<string name="dev_report_user_info">Informacje o użytkowniku</string>
|
||||
<string name="dev_report_basic_info">Podstawowe informacje</string>
|
||||
<string name="dev_report_device_info">Informacje o urządzeniu</string>
|
||||
<string name="dev_report_stacktrace">Zrzut stosu</string>
|
||||
<string name="dev_report_time_info">Informacje o czasie</string>
|
||||
<string name="dev_report_memory">Pamięć</string>
|
||||
<string name="dev_report_storage">Storage</string>
|
||||
<string name="dev_report_connectivity">Łączenie</string>
|
||||
<string name="dev_report_network_usage">Wykorzystanie sieci</string>
|
||||
<string name="dev_report_build_config">Konfiguracja kompilacji</string>
|
||||
<string name="dev_report_logcat">Dziennik aplikacji</string>
|
||||
<string name="dev_report_device_features">Funkcje urządzenia</string>
|
||||
<string name="send_report">Wyślij raport</string>
|
||||
<string name="close">Zamknij</string>
|
||||
<string name="dev_report_sending">Wysyłanie opinii...</string>
|
||||
<string name="dev_report_sent">Wysłano opinię</string>
|
||||
<string name="dev_report_saved">Raport zapisany. Zostanie wysłany następnym razem kiedy zalogujesz się do Briar.</string>
|
||||
<string name="dev_report_error">Błąd: Nie powiodło się wysłanie raportu</string>
|
||||
<!--Sign Out-->
|
||||
<string name="progress_title_logout">Wylogowywanie z Briar...</string>
|
||||
<!--Screen Filters & Tapjacking-->
|
||||
<string name="screen_filter_title">Wykryto nakładkę na ekran</string>
|
||||
<string name="screen_filter_body">Inna aplikacja jest rysowana nad Briar. Aby bronić Twoje bezpieczeństwo, Briar nie będzie odpowiadał na dotyk gdy inna aplikacja jest rysowana nad nim.\n\nNastępujące aplikacje mogą wyświetlać nad nim:\n\n%1$s</string>
|
||||
<string name="screen_filter_body_api_30">Inna aplikacja rysuje na Briar. Aby chronić Twoje bezpieczeństwo, Briar nie reaguje na dotknięcia, gdy inna aplikacja rysuje na wierzchu.\n\nPrzejrzyj aplikacje poniżej, aby znaleźć odpowiedzialną aplikację.</string>
|
||||
<string name="screen_filter_allow">Pozwól tym aplikacjom na pozostanie na pierwszym planie</string>
|
||||
<string name="screen_filter_review_apps">Przejrzyj aplikacje</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">Dostęp do aparatu</string>
|
||||
<string name="permission_camera_request_body">Aby zeskanować kod QR, Briar potrzebuje dostępu do aparatu.</string>
|
||||
@@ -551,6 +670,10 @@
|
||||
<string name="permission_camera_location_title">Kamera i lokalizacja</string>
|
||||
<string name="permission_camera_location_request_body">Aby zeskanować kod QR, Briar potrzebuje dostępu do kamery.\n\nAby odkryć urządzenia Bluetooth, Briar potrzebuje zezwolenia na dostęp do Twojej lokalizacji.\n\nBriar nie przechowuje Twojej lokalizacji ani nie udostępnia jej nikomu.</string>
|
||||
<string name="permission_camera_denied_body">Odmówiłeś dostępu do aparatu, lecz dodawanie kontaktów wymaga jego użycia.\n\nProszę rozważyć udzielenie dostępu do aparatu</string>
|
||||
<string name="permission_location_denied_body">Zabroniłeś dostępu do Twojej lokalizacji, ale Briar potrzebuje tego uprawnienia do wykrywania urządzeń Bluetooth.\n\nRozważ przyznanie tego dostępu.</string>
|
||||
<string name="permission_location_setting_title">Ustawienia lokalizacji</string>
|
||||
<string name="permission_location_setting_body">Ustawienie lokalizacji urządzenia musi być włączone, aby można było znaleźć inne urządzenia przez Bluetooth. Włącz lokalizację, aby kontynuować. Później możesz ją ponownie wyłączyć.</string>
|
||||
<string name="permission_location_setting_button">Włącz lokalizację</string>
|
||||
<string name="qr_code">Kod QR</string>
|
||||
<string name="show_qr_code_fullscreen">Pokaż QR na pełnym ekranie</string>
|
||||
<!--App Locking-->
|
||||
@@ -561,6 +684,93 @@
|
||||
<string name="lock_is_locked">Briar jest zablokowany</string>
|
||||
<string name="lock_tap_to_unlock">Dotknij by odblokować</string>
|
||||
<!--Connections Screen-->
|
||||
<string name="transports_help_text">Briar może łączyć się z Twoimi kontaktami przez Internet, Wi-Fi lub Bluetooth.\n\nWszystkie połączenia internetowe przechodzą przez sieć Tor w celu zachowania prywatności.\n\nJeśli z kontaktem można się połączyć na wiele sposobów, Briar używa ich równolegle. </string>
|
||||
<!--Share app offline-->
|
||||
<string name="hotspot_title">Udostępnij tą aplikację offline</string>
|
||||
<string name="hotspot_intro">Udostępnij tą aplikację komuś w pobliżu bez połączenia internetowego, przez użycie WiFi Twojego telefonu.
|
||||
\n\n\Twój telefon uruchomi hotspot Wi-Fi. Ludzie w pobliżu będą mogli podłączyć się do hotspotu i pobrać aplikację Briar z twojego telefonu.</string>
|
||||
<string name="hotspot_button_start_sharing">Uruchom hotspot</string>
|
||||
<string name="hotspot_button_stop_sharing">Zatrzymaj hotspot</string>
|
||||
<string name="hotspot_progress_text_start">Ustawianie hotspotu...</string>
|
||||
<string name="hotspot_notification_channel_title">Hotspot Wi-Fi</string>
|
||||
<string name="hotspot_notification_title">Udostępnianie Briar offline</string>
|
||||
<string name="hotspot_button_connected">Następny</string>
|
||||
<string name="permission_hotspot_location_request_body">Aby utworzyć hotspot Wi-Fi, Briar potrzebuje uprawnienia do dostępu do Twojej lokalizacji.\n\nBriar nie przechowuje Twojej lokalizacji ani nie udostępnia jej nikomu.</string>
|
||||
<string name="permission_hotspot_location_denied_body">Zabroniłeś dostępu do Twojej lokalizacji, ale Briar potrzebuje tego uprawnienia do tworzenia hotspotu Wi-Fi.\n\nRozważ przyznanie tego dostępu.</string>
|
||||
<string name="wifi_settings_title">Ustawienia Wi-Fi</string>
|
||||
<string name="wifi_settings_request_enable_body">Aby utworzyć hotspot Wi-Fi, Briar potrzebuje użyć Wi-Fi. Włącz Wi-Fi.</string>
|
||||
<string name="hotspot_tab_manual">Manualne</string>
|
||||
<!--The placeholder to be inserted into the string 'hotspot_manual_wifi': People can connect by %s-->
|
||||
<string name="hotspot_scanning_a_qr_code">skanowanie kodu QR</string>
|
||||
<!--Wi-Fi setup-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_wifi">Twój telefon udostępnia hotspot Wi-Fi. Osoby, które chcą pobrać Briar, mogą połączyć się z hotspotem, dodając go w ustawieniach Wi-Fi urządzenia, korzystając z poniższych informacji lub korzystając z %s. Gdy połączą się z hotspotem, naciśnij „Dalej”.</string>
|
||||
<string name="hotspot_manual_wifi_ssid">Nazwa sieci</string>
|
||||
<string name="hotspot_qr_wifi">Twój telefon udostępnia hotspot Wi-Fi. Osoby, które chcą pobrać Briar, mogą połączyć się z hotspotem, skanując ten kod QR. Gdy połączą się z hotspotem, naciśnij „Dalej”.</string>
|
||||
<string name="hotspot_no_peers_connected">Brak połączonych urządzeń</string>
|
||||
<plurals name="hotspot_peers_connected">
|
||||
<item quantity="one">%s połączone urządzenie</item>
|
||||
<item quantity="few">%s połączone urządzenie</item>
|
||||
<item quantity="many">%s połączone urządzenie</item>
|
||||
<item quantity="other">%s połączonych urządzeń</item>
|
||||
</plurals>
|
||||
<!--Download link-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_site">Twój telefon udostępnia hotspot Wi-Fi. Osoby połączone z hotspotem mogą pobrać Briar, wpisując następujący link w przeglądarce internetowej lub %s.</string>
|
||||
<string name="hotspot_manual_site_address">Adres (URL)</string>
|
||||
<string name="hotspot_qr_site">Twój telefon udostępnia hotspot Wi-Fi. Osoby połączone z hotspotem mogą pobrać Briar, skanując ten kod QR.</string>
|
||||
<!--e.g. Download Briar 1.2.20-->
|
||||
<string name="website_download_title">Pobierz %s</string>
|
||||
<string name="website_download_intro"> Ktoś w pobliżu udostępnił Ci %s.</string>
|
||||
<string name="website_download_outro">Po zakończeniu pobierania otwórz pobrany plik i zainstaluj go.</string>
|
||||
<string name="website_troubleshooting_title">Rozwiązywanie problemów</string>
|
||||
<string name="website_troubleshooting_1">Jeśli nie możesz pobrać aplikacji, spróbuj za pomocą innej przeglądarki internetowej.</string>
|
||||
<string name="website_troubleshooting_2_old">Aby zainstalować pobraną aplikację, konieczne może być zezwolenie na instalację aplikacji z „Nieznanych źródeł” w ustawieniach systemu. Później może być konieczne ponowne pobranie aplikacji. Zalecamy wyłączenie ustawienia „Nieznane źródła” po zainstalowaniu aplikacji.</string>
|
||||
<string name="website_troubleshooting_2_new">Aby zainstalować pobraną aplikację, konieczne może być zezwolenie przeglądarce na instalowanie nieznanych aplikacji. Po zainstalowaniu aplikacji zalecamy usunięcie zgody przeglądarki na instalowanie nieznanych aplikacji.</string>
|
||||
<string name="hotspot_help_wifi_title">Problemy z połączeniem z Wi-Fi:</string>
|
||||
<string name="hotspot_help_wifi_1">Spróbuj wyłączyć i ponownie włączyć Wi-Fi w obu telefonach i spróbuj ponownie.</string>
|
||||
<string name="hotspot_help_wifi_2">Jeśli Twój telefon wyświetla komunikat, że sieć Wi-Fi nie ma dostępu do internetu, wybierz opcję pozostania w tej sieci mimo wszystko.</string>
|
||||
<string name="hotspot_help_wifi_3">Uruchom ponownie telefon, na którym działa hotspot Wi-Fi, a następnie uruchom Briar i spróbuj ponownie udostępnić.</string>
|
||||
<string name="hotspot_help_site_title">Problemy z wejściem na lokalną stronę internetową:</string>
|
||||
<string name="hotspot_help_site_1">Dokładnie sprawdź, czy wpisałeś adres dokładnie tak, jak pokazano. Mały błąd może sprawić, że się nie uda.</string>
|
||||
<string name="hotspot_help_site_2">Upewnij się, że telefon jest nadal podłączony do właściwej sieci Wi-Fi (patrz powyżej), gdy próbujesz uzyskać dostęp do witryny.</string>
|
||||
<string name="hotspot_help_site_3">Jeśli masz aplikację zapory sieciowej, sprawdź, czy nie blokuje dostępu.</string>
|
||||
<string name="hotspot_help_site_4">Jeśli możesz wejść na stronę, ale nie możesz pobrać aplikacji Briar, spróbuj za pomocą innej przeglądarki internetowej.</string>
|
||||
<string name="hotspot_help_fallback_title">Nic nie działa?</string>
|
||||
<string name="hotspot_help_fallback_intro">Możesz spróbować zapisać aplikację jako plik .apk, aby udostępnić ją w inny sposób. Po przesłaniu pliku na inne urządzenie można go użyć do zainstalowania Briar.
|
||||
\n\nWskazówka: W przypadku udostępniania przez Bluetooth może być konieczna zmiana nazwy pliku na .zip.</string>
|
||||
<string name="hotspot_help_fallback_button">Zapisz aplikację</string>
|
||||
<!--error handling-->
|
||||
<string name="hotspot_error_intro">Coś poszło nie tak podczas próby udostępnienia aplikacji przez Wi-Fi:</string>
|
||||
<string name="hotspot_error_no_wifi_direct">Urządzenie nie obsługuje Wi-Fi Direct </string>
|
||||
<string name="hotspot_error_start_callback_failed">Hotspot nie mógł się uruchomić: Błąd %s</string>
|
||||
<string name="hotspot_error_start_callback_failed_unknown">Hotspot nie mógł się uruchomić z powodu nieznanego błędu, powód: %d</string>
|
||||
<string name="hotspot_error_start_callback_no_group_info">Hotspot nie mógł się uruchomić: Brak informacji o grupie</string>
|
||||
<string name="hotspot_error_web_server_start">Błąd podczas uruchamianiu serwera WWW</string>
|
||||
<string name="hotspot_error_web_server_serve">Błąd prezentowania strony internetowej.\n\nJeśli problem będzie się powtarzał, prześlij opinię (z anonimowymi danymi) za pośrednictwem aplikacji Briar.</string>
|
||||
<string name="hotspot_flag_test">Uwaga: ta aplikacja została zainstalowana przez Android Studio i NIE MOŻNA jej zainstalować na innym urządzeniu.</string>
|
||||
<string name="hotspot_error_framework_busy">Nie można uruchomić hotspotu.\n\nJeśli masz uruchomiony inny hotspot lub udostępniasz połączenie internetowe przez Wi-Fi, spróbuj go zatrzymać i dopiero wtedy spróbuj ponownie.</string>
|
||||
<!--Transfer Data via Removable Drives-->
|
||||
<string name="removable_drive_menu_title">Połącz przez Dysk Przenośny</string>
|
||||
<string name="removable_drive_intro">Jeśli nie możesz połączyć się ze swoim kontaktem przez Internet, Wi-Fi lub Bluetooth, Briar może również przesyłać wiadomości na dysk wymienny, taki jak pamięć USB lub karta SD.</string>
|
||||
<string name="removable_drive_explanation">Jeśli nie możesz połączyć się z kontaktem przez Internet, Wi-Fi lub Bluetooth, Briar może również przesyłać wiadomości na dysk wymienny, taki jak pamięć USB lub karta SD.\n\nGdy użyjesz przycisku „Wyślij dane” wszelkie dane oczekujące na wysłanie do kontaktu zostaną zapisane na dysku wymiennym. Obejmuje to prywatne wiadomości, załączniki, blogi, fora i prywatne grupy.\n\nWszystko zostanie zaszyfrowane przed zapisaniem na dysku wymiennym.\n\nGdy Twój kontakt otrzyma dysk wymienny, może użyć przycisku „Odbierz dane” aby zaimportować wiadomości do Briar.</string>
|
||||
<string name="removable_drive_title_send">Wyślij dane</string>
|
||||
<string name="removable_drive_title_receive">Odbierz dane</string>
|
||||
<string name="removable_drive_send_intro">Dotknij przycisku poniżej, aby utworzyć nowy plik zawierający zaszyfrowane wiadomości. Możesz wybrać, gdzie plik zostanie zapisany.\n\nJeśli chcesz zapisać plik na dysku wymiennym, włóż dysk teraz.</string>
|
||||
<string name="removable_drive_send_no_data">Obecnie nie ma wiadomości oczekujących na wysłanie do tego kontaktu.</string>
|
||||
<string name="removable_drive_send_not_supported">Ten kontakt używa starej wersji Briar lub starego urządzenia, które nie obsługuje tej funkcji.</string>
|
||||
<string name="removable_drive_send_button">Wybierz plik do eksportu</string>
|
||||
<string name="removable_drive_ongoing">Poczekaj na zakończenie trwającego zadania</string>
|
||||
<string name="removable_drive_receive_intro">Kliknij przycisk poniżej, aby wybrać plik, który wysłał Ci Twój kontakt.\n\nJeśli plik znajduje się na dysku wymiennym, włóż dysk teraz.</string>
|
||||
<string name="removable_drive_receive_button">Wybierz plik do zaimportowania</string>
|
||||
<string name="removable_drive_success_send_title">Eksport się powiódł</string>
|
||||
<string name="removable_drive_success_send_text">Dane zostały pomyślnie wyeksportowane. Masz teraz 28 dni na przekazanie pliku do kontaktu.\n\nJeżeli plik znajduje się na dysku wymiennym, użyj powiadomienia na pasku stanu, aby wysunąć dysk przed odłączeniem go.</string>
|
||||
<string name="removable_drive_success_receive_title">Zaimportowano pomyślnie</string>
|
||||
<string name="removable_drive_success_receive_text">Wszystkie zaszyfrowane wiadomości zawarte w tym pliku zostały odebrane.</string>
|
||||
<string name="removable_drive_error_send_title">Błąd podczas eksportowania danych</string>
|
||||
<string name="removable_drive_error_send_text">Wystąpił błąd podczas zapisywania danych do pliku.\n\nJeżeli używasz dysku wymiennego, upewnij się, że jest on prawidłowo włożony i spróbuj ponownie.\n\nJeśli błąd będzie się powtarzał, prześlij opinię, aby powiadomić zespół Briar o problemie.</string>
|
||||
<string name="removable_drive_error_receive_title">Błąd podczas importowania danych</string>
|
||||
<string name="removable_drive_error_receive_text">Wybrany plik nie zawierał niczego, co Briar mógłby rozpoznać.\n\nSprawdź, czy wybrałeś właściwy plik.\n\nJeśli Twój kontakt utworzył plik ponad 28 dni temu, Briar nie będzie mógł go rozpoznać.</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_alice">Alicja</string>
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
<string name="download_briar">Para continuar usando o Briar, por favor baixe a versão mais recente.</string>
|
||||
<string name="create_new_account">Você precisará criar uma nova conta, mas poderá usar o mesmo nome de usuária.</string>
|
||||
<string name="download_briar_button">Baixar a versão mais recente</string>
|
||||
<string name="delete_account_button">Apagar a Conta</string>
|
||||
<string name="startup_open_database">Descriptografando Banco de Dados...</string>
|
||||
<string name="startup_migrate_database">Atualizando Banco de Dados...</string>
|
||||
<string name="startup_compact_database">Compactando Banco de Dados...</string>
|
||||
@@ -244,7 +245,6 @@
|
||||
<string name="duplicate_link_dialog_text_1">Você já tem um contato pendente com esse link: %s </string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Você já possui um contato com esse link: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s e %s são a mesma pessoa?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -253,7 +253,6 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Pessoa diferente</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s e %s te enviaram o mesmo link.\n\nUm deles talvez esteja tentando descobrir quem são seus contatos.\n\nNão conte pra eles que recebeu o mesmo link de outra pessoa.</string>
|
||||
<string name="pending_contact_updated_toast">Contato pendente atualizado</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Apresente seus contatos</string>
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
<string name="download_briar">Pentru a putea să utilizați Briar în continuare, vă rugăm să descărcați ultima versiune.</string>
|
||||
<string name="create_new_account">Va trebui să creați un cont nou, dar puteți să folosiți același nume.</string>
|
||||
<string name="download_briar_button">Descarcă ultima versiune</string>
|
||||
<string name="delete_account_button">Șterge cont</string>
|
||||
<string name="startup_open_database">Decriptare bază de date...</string>
|
||||
<string name="startup_migrate_database">Actualizare bază de date...</string>
|
||||
<string name="startup_compact_database">Compactare bază de date...</string>
|
||||
@@ -289,7 +290,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">Deja aveți un contact în așteptare cu această adresă: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Deja aveți un contact cu această adresă: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Sunt %s și %s aceeași persoană?</string>
|
||||
<string name="duplicate_link_dialog_text_2">Sunt %1$s și %2$s aceeași persoană?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -298,7 +299,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Persoană diferită</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s și %s v-au trimis aceeași adresă.\n\nUnii dintre ei s-ar putea să încerce să descopere care vă sunt contactele.\n\nNu le spuneți că ați primit aceeași adresă și de la altcineva.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s și %2$sv-au trimis același link.\n\nUnul dintre ei ar putea încerca să afle cine sunt contactele dumneavoastră.\n\nNu le spuneți că ați primit același link de la altcineva.</string>
|
||||
<string name="pending_contact_updated_toast">Listă solicitări de contact în așteptare actualizată</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Recomandați-vă contactele</string>
|
||||
@@ -622,6 +623,7 @@ De asemenea, contactul dvs. poate modifica această setare pentru amândoi.</str
|
||||
<string name="dev_report_memory">Memorie</string>
|
||||
<string name="dev_report_storage">Depozitare</string>
|
||||
<string name="dev_report_connectivity">Conectivitate</string>
|
||||
<string name="dev_report_network_usage">Utilizarea rețelei</string>
|
||||
<string name="dev_report_build_config">Informații despre aplicație</string>
|
||||
<string name="dev_report_logcat">Jurnal aplicație</string>
|
||||
<string name="dev_report_device_features">Caracteristici dispozitiv</string>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<string name="startup_failed_clock_error">Briar не удалось запустить, поскольку время на устройстве выставлено некорректно.\n\nПожалуйста, установите правильное время на часах вашего устройства и повторите попытку.</string>
|
||||
<string name="startup_failed_db_error">Briar не смог открыть базу данных, содержащую вашу учетную запись, контакты и сообщения.\n\nПожалуйста, обновите приложение до последней версии и повторите попытку, или создайте новую учетную запись, выбрав \'Я забыл пароль\' в подсказке пароля.</string>
|
||||
<string name="startup_failed_data_too_old_error">Ваша учетная запись была создана в старой версии этого приложения и не может быть открыта в текущей версии.\n\nНеобходимо либо повторно установить старую версию, либо создать новую учетную запись, выбрав \'Я забыл пароль\' в подсказке пароля.</string>
|
||||
<string name="startup_failed_data_too_new_error">Ваш счет был создан в более новой версии этого приложения и не может быть открыт в текущей версии.\n\nПожалуйста, обновите версию до последней и повторите попытку.</string>
|
||||
<string name="startup_failed_data_too_new_error">Ваш аккаунт был создан в более новой версии этого приложения и не может быть открыт в текущей версии.\n\nПожалуйста, обновите приложение до последней версии и повторите попытку.</string>
|
||||
<string name="startup_failed_service_error">Briar не смог запустить необходимый компонент.\n\nПожалуйста, обновите приложение до последней версии и повторите попытку.</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="one">Это бета-версия Briar. Срок действия вашего аккаунта закончится через %d день и не может быть возобновлен.</item>
|
||||
@@ -52,10 +52,19 @@
|
||||
<item quantity="many">Это бета-версия Briar. Срок действия вашего аккаунта закончится через %d дней и не может быть возобновлен.</item>
|
||||
<item quantity="other">Это бета-версия Briar. Срок действия вашего аккаунта закончится через %d дней и не может быть возобновлен.</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="one">Android 4 больше не поддерживается. Briar перестанет работать на %s (через %d день). Пожалуйста, установите Briar на более современное устройство и создайте новую учетную запись.</item>
|
||||
<item quantity="few">Android 4 больше не поддерживается. Briar перестанет работать на %s (через %d дня). Пожалуйста, установите Briar на более современное устройство и создайте новую учетную запись.</item>
|
||||
<item quantity="many">Android 4 больше не поддерживается. Briar перестанет работать на %s (через %d дней). Пожалуйста, установите Briar на более современное устройство и создайте новую учетную запись.</item>
|
||||
<item quantity="other">Android 4 больше не поддерживается. Briar перестанет работать на %s (через %d дней). Пожалуйста, установите Briar на более современное устройство и создайте новую учетную запись.</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">Срок действия этого программного обеспечения истек.\nСпасибо за тестирование!</string>
|
||||
<string name="download_briar">Для продолжения использования Briar, пожалуйста, скачайте последнюю версию.</string>
|
||||
<string name="create_new_account">Вам необходимо создать новую учетную запись, но вы можете использовать тот же псевдоним.</string>
|
||||
<string name="download_briar_button">Загрузить последнюю версию</string>
|
||||
<string name="old_android_expiry_date_reached">Briar больше не работает на Android 4.\nПожалуйста, установите Briar на более современное устройство.</string>
|
||||
<string name="old_android_delete_account">Вы можете нажать кнопку ниже, чтобы удалить свой аккаунт с этого устройства.</string>
|
||||
<string name="delete_account_button">Удалить аккаунт</string>
|
||||
<string name="startup_open_database">Расшифровка базы данных...</string>
|
||||
<string name="startup_migrate_database">Обновление базы данных...</string>
|
||||
<string name="startup_compact_database">Сжатие базы данных...</string>
|
||||
@@ -298,7 +307,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">У вас уже есть ожидающий контакт с этой ссылкой: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact"> У вас уже есть контакт с этой ссылкой: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s и %s тот же человек?</string>
|
||||
<string name="duplicate_link_dialog_text_2">%1$s и %2$s тот же человек?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -307,7 +316,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Другой человек</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s и %s отправили вам ту же ссылку.\n\nОдин из них, возможно, пытается выяснить, кто ваши контакты.\n\nНе говорите им, что вы получили такую же ссылку от кого-то еще.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s и %2$s отправили вам ту же ссылку.\n\nОдин из них, возможно, пытается выяснить, кто ваши контакты.\n\nНе говорите им, что вы получили такую же ссылку от кого-то еще.</string>
|
||||
<string name="pending_contact_updated_toast">Ожидающий контакт обновлен</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Представление ваших контактов</string>
|
||||
@@ -635,6 +644,7 @@
|
||||
<string name="dev_report_memory">Память</string>
|
||||
<string name="dev_report_storage">Хранилище</string>
|
||||
<string name="dev_report_connectivity">Подключение</string>
|
||||
<string name="dev_report_network_usage">Использование сети</string>
|
||||
<string name="dev_report_build_config">Конфигурация сборки</string>
|
||||
<string name="dev_report_logcat">Журнал приложения</string>
|
||||
<string name="dev_report_device_features">Характеристики устройства</string>
|
||||
|
||||
@@ -52,10 +52,17 @@ dhe s’mund të hapet me këtë version.\n\nJu lutemi, përmirësojeni me versi
|
||||
<item quantity="one">Ky është një version beta i Briar-it. Llogaria juaj do të skadojë për %d ditë dhe s\’mund të rinovohet.</item>
|
||||
<item quantity="other">Ky është një version beta i Briar-it. Llogaria juaj do të skadojë për %d ditë dhe s\’mund të rinovohet.</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="one">Android 4 nuk mbulohet më. Briar-i do të reshtë së funksionuari më %s (për %d ditë). Ju lutemi, instalojeni Briar-in në një pajisje më të re dhe krijoni një llogari të re.</item>
|
||||
<item quantity="other">Android 4 nuk mbulohet më. Briar-i do të reshtë së funksionuari më %s (për %d ditë). Ju lutemi, instalojeni Briar-in në një pajisje më të re dhe krijoni një llogari të re.</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">Ky software ka skaduar.\nFaleminderit që e provuat!</string>
|
||||
<string name="download_briar">Që të vazhdoni të përdorni Briar-in, ju lutemi shkarkoni versionin më të ri.</string>
|
||||
<string name="create_new_account">Do t’ju duhet të krijoni një llogari të re, por mund të përdorni të njëjtën nofkë.</string>
|
||||
<string name="download_briar_button">Shkarkoni Hedhjen Më të Re Në Qarkullim</string>
|
||||
<string name="old_android_expiry_date_reached">Briar-i nuk funksionon më në Android 4.\nJu lutemi, instalojeni Briar-in në një pajisje më të re.</string>
|
||||
<string name="old_android_delete_account">Mund të prekni butonin më poshtë që të fshini llogarinë tuaj prej kësaj pajisjeje.</string>
|
||||
<string name="delete_account_button">Fshi Llogarinë</string>
|
||||
<string name="startup_open_database">Po shfshehtëzohet Baza e të Dhënave…</string>
|
||||
<string name="startup_migrate_database">Po përditësohet Baza e të dhënave…</string>
|
||||
<string name="startup_compact_database">Po kompaktësohet Baza e të Dhënave…</string>
|
||||
@@ -282,7 +289,7 @@ dhe s’mund të hapet me këtë version.\n\nJu lutemi, përmirësojeni me versi
|
||||
<string name="duplicate_link_dialog_text_1">Keni tashmë një kontakt pezull me këtë lidhje: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Keni tashmë një kontakt me këtë lidhje: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">A janë %s dhe %s i njëjti person?</string>
|
||||
<string name="duplicate_link_dialog_text_2">Është %1$s dhe %2$s i njëjti person?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -291,7 +298,7 @@ dhe s’mund të hapet me këtë version.\n\nJu lutemi, përmirësojeni me versi
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Person i Ndryshëm</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s dhe %s ju dërguan të njëjtën lidhje.\n\nNjëri prej tyre mund të jetë duke u rrekur të zbulojë se cilët janë kontaktet tuaj.\n\nMos u tregoni se morët të njëjtën lidhje nga dikush tjetër.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s dhe %2$s ju dërguan të njëjtën lidhje.\n\nNjë prej tyre mund të jetë duke u rrekur të zbulojë cilët janë kontaktet tuaja.\n\nMos u thoni se morët të njëjtën lidhje nga dikush tjetër.</string>
|
||||
<string name="pending_contact_updated_toast">Kontakti pezull u përditësua</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Prezantoni kontaktet tuaja</string>
|
||||
|
||||
@@ -22,7 +22,14 @@
|
||||
<string name="setup_huawei_text">Tryck på knappen längre ner för att lägga till Briar till listan över \"skyddade appar\".</string>
|
||||
<string name="setup_huawei_button">Skydda Briar</string>
|
||||
<string name="setup_huawei_help">Om Briar inte läggs till listan över skyddade appar kan det inte köras i bakgrunden.</string>
|
||||
<string name="setup_huawei_app_launch_text">Klicka på knappen nedan, öppna skärmen ”App-start” och säkerställ att Briar är inställt på ”Hantera manuellt”</string>
|
||||
<string name="setup_huawei_app_launch_button">Öppna batteriinställningar</string>
|
||||
<string name="setup_huawei_app_launch_help">Om Briar inte är inställt på ”Hantera manuellt” i skärmen ”App-start” kommer den inte att kunna köra i bakgrunden.</string>
|
||||
<string name="setup_xiaomi_text">För att köra i bakgrunden måste Briar låsas in i listan över senaste appar.</string>
|
||||
<string name="setup_xiaomi_button">Skydda Briar</string>
|
||||
<string name="setup_xiaomi_help">Om Briar inte låsas in i listan över senaste appar kommer det inte att kunna köra i bakgrunden.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Öppna listan över senaste appar (också kallade appväxlaren)\n\n2. Svep nedåt vid bilden av Briar för att visa hänglåsikonen\n\n3. Om hänglåsikonen inte är låst, klicka för att låsa den</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Öppna listan över senaste appar (också kallade appväxlaren)\n\n2. Tryck och håll på bilden av Briar tills hänglåsikonen dyker upp\n\n3. Om hänglåsikonen inte är låst, klicka för att låsa den</string>
|
||||
<string name="warning_dozed">%s kunde inte köras i bakgrunden</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Lösenord</string>
|
||||
@@ -34,6 +41,11 @@
|
||||
<string name="dialog_title_lost_password">Glömt lösenord?</string>
|
||||
<string name="dialog_message_lost_password">Eftersom ditt Briar-konto lagras krypterat på din mobil eller läsplatta och inte hos en molntjänst kan vi inte återställa ditt lösenord. Vill du radera ditt konto och skapa ett nytt?\n\nCaution: Du kommer att förlora din profil, dina kontakter och dina meddelanden.</string>
|
||||
<string name="startup_failed_activity_title">Briar kunde inte starta</string>
|
||||
<string name="startup_failed_clock_error">Briar kunde inte starta eftersom din enhets klocka är felinställd.\n\nStäll in din enhets klocka på rätt tid och prova igen.</string>
|
||||
<string name="startup_failed_db_error">Briar kunde inte öppna databasen som innehåller ditt konto, dina kontakter och dina meddelanden.\n\nUppgradera till den senaste versionen av appen och prova igen, eller sätt upp ett nytt konto genom att välja ”Jag har glömt mitt lösenord” vid lösenordsförfrågan.</string>
|
||||
<string name="startup_failed_data_too_old_error">Ditt konto skapades med en gammal version av denna appen och kan inte öppnas med denna version.\n\nDu måste antingen återinstallera den gamla versionen eller sätt upp ett nytt konto genom att välja ”Jag har glömt mitt lösenord” vid lösenordsförfrågan.</string>
|
||||
<string name="startup_failed_data_too_new_error">Ditt konto skapades med en nyare version av denna app och kan inte öppnas av denna version.\n\nUppgradera till den senaste versionen och prova igen.</string>
|
||||
<string name="startup_failed_service_error">Briar kan inte starta en nödvändig komponent.\n\nUppgradera till den senaste versionen av appen och prova igen.</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="one">Det här är en test-version av Briar. Ditt konto kommer att upphöra om %d dagar och kan ej förnyas.</item>
|
||||
<item quantity="other">Det här är en test-version av Briar. Ditt konto kommer att upphöra om %d dag och kan ej förnyas.</item>
|
||||
@@ -42,6 +54,7 @@
|
||||
<string name="download_briar">För att fortsätta använda Briar, hämta den senaste utgåvan.</string>
|
||||
<string name="create_new_account">Du måste skapa ett nytt konto, men du kan använda samma smeknamn.</string>
|
||||
<string name="download_briar_button">Hämta senaste utgåvan</string>
|
||||
<string name="delete_account_button">Radera kontot</string>
|
||||
<string name="startup_open_database">Dekrypterar databasen...</string>
|
||||
<string name="startup_migrate_database">Uppgraderar databasen...</string>
|
||||
<string name="startup_compact_database">Komprimerar databasen...</string>
|
||||
@@ -143,6 +156,8 @@
|
||||
<string name="date_no_private_messages">Inga meddelanden</string>
|
||||
<string name="no_private_messages">Inga meddelanden</string>
|
||||
<string name="message_hint">Nytt meddelande</string>
|
||||
<string name="message_hint_auto_delete">Nytt försvinnande meddelande</string>
|
||||
<string name="message_error">Fel vid sändning av meddelanden</string>
|
||||
<string name="image_caption_hint">Lägg till bildtext (valfritt)</string>
|
||||
<string name="image_attach">Bifoga bild</string>
|
||||
<string name="image_attach_error">Kunde inte bifoga en eller flera bilder</string>
|
||||
@@ -150,10 +165,32 @@
|
||||
<string name="image_attach_error_invalid_mime_type">Bildformatet stöds ej: %s</string>
|
||||
<string name="set_contact_alias">Ändra namn på kontakt</string>
|
||||
<string name="set_contact_alias_hint">Kontaktnamn</string>
|
||||
<string name="menu_item_disappearing_messages">Försvinnande meddelanden</string>
|
||||
<!--The first placeholder will show a duration like "7 days". The second placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_you_enabled">Dina meddelanden försvinner efter %1$s. %2$s</string>
|
||||
<!--The placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_you_disabled">Dina meddelanden kommer inte att försvinna %1$s</string>
|
||||
<!--The first placeholder will show a contact's name. The second placeholder will show a duration like "7 days". The third placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_contact_enabled">%1$ss meddelanden kommer att försvinna om %2$s. %3$s</string>
|
||||
<plurals name="duration_minutes">
|
||||
<item quantity="one">%d minut</item>
|
||||
<item quantity="other">%d minuter</item>
|
||||
</plurals>
|
||||
<plurals name="duration_hours">
|
||||
<item quantity="one">%d timme</item>
|
||||
<item quantity="other">%d timmar</item>
|
||||
</plurals>
|
||||
<plurals name="duration_days">
|
||||
<item quantity="one">%d dag</item>
|
||||
<item quantity="other">%d dagar</item>
|
||||
</plurals>
|
||||
<!--The first placeholder will show a contact's name. The second placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_contact_disabled">%1$ss meddelanden kommer inte att försvinna. %2$s</string>
|
||||
<string name="tap_to_learn_more">Klicka för att lära dig mer.</string>
|
||||
<string name="auto_delete_changed_warning_title">Försvinnande meddelanden ändrade</string>
|
||||
<string name="auto_delete_changed_warning_message_enabled">Sedan du börjat skriva ditt meddelande har försvinnande meddelanden aktiverats.</string>
|
||||
<string name="auto_delete_changed_warning_message_disabled">Sedan du börjat skriva ditt meddelande har försvinnande meddelande inaktiverats.</string>
|
||||
<string name="auto_delete_changed_warning_send">Skicka ändå</string>
|
||||
<string name="delete_all_messages">Ta bort alla meddelanden</string>
|
||||
<string name="dialog_title_delete_all_messages">Bekräfta meddelande borttagning</string>
|
||||
<string name="dialog_message_delete_all_messages">Är du säker på att du vill ta bort alla meddelanden?</string>
|
||||
@@ -244,7 +281,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">Du har redan en väntande kontakt med den här länken: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Du har redan en kontakt med den här länken: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Är %s och %s samma person?</string>
|
||||
<string name="duplicate_link_dialog_text_2">Är %1$s och %2$s samma person?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -253,7 +290,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Olika personer</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s och %s har skickat samma länk till dig.\n\nEn av dem kanske försöker ta reda på vilka kontakter du har.\n\nSäg inte till någon av dem att du tagit emot samma länk från någon annan.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s och %2$s skickade dig samma länk.\n\nEn av dem kanske försöker ta reda på vilka dina kontakter är.\n\nBerätta inte för dem att du fått samma länk från någon annan.</string>
|
||||
<string name="pending_contact_updated_toast">Väntande kontakt har uppdaterats</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Presentera dina kontakter</string>
|
||||
@@ -273,12 +310,20 @@
|
||||
<string name="introduction_response_accepted_sent">Du godkände att bli presenterad för %1$s.</string>
|
||||
<string name="introduction_response_accepted_sent_info">Innan %1$s läggs till bland dina kontakter, så måste de acceptera presentationen. Detta kan ta ett tag.</string>
|
||||
<string name="introduction_response_declined_sent">Du avvisade presentation för %1$s.</string>
|
||||
<string name="introduction_response_declined_auto">Introduktionen till %1$savböjdes automatiskt.</string>
|
||||
<string name="introduction_response_accepted_received">%1$s godkände att bli presenterad för %2$s.</string>
|
||||
<string name="introduction_response_declined_received">%1$s avvisade presentation för %2$s.</string>
|
||||
<string name="introduction_response_declined_received_by_introducee">%1$s säger att %2$s avvisade presentation.</string>
|
||||
<!--Connect via Bluetooth-->
|
||||
<string name="menu_item_connect_via_bluetooth">Anslut via Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_title">Anslut via Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_intro">Om Bluetooth-anslutning inte fungerar automatiskt kan du använda denna skärmen för att ansluta manuellt.\n\nDin kontakt måste vara i närheten för att detta ska fungera.\n\nDu och din kontakt måste båda trycka på ”Start” samtidigt.</string>
|
||||
<string name="connect_via_bluetooth_already_discovering">Försöker redan ansluta via Bluetooth. Prova igen om ett kort tag.</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">Kan inte fortsätta utan platsrättigheter</string>
|
||||
<string name="connect_via_bluetooth_start">Ansluter via Bluetooth…</string>
|
||||
<string name="connect_via_bluetooth_success">Anslöt framgångsrikt via Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_error">Kunde inte ansluta via Bluetooth.</string>
|
||||
<string name="connect_via_bluetooth_error_not_supported">Bluetooth stöds inte av denna enhet.</string>
|
||||
<!--Private Groups-->
|
||||
<string name="groups_list_empty">Inga grupper</string>
|
||||
<string name="groups_list_empty_action">Tryck på plus-ikonen (+) för att skapa en grupp. Du kan också fråga en kontakt om att bli inbjuden till en grupp.</string>
|
||||
@@ -322,6 +367,7 @@
|
||||
</plurals>
|
||||
<string name="groups_invitations_response_accepted_sent">Du godkände gruppinbjudan från %s.</string>
|
||||
<string name="groups_invitations_response_declined_sent">Du avvisade gruppinbjudan från %s.</string>
|
||||
<string name="groups_invitations_response_declined_auto">Gruppinbjudan från %s avböjdes automatiskt.</string>
|
||||
<string name="groups_invitations_response_accepted_received">%sgodkände gruppinbjudan.</string>
|
||||
<string name="groups_invitations_response_declined_received">%savvisade gruppinbjudan.</string>
|
||||
<string name="sharing_status_groups">Bara skaparen kan bjuda in nya medlemmare till gruppen. Nedan listas gruppens nuvarande medlemmar.</string>
|
||||
@@ -372,6 +418,7 @@
|
||||
<string name="forum_invitation_already_sharing">Delas redan</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Du godkände foruminbjudan från %s.</string>
|
||||
<string name="forum_invitation_response_declined_sent">Du avvisade foruminbjudan från %s.</string>
|
||||
<string name="forum_invitation_response_declined_auto">Foruminbjudan från %s avböjdes automatiskt.</string>
|
||||
<string name="forum_invitation_response_accepted_received">%s godkände foruminbjudan.</string>
|
||||
<string name="forum_invitation_response_declined_received">%s avvisade foruminbjudan.</string>
|
||||
<string name="sharing_status">Delningsstatus</string>
|
||||
@@ -406,6 +453,7 @@
|
||||
<string name="blogs_sharing_snackbar">Dela bloggen med valda kontakter</string>
|
||||
<string name="blogs_sharing_response_accepted_sent">Du godkände blogginbjudan från %s.</string>
|
||||
<string name="blogs_sharing_response_declined_sent">Du avvisade blogginbjudan från %s.</string>
|
||||
<string name="blogs_sharing_response_declined_auto">Blogginbjudan från %s avböjdes automatiskt.</string>
|
||||
<string name="blogs_sharing_response_accepted_received">%sgodkände blogginbjudan.</string>
|
||||
<string name="blogs_sharing_response_declined_received">%savvisade blogginbjudan.</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$shar delat bloggen \"%2$s\" med dig.</string>
|
||||
@@ -419,6 +467,7 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importera</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Skriv URL till RSS-flödet</string>
|
||||
<string name="blogs_rss_feeds_import_error">Tyvärr! Något gick fel när flödet skulle importeras.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Det flödet importeras redan.</string>
|
||||
<string name="blogs_rss_feeds">RSS-flöden</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importerade:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Författare:</string>
|
||||
@@ -521,7 +570,18 @@
|
||||
<string name="choose_ringtone_title">Välj ringsignal</string>
|
||||
<string name="cannot_load_ringtone">Kan ej ladda ringsignal</string>
|
||||
<!--Conversation Settings-->
|
||||
<string name="disappearing_messages_title">Försvinnande meddelanden</string>
|
||||
<string name="disappearing_messages_explanation_long">Att slå på denna inställning kommer att få nya
|
||||
meddelanden i denna konversation att försvinna automatiskt efter 7\u00A0dagar.
|
||||
\n\nNedräkningen för sändarens kopia av meddelandet börjar efter att meddelandet har levererats.
|
||||
Nedräkningen starta för mottagaren när de har läst meddelandet.
|
||||
\n\nMeddelanden som försvinner kommer att markeras med en bombikon.
|
||||
\n\nKom ihåg att mottagare kan fortfarande göra kopior av meddelanden som du skickar.
|
||||
\n\nOm du ändrar denna inställning kommer den att omedelbart tillämpas för dina nya meddelanden och för dina
|
||||
kontakters meddelanden när de får ditt nästa meddelande.
|
||||
Din kontakt akn också ändra denna inställning för er båda.</string>
|
||||
<string name="learn_more">Läs mer</string>
|
||||
<string name="disappearing_messages_summary">Låt framtida meddelanden i denna konversation försvinna automatiskt efter 7\u00A0dagar.</string>
|
||||
<!--Settings Actions-->
|
||||
<string name="pref_category_actions">Åtgärder</string>
|
||||
<string name="send_feedback">Lämna synpunkter</string>
|
||||
@@ -532,6 +592,7 @@
|
||||
<string name="link_warning_open_link">Öppna länk</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">Briar-felrapport</string>
|
||||
<string name="briar_crashed">Briar har tvyärr kraschat</string>
|
||||
<string name="not_your_fault">Detta är inte ditt fel.</string>
|
||||
<string name="please_send_report">Hjälp oss att förbättra Briar genom att skicka en felrapport.</string>
|
||||
<string name="report_is_encrypted">Vi lovar att felrapporten är krypterad och skickas säkert.</string>
|
||||
@@ -541,6 +602,7 @@
|
||||
<string name="optional_contact_email">Din e-postadress (valfritt)</string>
|
||||
<string name="include_debug_report_crash">Inkludera anonym data om krashen.</string>
|
||||
<string name="include_debug_report_feedback">Inkludera anonym data om den här enheten</string>
|
||||
<string name="dev_report_user_info">Användarinformation</string>
|
||||
<string name="dev_report_basic_info">Grundläggande information</string>
|
||||
<string name="dev_report_device_info">Enhetsinformation</string>
|
||||
<string name="dev_report_stacktrace">Stacktrace</string>
|
||||
@@ -548,6 +610,7 @@
|
||||
<string name="dev_report_memory">Minne</string>
|
||||
<string name="dev_report_storage">Lagringsutrymme</string>
|
||||
<string name="dev_report_connectivity">Anslutningar</string>
|
||||
<string name="dev_report_network_usage">Nätverksanvändning</string>
|
||||
<string name="dev_report_build_config">Byggkonfiguration</string>
|
||||
<string name="dev_report_logcat">Applogg</string>
|
||||
<string name="dev_report_device_features">Enhetsfunktioner</string>
|
||||
@@ -574,6 +637,9 @@
|
||||
<string name="permission_camera_location_request_body">För att skanna QR-koden så behöver Briar ha tillgång till kameran.\n\nFör att upptäcka Bluetooth-enheter så behöver Briar ha tillgång till din fysiska plats.\n\nBriar lagrar inte din plats och delar den inte med någon.</string>
|
||||
<string name="permission_camera_denied_body">Du har avvisat åtkomst till kameran, men den behövs för att kontakter ska kunna läggas till.\n\nVänligen överväg att godkänna åtkomst.</string>
|
||||
<string name="permission_location_denied_body">Du har nekat åtkomst till din plats, men Briar behöver detta tillstånd för att upptäcka Bluetooth-enheter.\n\nVänligen överväg att ge åtkomst.</string>
|
||||
<string name="permission_location_setting_title">Platsinställningar</string>
|
||||
<string name="permission_location_setting_body">Din enhets platsinställning måste vara påslagen för att hitta andra enheter via Bluetooth. Aktivera plats för att fortsätta. Du kan inaktivera den igen efteråt.</string>
|
||||
<string name="permission_location_setting_button">Aktivera plats</string>
|
||||
<string name="qr_code">QR-kod</string>
|
||||
<string name="show_qr_code_fullscreen">Visa QR-koden i fullskärm</string>
|
||||
<!--App Locking-->
|
||||
@@ -586,16 +652,89 @@
|
||||
<!--Connections Screen-->
|
||||
<string name="transports_help_text">Briar kan ansluta till dina kontakter via internet, Wi-Fi eller Bluetooth.\n\nAlla internetanslutningar går via Tor-nätverket av integritetsskäl.\n\nOm en kontakt kan nås via flera metoder kommer Briar att använda dem parallellt.</string>
|
||||
<!--Share app offline-->
|
||||
<string name="hotspot_title">Dela denna app off-line</string>
|
||||
<string name="hotspot_intro">Dela denna app med någon i närheten utan en internetanslutning via din telefons Wi-Fi.
|
||||
\n\nDin telefon kommer att starta en Wi-Fi-hostpot. Personer i närheten kan ansluta till hotspoten och hämta Briar-appen från din telefon.</string>
|
||||
<string name="hotspot_button_start_sharing">Starta hotspot</string>
|
||||
<string name="hotspot_button_stop_sharing">Stoppa hotspot</string>
|
||||
<string name="hotspot_progress_text_start">Ställer in hotspot…</string>
|
||||
<string name="hotspot_notification_channel_title">Wi-Fi-hotspot</string>
|
||||
<string name="hotspot_notification_title">Dela Briar off-line</string>
|
||||
<string name="hotspot_button_connected">Nästa</string>
|
||||
<string name="permission_hotspot_location_request_body">För att skapa en Wi-Fi-hotspot måste Briar ha tillåtelse att komma åt din plats.\n\nBriar sparar inte din plats eller delar den med någon.</string>
|
||||
<string name="permission_hotspot_location_denied_body">Du har nekat åtkomst till din plats, men Briar behöver denna tilltåelse för att skapa en Wi-Fi-hotspot.\n\nÖverväg att bevilja åtkomst.</string>
|
||||
<string name="wifi_settings_title">Wi-Fi-inställning</string>
|
||||
<string name="wifi_settings_request_enable_body">För att skapa en Wi-Fi-hotspot måste Briar använda Wi-Fi. Vänligen aktivera det.</string>
|
||||
<string name="hotspot_tab_manual">Manuellt</string>
|
||||
<!--The placeholder to be inserted into the string 'hotspot_manual_wifi': People can connect by %s-->
|
||||
<string name="hotspot_scanning_a_qr_code">skanna en QR-kod</string>
|
||||
<!--Wi-Fi setup-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_wifi">Din telefon tillhandahåller en Wi-Fi-hotspot. Personer som vill hämta Briar kan ansluta till hotspoten genom att lägga till den bland Wi-Fi-inställningarna i deras enhet med hjälp av detaljerna nedan eller genom %s. När du har anslutit till hotspoten, tryck ”Nästa”.</string>
|
||||
<string name="hotspot_manual_wifi_ssid">Nätverksnamn</string>
|
||||
<string name="hotspot_qr_wifi">Din telefon tillhandahåller en Wi-Fi-hotspot. Personer som vill hämta Briar kan ansluta till hotspoten genom att skanna denna QR-kod. När de har anslutit till hotspoten, tryck ”Nästa”.</string>
|
||||
<string name="hotspot_no_peers_connected">Inga enheter anslutna</string>
|
||||
<plurals name="hotspot_peers_connected">
|
||||
<item quantity="one">%s enhet ansluten</item>
|
||||
<item quantity="other">%s enheter anslutna</item>
|
||||
</plurals>
|
||||
<!--Download link-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_site">Din telefon tillhandahåller en Wi-Fi-hotspot. Personer som är ansluta till hotspoten genom kan hämta Briar genom att skriva in följande länk i en webbläsare eller %s.</string>
|
||||
<string name="hotspot_manual_site_address">Adress (URL)</string>
|
||||
<string name="hotspot_qr_site">Din telfon tillhandahåller en Wi-Fi-hotspot. Personer som är anslutna till hotstpoen kan hämta Briar genom att skanna denna QR-kod.</string>
|
||||
<!--e.g. Download Briar 1.2.20-->
|
||||
<string name="website_download_title">Hämta %s</string>
|
||||
<string name="website_download_intro">Någon i närheten delade %s med dig.</string>
|
||||
<string name="website_download_outro">Efter att hämtningen är slutför öppna den hämtade filen och installera den.</string>
|
||||
<string name="website_troubleshooting_title">Felsökning</string>
|
||||
<string name="website_troubleshooting_1">Om du inte kan hämta appen, prova med en annan webbläsarapp.</string>
|
||||
<string name="website_troubleshooting_2_old">För att installera den hämtade appen kan du behöva tillåta installation av appar från ”Okända källor” bland systeminställningarna. Efteråt kan du behöva hämta appen på nytt. Vi rekommenderar att du inaktiverar inställningen ”Okända källor” efter att installerat appen.</string>
|
||||
<string name="website_troubleshooting_2_new">För att installera den hämtade appen kan du behöva tillåta din webbläsare att installera okända appar. Efter att du installerat appen rekommenderar vi att du ta bort webbläsarens rättighet att installera okända appar.</string>
|
||||
<string name="hotspot_help_wifi_title">Problem att ansluta till Wi-Fi:</string>
|
||||
<string name="hotspot_help_wifi_1">Prova att inaktivera och återaktivera Wi-Fi på båda telefonerna och prova igen.</string>
|
||||
<string name="hotspot_help_wifi_2">Om din telefon klagar på att Wi-Fi inte har internetanslutning, svara att du vill förbli ansluten ändå.</string>
|
||||
<string name="hotspot_help_wifi_3">Starta om telefonen som kör Wi-Fi-hotspoten, starta sedan Briar och prova att dela igen.</string>
|
||||
<string name="hotspot_help_site_title">Problem med att besöka den lokala webbplatsen:</string>
|
||||
<string name="hotspot_help_site_1">Dubbelkolla att du matat in adressen exakt som den visas. Ett litet fel kan orsaka att det misslyckas.</string>
|
||||
<string name="hotspot_help_site_2">Säkerställ att din telefon fortfarande är ansluten till det korrekta Wi-Fi:t (se ovan) när du försöker att nå webbplatsen.</string>
|
||||
<string name="hotspot_help_site_3">Om du har en brandväggsapp, kontrollera att den inte blockerar åtkomst.</string>
|
||||
<string name="hotspot_help_site_4">Om du kan besöka webbplatsen men inte hämta Briar-appen, prova med en annan webbläsarapp.</string>
|
||||
<string name="hotspot_help_fallback_title">Fungerar ingenting?</string>
|
||||
<string name="hotspot_help_fallback_intro">Du kan prova att spara appen som en .apk-fil och dela den på något annat sätt. När filen har överförts till den andra enheten kan den användas för att installera Briar.
|
||||
\n\nTips: För delning via Bluetooth kan du först behöva byta namn på filen så den slutar med med .zip.</string>
|
||||
<string name="hotspot_help_fallback_button">Spara app</string>
|
||||
<!--error handling-->
|
||||
<string name="hotspot_error_intro">Något gick fel vid försök att dela appen via Wi-Fi:</string>
|
||||
<string name="hotspot_error_no_wifi_direct">Enheten har inte stöd för Wi-Fi Direct</string>
|
||||
<string name="hotspot_error_start_callback_failed">Hotspot misslyckades med att starta: fel %s</string>
|
||||
<string name="hotspot_error_start_callback_failed_unknown">Hotspot misslyckades med att starta på grund av ett okänt fel, orsak %d</string>
|
||||
<string name="hotspot_error_start_callback_no_group_info">Hotspot misslyckades med att starta: ingen gruppinformation</string>
|
||||
<string name="hotspot_error_web_server_start">Problem att starta webbserver</string>
|
||||
<string name="hotspot_error_web_server_serve">Fel vid presentatoin av webbplats.\n\nVänligen skicka återkoppling (med anonym data) via Briar appen om problemet kvarstår.</string>
|
||||
<string name="hotspot_flag_test">Varning: Denna app installerades med Android Studio och kan INTE installeras på en annan enhet.</string>
|
||||
<string name="hotspot_error_framework_busy">Kan inte starta hotspot.\n\nOm en annan hotspot redan kör eller du delar din internetanslutning via Wi-Fi, prova avsluta det och försök på nytt efteråt.</string>
|
||||
<!--Transfer Data via Removable Drives-->
|
||||
<string name="removable_drive_menu_title">Anslut via borttagbar enhet</string>
|
||||
<string name="removable_drive_intro">Om du inte kan ansluta till din kontakt internet, Wi-Fi eller Bluetooth, så kan Briar också överföra meddelanden via en borttagbar enhet så som en USB-sticka eller ett SD-kort.</string>
|
||||
<string name="removable_drive_explanation">Om du inte kan ansluta till din kontakter via internet, Wi-Fi eller Bluetooth så kan Briar också överföra meddelanden via en borttagbar enhet så som en USB-stick eller ett SD-kort.\n\nNär du använder knappen ”Skicka data” kommer all data som väntar på att skickas till kontakter att skrivas på den borttagbara enheten. Detta inkluderar privata meddelanden, bifogade filer, bloggar, forum och privata grupper.\n\nAllting kommer att krypteras innan det skrivs på den borttagbara enheten.\n\nNär din kontakt erhåller den borttagbara enheten kan de använda knappen ”Ta emot data” för att importera meddelandena i Briar.</string>
|
||||
<string name="removable_drive_title_send">Skicka data</string>
|
||||
<string name="removable_drive_title_receive">Ta emot data</string>
|
||||
<string name="removable_drive_send_intro">Klicka på knappen nedan för att skapa en ny fil som innehåller de krypterade meddelandena. Du kan välja var filen ska sparas.\n\nOm du vill spara filen på en borttagbar enhet, anslut enheten nu.</string>
|
||||
<string name="removable_drive_send_no_data">Det finns för närvarande inga meddelanden som väntar på att skickas till denna kontakt.</string>
|
||||
<string name="removable_drive_send_not_supported">Denna kontakt använder en gammal version av Briar eller en gammal enhet som inte har stöd för denna funktion.</string>
|
||||
<string name="removable_drive_send_button">Välj fil att exportera</string>
|
||||
<string name="removable_drive_ongoing">Vänligen vänta på att den pågående åtgärden ska slutföras</string>
|
||||
<string name="removable_drive_receive_intro">Klicka på knappen nedan för att välja filen som din kontakt skickat dig.\n\nOm filen finns på en borttagbar enhet, anslut enheten nu.</string>
|
||||
<string name="removable_drive_receive_button">Välj fil att importera</string>
|
||||
<string name="removable_drive_success_send_title">Export framgångsrik</string>
|
||||
<string name="removable_drive_success_send_text">Data exporterades framgångsrikt. Du har nu 28 dagar på dig att transportera filen till din kontakt.\n\nOm filen finns på en borttagbar enhet använd notifikationen i statusraden för att mata ut enheten innan du drar ut den.</string>
|
||||
<string name="removable_drive_success_receive_title">Import framgångsrik</string>
|
||||
<string name="removable_drive_success_receive_text">Alla krypterade meddelanden som finns i denna fil har tagits emot.</string>
|
||||
<string name="removable_drive_error_send_title">Fel vid export av data</string>
|
||||
<string name="removable_drive_error_send_text">Ett fel uppstod vid skrivning av data till filen.\n\nOm du använder en borttagbar enhet, säkerställ att den anslutits korrekt och prova igen.\n\nOm felet kvarstår, vänligen skicka återkoppling så att Briar-gruppen får vetskap om problemet.</string>
|
||||
<string name="removable_drive_error_receive_title">Fel vid import av data</string>
|
||||
<string name="removable_drive_error_receive_text">Den valda filen innehöll inte någo som Briar kunde känna igen.\n\nKontrollera att du valt rätt fil.\n\nOm din kontakt skapade filen för mer än 28 dagar sedan kommer Briar inte att kunna känna igen den.</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_alice">Alice</string>
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
<string name="download_briar">Briar\'ı kullanmaya devam etmek için lütfen en son sürümü indirin.</string>
|
||||
<string name="create_new_account">Yeni bir hesap oluşturmanız gerekecek, fakat aynı takma adı kullanabilirsiniz.</string>
|
||||
<string name="download_briar_button">En Son Sürümü İndir</string>
|
||||
<string name="delete_account_button">Hesabı Sil</string>
|
||||
<string name="startup_open_database">Veritabanı Şifresi Çözülüyor...</string>
|
||||
<string name="startup_migrate_database">Veritabanı Yükseltiliyor...</string>
|
||||
<string name="startup_compact_database">Veritabanı Sıkıştırılıyor...</string>
|
||||
@@ -280,7 +281,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">Bu bağlantı ile zaten bekleyen bir kişi var: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">Bu bağlantı ile zaten bir kişi var: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s ve %s aynı kişi mi?</string>
|
||||
<string name="duplicate_link_dialog_text_2">%1$s ve %2$s aynı kişi mi?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -289,7 +290,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Farklı Kişi</string>
|
||||
<string name="duplicate_link_dialog_text_3">%sve%s size aynı bağlantıyı gönderdi.\n\nİkisinden biri kişilerinizin kim olduğunu tespit etmeye çalışıyor olabilir.\n\nHiçbirine başkasından da aynı bağlantıyı aldığınızı söylemeyin.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s ve %2$s size aynı bağlantıyı gönderdi.\n\nAralarından biri kişilerinizin kim olduğunu keşfetmeye çalışıyor olabilir.\n\nOnlara başkasından aynı bağlantıyı aldığınızı söylemeyin.</string>
|
||||
<string name="pending_contact_updated_toast">Bekleyen kişi güncellendi</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Kişilerinizi tanıştırın</string>
|
||||
|
||||
@@ -49,10 +49,16 @@
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="other">这是 Briar 的一个测试版本。您的帐户将在 %d 天后到期,且无法延期。</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="other">本应用不再支持 Android 4。Briar 将于 %s 停止工作(%d天内)。请在更高版本系统上安装 Briar 并创建一个新帐户</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">本软件已过期。\n感谢您的测试!</string>
|
||||
<string name="download_briar">请下载最新版本以继续使用 Briar</string>
|
||||
<string name="create_new_account">您将需要创建一个新帐户,但可以使用相同的昵称。</string>
|
||||
<string name="download_briar_button">下载最新版本</string>
|
||||
<string name="old_android_expiry_date_reached">Briar 不再运行于 Andriod 4 系统。\n请在更高版本系统上安装 Briar</string>
|
||||
<string name="old_android_delete_account">您可以轻按下面的按钮从这个设备上删除您的帐户。</string>
|
||||
<string name="delete_account_button">删除帐户</string>
|
||||
<string name="startup_open_database">正在解密数据库……</string>
|
||||
<string name="startup_migrate_database">正在更新数据库……</string>
|
||||
<string name="startup_compact_database">正在压缩数据库……</string>
|
||||
@@ -271,7 +277,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">您已经有此链接的待处理联系人:%s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">您已经有此链接的联系人:%s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s 和 %s 是同一个人吗?</string>
|
||||
<string name="duplicate_link_dialog_text_2">%1$s 和 %2$s 是同一个人吗?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -280,7 +286,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">不同的人</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s 和 %s 给你发送了相同的链接。\n\n其中一个人可能企图找出谁是你的联系人。\n\n不要告诉他们你从其他人那里收到了相同的链接。</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s 和 %2$s 给你发送了同样的链接。\n\n其中一个人可能企图找出谁是你的联系人。\n\n 不要告诉他们你从其他人那里收到了相同的链接。</string>
|
||||
<string name="pending_contact_updated_toast">待处理联系人已更新</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">介绍您的联系人</string>
|
||||
|
||||
@@ -56,10 +56,17 @@
|
||||
<item quantity="one">This is a test version of Briar. Your account will expire in %d day and cannot be renewed.</item>
|
||||
<item quantity="other">This is a test version of Briar. Your account will expire in %d days and cannot be renewed.</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="one">Android 4 is no longer supported. Briar will stop working on %s (in %d day). Please install Briar on a newer device and create a new account.</item>
|
||||
<item quantity="other">Android 4 is no longer supported. Briar will stop working on %s (in %d days). Please install Briar on a newer device and create a new account.</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">This software has expired.\nThank you for testing!</string>
|
||||
<string name="download_briar">To continue using Briar, please download the latest release.</string>
|
||||
<string name="create_new_account">You will need to create a new account, but you can use the same nickname.</string>
|
||||
<string name="download_briar_button">Download Latest Release</string>
|
||||
<string name="old_android_expiry_date_reached">Briar no longer runs on Android 4.\nPlease install Briar on a newer device.</string>
|
||||
<string name="old_android_delete_account">You can tap the button below to delete your account from this device.</string>
|
||||
<string name="delete_account_button">Delete Account</string>
|
||||
<string name="startup_open_database">Decrypting Database…</string>
|
||||
<string name="startup_migrate_database">Upgrading Database…</string>
|
||||
<string name="startup_compact_database">Compacting Database…</string>
|
||||
@@ -297,7 +304,7 @@
|
||||
<string name="duplicate_link_dialog_text_1">You already have a pending contact with this link: %s</string>
|
||||
<string name="duplicate_link_dialog_text_1_contact">You already have a contact with this link: %s</string>
|
||||
<!-- This is a question asking whether two nicknames refer to the same person -->
|
||||
<string name="duplicate_link_dialog_text_2">Are %s and %s the same person?</string>
|
||||
<string name="duplicate_link_dialog_text_2">Are %1$s and %2$s the same person?</string>
|
||||
<!-- This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button -->
|
||||
@@ -306,7 +313,7 @@
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button -->
|
||||
<string name="different_person_button">Different Person</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s and %s sent you the same link.\n\nOne of them may be trying to discover who your contacts are.\n\nDon\'t tell them you received the same link from someone else.</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s and %2$s sent you the same link.\n\nOne of them may be trying to discover who your contacts are.\n\nDon\'t tell them you received the same link from someone else.</string>
|
||||
<string name="pending_contact_updated_toast">Pending contact updated</string>
|
||||
|
||||
<!-- Introductions -->
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||
import org.briarproject.bramble.test.ImmediateExecutor;
|
||||
import org.briarproject.briar.android.account.SetupViewModel.State;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
@@ -36,7 +36,7 @@ public class SetupViewModelTest extends BrambleMockTestCase {
|
||||
private final DozeHelper dozeHelper;
|
||||
|
||||
public SetupViewModelTest() {
|
||||
context.setImposteriser(ClassImposteriser.INSTANCE);
|
||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
||||
app = context.mock(Application.class);
|
||||
appContext = context.mock(Context.class);
|
||||
accountManager = context.mock(AccountManager.class);
|
||||
|
||||
@@ -11,7 +11,7 @@ import org.briarproject.briar.api.attachment.Attachment;
|
||||
import org.briarproject.briar.api.attachment.AttachmentHeader;
|
||||
import org.briarproject.briar.api.attachment.AttachmentReader;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
@@ -36,7 +36,7 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase {
|
||||
private final AttachmentRetriever retriever;
|
||||
|
||||
public AttachmentRetrieverTest() {
|
||||
context.setImposteriser(ClassImposteriser.INSTANCE);
|
||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
||||
AttachmentReader attachmentReader =
|
||||
context.mock(AttachmentReader.class);
|
||||
imageSizeCalculator = context.mock(ImageSizeCalculator.class);
|
||||
|
||||
@@ -18,6 +18,7 @@ import org.robolectric.Robolectric;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import static android.os.Looper.getMainLooper;
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
import static junit.framework.Assert.assertFalse;
|
||||
import static junit.framework.Assert.assertTrue;
|
||||
@@ -33,6 +34,7 @@ import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.robolectric.Shadows.shadowOf;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(sdk = 21)
|
||||
@@ -117,6 +119,7 @@ public class ChangePasswordActivityTest {
|
||||
verify(viewModel, times(1)).changePassword(eq(curPass), eq(safePass));
|
||||
// Return the result
|
||||
result.postEvent(SUCCESS);
|
||||
shadowOf(getMainLooper()).idle();
|
||||
assertTrue(changePasswordActivity.isFinishing());
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ import org.briarproject.briar.api.privategroup.event.GroupDissolvedEvent;
|
||||
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationItem;
|
||||
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
@@ -36,8 +36,8 @@ import java.util.concurrent.Executor;
|
||||
|
||||
import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
|
||||
|
||||
import static edu.emory.mathcs.backport.java.util.Collections.emptyList;
|
||||
import static edu.emory.mathcs.backport.java.util.Collections.singletonList;
|
||||
import static java.util.Collections.emptyList;
|
||||
import static java.util.Collections.singletonList;
|
||||
import static org.briarproject.bramble.test.TestUtils.getAuthor;
|
||||
import static org.briarproject.bramble.test.TestUtils.getContact;
|
||||
import static org.briarproject.bramble.test.TestUtils.getGroup;
|
||||
@@ -95,7 +95,7 @@ public class GroupListViewModelTest extends BrambleMockTestCase {
|
||||
new GroupItem(privateGroup2, authorInfo2, groupCount2, false);
|
||||
|
||||
public GroupListViewModelTest() {
|
||||
context.setImposteriser(ClassImposteriser.INSTANCE);
|
||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
||||
Application app = context.mock(Application.class);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(eventBus).addListener(with(any(EventListener.class)));
|
||||
|
||||
@@ -6,7 +6,7 @@ import android.content.res.Resources;
|
||||
import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||
import org.briarproject.briar.R;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
||||
import org.junit.Test;
|
||||
|
||||
import static java.util.concurrent.TimeUnit.DAYS;
|
||||
@@ -24,7 +24,7 @@ public class UiUtilsFormatDurationTest extends BrambleMockTestCase {
|
||||
private final int strDays = R.plurals.duration_days;
|
||||
|
||||
public UiUtilsFormatDurationTest() {
|
||||
context.setImposteriser(ClassImposteriser.INSTANCE);
|
||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
||||
ctx = context.mock(Context.class);
|
||||
r = context.mock(Resources.class);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
dependencyVerification {
|
||||
verify = [
|
||||
'androidx.activity:activity-ktx:1.2.2:activity-ktx-1.2.2.aar:9829e13d6a6b045b03b21a330512e091dc76eb5b3ded0d88d1ab0509cf84a50e',
|
||||
'androidx.activity:activity-ktx:1.2.3:activity-ktx-1.2.3.aar:423c0226e237e08de245cf66f8ccaf103854bc19a584d971a4a075fd15d70df1',
|
||||
'androidx.activity:activity:1.2.2:activity-1.2.2.aar:e165fb20f006b77894d349572cc3acd2760baa8416ae4d33cb8de6a84dd6730c',
|
||||
'androidx.activity:activity:1.2.4:activity-1.2.4.aar:ae8e9c7de57e387d2ad90e73f3a5a5dfd502bd4f034c1dccfdb3506d1d2df81a',
|
||||
'androidx.annotation:annotation-experimental:1.0.0:annotation-experimental-1.0.0.aar:b219d2b568e7e4ba534e09f8c2fd242343df6ccbdfbbe938846f5d740e6b0b11',
|
||||
'androidx.annotation:annotation:1.1.0:annotation-1.1.0.jar:d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692',
|
||||
'androidx.appcompat:appcompat-resources:1.2.0:appcompat-resources-1.2.0.aar:c470297c03ff3de1c3d15dacf0be0cae63abc10b52f021dd07ae28daa3100fe5',
|
||||
@@ -15,7 +16,7 @@ dependencyVerification {
|
||||
'androidx.constraintlayout:constraintlayout-solver:2.0.4:constraintlayout-solver-2.0.4.jar:9ca19f5448709301c7563488ef941be9dfa55c83538ca7a059b2113e83527b46',
|
||||
'androidx.constraintlayout:constraintlayout:2.0.4:constraintlayout-2.0.4.aar:307a79a4a1ccff44249c72a2bf7f47da09fa1b6b1fab2a25808ca889382b738e',
|
||||
'androidx.coordinatorlayout:coordinatorlayout:1.1.0:coordinatorlayout-1.1.0.aar:44a9e30abf56af1025c52a0af506fee9c4131aa55efda52f9fd9451211c5e8cb',
|
||||
'androidx.core:core-ktx:1.1.0:core-ktx-1.1.0.aar:070cc5f8864f449128a2f4b25ca5b67aa3adca3ee1bd611e2eaf1a18fad83178',
|
||||
'androidx.core:core-ktx:1.2.0:core-ktx-1.2.0.aar:dcb74d510d552b35eff73b0dd27b829649535f3902e5b5a1f26040383c10a940',
|
||||
'androidx.core:core:1.3.1:core-1.3.1.aar:e92ea65a37d589943d405a6a54d1be9d12a225948f26c4e41e511dd55e81efb6',
|
||||
'androidx.cursoradapter:cursoradapter:1.0.0:cursoradapter-1.0.0.aar:a81c8fe78815fa47df5b749deb52727ad11f9397da58b16017f4eb2c11e28564',
|
||||
'androidx.customview:customview:1.0.0:customview-1.0.0.aar:20e5b8f6526a34595a604f56718da81167c0b40a7a94a57daa355663f2594df2',
|
||||
@@ -23,9 +24,10 @@ dependencyVerification {
|
||||
'androidx.drawerlayout:drawerlayout:1.0.0:drawerlayout-1.0.0.aar:9402442cdc5a43cf62fb14f8cf98c63342d4d9d9b805c8033c6cf7e802749ac1',
|
||||
'androidx.dynamicanimation:dynamicanimation:1.0.0:dynamicanimation-1.0.0.aar:ce005162c229bf308d2d5b12fb6cad0874069cbbeaccee63a8193bd08d40de04',
|
||||
'androidx.exifinterface:exifinterface:1.3.2:exifinterface-1.3.2.aar:8770c180103e0b8c04a07eb4c59153af639b09eca25deae9bdcdaf869d1e5b6b',
|
||||
'androidx.fragment:fragment-ktx:1.3.4:fragment-ktx-1.3.4.aar:7b33342737f2503437782d5276700ef82e8481a182dc8b37d369cf4c62bd7209',
|
||||
'androidx.fragment:fragment-testing:1.3.4:fragment-testing-1.3.4.aar:e6d19df625138876682b7788bff8908964dd279847073616d1c062da07998389',
|
||||
'androidx.fragment:fragment-ktx:1.4.0:fragment-ktx-1.4.0.aar:439873b250461eb2245e393fe6683dceb567e7a18d9d6cf4538de9befa4ed1b0',
|
||||
'androidx.fragment:fragment-testing:1.4.0:fragment-testing-1.4.0.aar:1f874b83919c69f2e0df6de0ba2ad87a0d61cc7840d90b481ee0d4db85c2385b',
|
||||
'androidx.fragment:fragment:1.3.4:fragment-1.3.4.aar:c023c0ab666456885284d8e88519a743bc863c2b2effb92741fc789cbdb10db4',
|
||||
'androidx.fragment:fragment:1.4.0:fragment-1.4.0.aar:ec98a3b2f56f25cd247f928ab717d5527d27aea56ca4c02e67fbcd1ec32e5eed',
|
||||
'androidx.interpolator:interpolator:1.0.0:interpolator-1.0.0.aar:33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a',
|
||||
'androidx.legacy:legacy-support-core-utils:1.0.0:legacy-support-core-utils-1.0.0.aar:a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7',
|
||||
'androidx.lifecycle:lifecycle-common:2.3.1:lifecycle-common-2.3.1.jar:15848fb56db32f4c7cdc72b324003183d52a4884d6bf09be708ac7f587d139b5',
|
||||
@@ -53,13 +55,18 @@ dependencyVerification {
|
||||
'androidx.test.espresso:espresso-idling-resource:3.3.0:espresso-idling-resource-3.3.0.aar:29519b112731f289cc6e2f9b2eccc5ea72c754b04272bb93370f45d7e170a7c6',
|
||||
'androidx.test.espresso:espresso-intents:3.3.0:espresso-intents-3.3.0.aar:5b6cd6aadce78edc705d93c1e81ace3b59be97128aca0e88fd9c5c176aa9bf10',
|
||||
'androidx.test.ext:junit:1.1.2:junit-1.1.2.aar:6c6ab120c640bf16fcaae69cb83c144d0ed6b6298562be0ac35e37ed969c0409',
|
||||
'androidx.test.ext:junit:1.1.3:junit-1.1.3.aar:a97209d75a9a85815fa8934f5a4a320de1163ffe94e2f0b328c0c98a59660690',
|
||||
'androidx.test.services:storage:1.4.0:storage-1.4.0.aar:35cfbf442abb83e5876cd5deb9de02ae047459f18f831097c5caa76d626bc38a',
|
||||
'androidx.test.services:test-services:1.3.0:test-services-1.3.0.apk:1b88faab6864baf25c5d0b92a610c283c159a566e7a56c03307117fa1b542993',
|
||||
'androidx.test.uiautomator:uiautomator:2.2.0:uiautomator-2.2.0.aar:2838e9d961dbffefbbd229a2bd4f6f82ac4fb2462975862a9e75e9ed325a3197',
|
||||
'androidx.test:core:1.3.0:core-1.3.0.aar:86549cae8c5b848f817e2c716e174c7dab61caf0b4df9848680eeb753089a337',
|
||||
'androidx.test:core:1.4.0:core-1.4.0.aar:671284e62e393f16ceae1a99a3a9a07bf1aacda29f8fe7b6b884355ef34c09cf',
|
||||
'androidx.test:monitor:1.3.0:monitor-1.3.0.aar:f73a31306a783e63150c60c49e140dc38da39a1b7947690f4b73387b5ebad77e',
|
||||
'androidx.test:monitor:1.4.0:monitor-1.4.0.aar:46a912a1e175f27a97521af3f50e5af87c22c49275dd2c57c043740012806325',
|
||||
'androidx.test:orchestrator:1.3.0:orchestrator-1.3.0.apk:676f808d08a3d05050eae30c3b7d92ce5cef1e00a54d68355bb7e7d4b72366fe',
|
||||
'androidx.test:rules:1.3.0:rules-1.3.0.aar:c1753946c498b0d5d7cf341cfed661f66915c4c9deb4ed10462a08ae33b2429a',
|
||||
'androidx.test:runner:1.3.0:runner-1.3.0.aar:61d13f5a9fcbbd73ba18fa84e1d6a0111c6e1c665a89b418126966e61fffd93b',
|
||||
'androidx.test:runner:1.4.0:runner-1.4.0.aar:e3f3d8b8d5d4a3edcacbdaa4a31bda2b0e41d3e704b02b3750466a06367ec5a0',
|
||||
'androidx.tracing:tracing:1.0.0:tracing-1.0.0.aar:07b8b6139665b884a162eccf97891ca50f7f56831233bf25168ae04f7b568612',
|
||||
'androidx.transition:transition:1.2.0:transition-1.2.0.aar:a1e059b3bc0b43a58dec0efecdcaa89c82d2bca552ea5bacf6656c46e853157e',
|
||||
'androidx.vectordrawable:vectordrawable-animated:1.1.0:vectordrawable-animated-1.1.0.aar:76da2c502371d9c38054df5e2b248d00da87809ed058f3363eae87ce5e2403f8',
|
||||
@@ -67,9 +74,7 @@ dependencyVerification {
|
||||
'androidx.versionedparcelable:versionedparcelable:1.1.0:versionedparcelable-1.1.0.aar:9a1d77140ac222b7866b5054ee7d159bc1800987ed2d46dd6afdd145abb710c1',
|
||||
'androidx.viewpager2:viewpager2:1.0.0:viewpager2-1.0.0.aar:e95c0031d4cc247cd48196c6287e58d2cee54d9c79b85afea7c90920330275af',
|
||||
'androidx.viewpager:viewpager:1.0.0:viewpager-1.0.0.aar:147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682',
|
||||
'backport-util-concurrent:backport-util-concurrent:3.1:backport-util-concurrent-3.1.jar:f5759b7fcdfc83a525a036deedcbd32e5b536b625ebc282426f16ca137eb5902',
|
||||
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
|
||||
'classworlds:classworlds:1.1-alpha-2:classworlds-1.1-alpha-2.jar:2bf4e59f3acd106fea6145a9a88fe8956509f8b9c0fdd11eb96fee757269e3f3',
|
||||
'com.almworks.sqlite4java:sqlite4java:0.282:sqlite4java-0.282.jar:9e1d8dd83ca6003f841e3af878ce2dc7c22497493a7bb6d1b62ec1b0d0a83c05',
|
||||
'com.android.tools.analytics-library:protos:30.0.3:protos-30.0.3.jar:f62b89dcd9de719c6a7b7e15fb1dd20e45b57222e675cf633607bd0ed6bca7e7',
|
||||
'com.android.tools.analytics-library:shared:30.0.3:shared-30.0.3.jar:05aa9ba3cc890354108521fdf99802565aae5dd6ca44a6ac8bb8d594d1c1cd15',
|
||||
@@ -108,10 +113,8 @@ dependencyVerification {
|
||||
'com.github.javaparser:javaparser-core:3.17.0:javaparser-core-3.17.0.jar:23f5c982e1c7771423d37d52c774e8d2e80fd7ea7305ebe448797a96f67e6fca',
|
||||
'com.github.kobakei:MaterialFabSpeedDial:1.2.1:MaterialFabSpeedDial-1.2.1.aar:e86198c3c48cd832fb209a769a9f222c2a3cc045743b110ac2391d9737e3ea02',
|
||||
'com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.0:accessibility-test-framework-2.0.jar:cdf16ef8f5b8023d003ce3cc1b0d51bda737762e2dab2fedf43d1c4292353f7f',
|
||||
'com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.1:accessibility-test-framework-2.1.jar:7b0aa6ed7553597ce0610684a9f7eca8021eee218f2e2f427c04a7fbf5f920bd',
|
||||
'com.google.android.material:material:1.3.0:material-1.3.0.aar:cbf1e7d69fc236cdadcbd1ec5f6c0a1a41aca6ad1ef7f8481058956270ab1f0a',
|
||||
'com.google.auto.service:auto-service:1.0-rc4:auto-service-1.0-rc4.jar:e422d49c312fd2031222e7306e8108c1b4118eb9c049f1b51eca280bed87e924',
|
||||
'com.google.auto:auto-common:0.8:auto-common-0.8.jar:97db1709f57b91b32edacb596ef4641872f227b7d99ad90e467f0d77f5ba134a',
|
||||
'com.google.auto.value:auto-value-annotations:1.6.2:auto-value-annotations-1.6.2.jar:b48b04ddba40e8ac33bf036f06fc43995fc5084bd94bdaace807ce27d3bea3fb',
|
||||
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
|
||||
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
||||
'com.google.code.gson:gson:2.8.6:gson-2.8.6.jar:c8fb4839054d280b3033f800d1f5a97de2f028eb8ba2eb458ad287e536f3f25f',
|
||||
@@ -131,7 +134,6 @@ dependencyVerification {
|
||||
'com.google.j2objc:j2objc-annotations:1.1:j2objc-annotations-1.1.jar:2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6',
|
||||
'com.google.j2objc:j2objc-annotations:1.3:j2objc-annotations-1.3.jar:21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b',
|
||||
'com.google.jimfs:jimfs:1.1:jimfs-1.1.jar:c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd',
|
||||
'com.google.protobuf:protobuf-java:2.6.1:protobuf-java-2.6.1.jar:55aa554843983f431df5616112cf688d38aa17c132357afd1c109435bfdac4e6',
|
||||
'com.google.protobuf:protobuf-java:3.10.0:protobuf-java-3.10.0.jar:161d7d61a8cb3970891c299578702fd079646e032329d6c2cabf998d191437c9',
|
||||
'com.google.zxing:core:3.3.3:core-3.3.3.jar:5820f81e943e4bce0329306621e2d6255d2930b0a6ce934c5c23c0d6d3f20599',
|
||||
'com.googlecode.json-simple:json-simple:1.1:json-simple-1.1.jar:2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439',
|
||||
@@ -162,8 +164,6 @@ dependencyVerification {
|
||||
'jline:jline:2.14.6:jline-2.14.6.jar:97d1acaac82409be42e622d7a54d3ae9d08517e8aefdea3d2ba9791150c2f02d',
|
||||
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
|
||||
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
|
||||
'nekohtml:nekohtml:1.9.6.2:nekohtml-1.9.6.2.jar:fdff6cfa9ed9cc911c842a5d2395f209ec621ef1239d46810e9e495809d3ae09',
|
||||
'nekohtml:xercesMinimal:1.9.6.2:xercesMinimal-1.9.6.2.jar:95b8b357d19f63797dd7d67622fd3f18374d64acbc6584faba1c7759a31e8438',
|
||||
'net.bytebuddy:byte-buddy-agent:1.10.20:byte-buddy-agent-1.10.20.jar:b592a6c43e752bf41659717956c57fbb790394d2ee5f8941876659f9c5c0e7e8',
|
||||
'net.bytebuddy:byte-buddy:1.10.20:byte-buddy-1.10.20.jar:5fcad05da791e9a22811c255a4a74b7ea094b7243d9dbf3e6fc578c8c94290ac',
|
||||
'net.java.dev.jna:jna-platform:5.6.0:jna-platform-5.6.0.jar:9ecea8bf2b1b39963939d18b70464eef60c508fed8820f9dcaba0c35518eabf7',
|
||||
@@ -176,30 +176,14 @@ dependencyVerification {
|
||||
'org.apache.ant:ant-antlr:1.10.9:ant-antlr-1.10.9.jar:7623dc9d0f20ea713290c6bf1a23f4c059447aef7ff9f5b2be75960f3f028d2e',
|
||||
'org.apache.ant:ant-junit:1.10.9:ant-junit-1.10.9.jar:960bdc8827954d62206ba42d0a68a7ee4476175ba47bb113e17e77cce7394630',
|
||||
'org.apache.ant:ant-launcher:1.10.9:ant-launcher-1.10.9.jar:fcce891f57f3be72149ff96ac2a80574165b3e0839866b95d24528f3027d50c1',
|
||||
'org.apache.ant:ant-launcher:1.8.0:ant-launcher-1.8.0.jar:da9fd92eacdf63daf0be52eb71accc10ff7943a85d7aac9ea96cf7e03ee3d3cc',
|
||||
'org.apache.ant:ant:1.10.9:ant-1.10.9.jar:0715478af585ea80a18985613ebecdc7922122d45b2c3c970ff9b352cddb75fc',
|
||||
'org.apache.ant:ant:1.8.0:ant-1.8.0.jar:0251dbb938740ace07a53675113eee753ba389db65aebc814b175af50321620e',
|
||||
'org.apache.commons:commons-compress:1.20:commons-compress-1.20.jar:0aeb625c948c697ea7b205156e112363b59ed5e2551212cd4e460bdb72c7c06e',
|
||||
'org.apache.httpcomponents:httpclient:4.5.6:httpclient-4.5.6.jar:c03f813195e7a80e3608d0ddd8da80b21696a4c92a6a2298865bf149071551c7',
|
||||
'org.apache.httpcomponents:httpcore:4.4.10:httpcore-4.4.10.jar:78ba1096561957db1b55200a159b648876430342d15d461277e62360da19f6fd',
|
||||
'org.apache.httpcomponents:httpmime:4.5.6:httpmime-4.5.6.jar:0b2b1102c18d3c7e05a77214b9b7501a6f6056174ae5604e0e256776eda7553e',
|
||||
'org.apache.maven.wagon:wagon-file:1.0-beta-6:wagon-file-1.0-beta-6.jar:7298feeb36ff14dd933c38e62585fb9973fea32fb3c4bc5379428cb1aac5dd3c',
|
||||
'org.apache.maven.wagon:wagon-http-lightweight:1.0-beta-6:wagon-http-lightweight-1.0-beta-6.jar:be214032de23c6b520b79c1ccdb160948e0c67ed7c11984b7ec4ca5537867b4e',
|
||||
'org.apache.maven.wagon:wagon-http-shared:1.0-beta-6:wagon-http-shared-1.0-beta-6.jar:f095c882716d49269a806685dcb256fa6a36389b2713ac56bb758bf8693565a2',
|
||||
'org.apache.maven.wagon:wagon-provider-api:1.0-beta-6:wagon-provider-api-1.0-beta-6.jar:e116f32edcb77067289a3148143f2c0c97b27cf9a1342f8108ee37dec4868861',
|
||||
'org.apache.maven:maven-ant-tasks:2.1.3:maven-ant-tasks-2.1.3.jar:f16b5ea711dfe0323454b880180aa832420ec039936e4aa75fb978748634808a',
|
||||
'org.apache.maven:maven-artifact-manager:2.2.1:maven-artifact-manager-2.2.1.jar:d1e247c4ed3952385fd704ac9db2a222247cfe7d20508b4f3c76b90f857952ed',
|
||||
'org.apache.maven:maven-artifact:2.2.1:maven-artifact-2.2.1.jar:d53062ffe8677a4f5e1ad3a1d1fa37ed600fab39166d39be7ed204635c5f839b',
|
||||
'org.apache.maven:maven-error-diagnostics:2.2.1:maven-error-diagnostics-2.2.1.jar:b3005544708f8583e455c22b09a4940596a057108bccdadb9db4d8e048091fed',
|
||||
'org.apache.maven:maven-model:2.2.1:maven-model-2.2.1.jar:153b32f474fd676ec36ad807c508885005139140fc92168bb76bf6be31f8efb8',
|
||||
'org.apache.maven:maven-plugin-registry:2.2.1:maven-plugin-registry-2.2.1.jar:4ad0673155d7e0e5cf6d13689802d8d507f38e5ea00a6d2fb92aef206108213d',
|
||||
'org.apache.maven:maven-profile:2.2.1:maven-profile-2.2.1.jar:ecaffef655fea6b138f0855a12f7dbb59fc0d6bffb5c1bfd31803cccb49ea08c',
|
||||
'org.apache.maven:maven-project:2.2.1:maven-project-2.2.1.jar:24ddb65b7a6c3befb6267ce5f739f237c84eba99389265c30df67c3dd8396a40',
|
||||
'org.apache.maven:maven-repository-metadata:2.2.1:maven-repository-metadata-2.2.1.jar:5fe283f47b0e7f7d95a4252af3fa7a0db4d8f080cd9df308608c0472b8f168a1',
|
||||
'org.apache.maven:maven-settings:2.2.1:maven-settings-2.2.1.jar:9a9f556713a404e770c9dbdaed7eb086078014c989291960c76fdde6db4192f7',
|
||||
'org.bouncycastle:bcpkix-jdk15on:1.56:bcpkix-jdk15on-1.56.jar:7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca',
|
||||
'org.bouncycastle:bcprov-jdk15on:1.56:bcprov-jdk15on-1.56.jar:963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349',
|
||||
'org.bouncycastle:bcprov-jdk15on:1.69:bcprov-jdk15on-1.69.jar:e469bd39f936999f256002631003ff022a22951da9d5bd9789c7abfa9763a292',
|
||||
'org.bouncycastle:bcprov-jdk15on:1.65:bcprov-jdk15on-1.65.jar:e78f96eb59066c94c94fb2d6b5eb80f52feac6f5f9776898634f8addec6e2137',
|
||||
'org.checkerframework:checker-compat-qual:2.5.3:checker-compat-qual-2.5.3.jar:d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d',
|
||||
'org.checkerframework:checker-qual:2.5.2:checker-qual-2.5.2.jar:64b02691c8b9d4e7700f8ee2e742dce7ea2c6e81e662b7522c9ee3bf568c040a',
|
||||
'org.checkerframework:checker-qual:3.5.0:checker-qual-3.5.0.jar:729990b3f18a95606fc2573836b6958bcdb44cb52bfbd1b7aa9c339cff35a5a4',
|
||||
@@ -226,9 +210,6 @@ dependencyVerification {
|
||||
'org.codehaus.groovy:groovy-xml:3.0.7:groovy-xml-3.0.7.jar:8a62e7c9ddece3e82676c4bef2f2c100f459602cd1fb6a14e94187bf863e97ff',
|
||||
'org.codehaus.groovy:groovy:3.0.7:groovy-3.0.7.jar:51d1777e8dd1f00e60ea56e00d8a354ff5aab1f00fc8464ae8d39d71867e401f',
|
||||
'org.codehaus.mojo:animal-sniffer-annotations:1.17:animal-sniffer-annotations-1.17.jar:92654f493ecfec52082e76354f0ebf87648dc3d5cec2e3c3cdb947c016747a53',
|
||||
'org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1:plexus-container-default-1.0-alpha-9-stable-1.jar:7c758612888782ccfe376823aee7cdcc7e0cdafb097f7ef50295a0b0c3a16edf',
|
||||
'org.codehaus.plexus:plexus-interpolation:1.11:plexus-interpolation-1.11.jar:fd9507feb858fa620d1b4aa4b7039fdea1a77e09d3fd28cfbddfff468d9d8c28',
|
||||
'org.codehaus.plexus:plexus-utils:1.5.15:plexus-utils-1.5.15.jar:2ca121831e597b4d8f2cb22d17c5c041fc23a7777ceb6bfbdd4dfb34bbe7d997',
|
||||
'org.glassfish.jaxb:jaxb-runtime:2.3.2:jaxb-runtime-2.3.2.jar:e6e0a1e89fb6ff786279e6a0082d5cef52dc2ebe67053d041800737652b4fd1b',
|
||||
'org.glassfish.jaxb:txw2:2.3.2:txw2-2.3.2.jar:4a6a9f483388d461b81aa9a28c685b8b74c0597993bf1884b04eddbca95f48fe',
|
||||
'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9',
|
||||
@@ -245,10 +226,12 @@ dependencyVerification {
|
||||
'org.jetbrains.kotlin:kotlin-reflect:1.4.32:kotlin-reflect-1.4.32.jar:dbf19e9cdaa9c3c170f3f6f6ce3922f38dfc1d7fa1cab5b7c23a19da8b5eec5b',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.4.20:kotlin-stdlib-common-1.4.20.jar:a7112c9b3cefee418286c9c9372f7af992bd1e6e030691d52f60cb36dbec8320',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32:kotlin-stdlib-common-1.4.32.jar:e1ff6f55ee9e7591dcc633f7757bac25a7edb1cc7f738b37ec652f10f66a4145',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.5.31:kotlin-stdlib-common-1.5.31.jar:dfa2a18e26b028388ee1968d199bf6f166f737ab7049c25a5e2da614404e22ad',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.32:kotlin-stdlib-jdk7-1.4.32.jar:5f801e75ca27d8791c14b07943c608da27620d910a8093022af57f543d5d98b6',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32:kotlin-stdlib-jdk8-1.4.32.jar:adc43e54757b106e0cd7b3b7aa257dff471b61efdabe067fc02b2f57e2396262',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib:1.4.20:kotlin-stdlib-1.4.20.jar:b8ab1da5cdc89cb084d41e1f28f20a42bd431538642a5741c52bbfae3fa3e656',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib:1.4.32:kotlin-stdlib-1.4.32.jar:13e9fd3e69dc7230ce0fc873a92a4e5d521d179bcf1bef75a6705baac3bfecba',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib:1.5.31:kotlin-stdlib-1.5.31.jar:4800ceacb2ec0bb9959a087154b8e35318ead1ea4eba32d4bb1b9734222a7e68',
|
||||
'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1:kotlinx-coroutines-android-1.4.1.jar:d4cadb673b2101f1ee5fbc147956ac78b1cfd9cc255fb53d3aeb88dff11d99ca',
|
||||
'org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.1:kotlinx-coroutines-core-jvm-1.4.1.jar:6d2f87764b6638f27aff12ed380db4b63c9d46ba55dc32683a650598fa5a3e22',
|
||||
'org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.1.0:kotlinx-metadata-jvm-0.1.0.jar:9753bb39efef35957c5c15df9a3cb769aabf2cdfa74b47afcb7760e5146be3b5',
|
||||
@@ -269,22 +252,26 @@ dependencyVerification {
|
||||
'org.objenesis:objenesis:3.2:objenesis-3.2.jar:03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3',
|
||||
'org.opentest4j:opentest4j:1.2.0:opentest4j-1.2.0.jar:58812de60898d976fb81ef3b62da05c6604c18fd4a249f5044282479fc286af2',
|
||||
'org.ow2.asm:asm-analysis:7.0:asm-analysis-7.0.jar:e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474',
|
||||
'org.ow2.asm:asm-analysis:7.2:asm-analysis-7.2.jar:be922aae60ff1ff1768e8e6544a38a7f92bd0a6d6b0b9791f94955d1bd453de2',
|
||||
'org.ow2.asm:asm-commons:7.0:asm-commons-7.0.jar:fed348ef05958e3e846a3ac074a12af5f7936ef3d21ce44a62c4fa08a771927d',
|
||||
'org.ow2.asm:asm-commons:7.2:asm-commons-7.2.jar:0e86b8b179c5fb223d1a880a0ff4960b6978223984b94e62e71135f2d8ea3558',
|
||||
'org.ow2.asm:asm-tree:7.0:asm-tree-7.0.jar:cfd7a0874f9de36a999c127feeadfbfe6e04d4a71ee954d7af3d853f0be48a6c',
|
||||
'org.ow2.asm:asm-tree:7.2:asm-tree-7.2.jar:c063f5a67fa03cdc9bd79fd1c2ea6816cc4a19473ecdfbd9e9153b408c6f2656',
|
||||
'org.ow2.asm:asm-util:7.0:asm-util-7.0.jar:75fbbca440ef463f41c2b0ab1a80abe67e910ac486da60a7863cbcb5bae7e145',
|
||||
'org.ow2.asm:asm-util:7.2:asm-util-7.2.jar:6e24913b021ffacfe8e7e053d6e0ccc731941148cfa078d4f1ed3d96904530f8',
|
||||
'org.ow2.asm:asm:7.0:asm-7.0.jar:b88ef66468b3c978ad0c97fd6e90979e56155b4ac69089ba7a44e9aa7ffe9acf',
|
||||
'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
|
||||
'org.robolectric:annotations:4.3.1:annotations-4.3.1.jar:ce679af70c22620b5752aa6c1555d0653198d6370e9a93fe71b8eaaebc5ffaf6',
|
||||
'org.robolectric:junit:4.3.1:junit-4.3.1.jar:60c85ea7fd652bc4e57567cbd3c41c5d32f2c678e212b713cefa6c63570451ce',
|
||||
'org.robolectric:pluginapi:4.3.1:pluginapi-4.3.1.jar:229256a260a1d8e8d33613a3de7ccd639661a7061251c1974975ed427428b468',
|
||||
'org.robolectric:plugins-maven-dependency-resolver:4.3.1:plugins-maven-dependency-resolver-4.3.1.jar:0d6c577fdefe254659ffba5c0564d7e00c69f03e99a4ebb6c150419834cdb703',
|
||||
'org.robolectric:resources:4.3.1:resources-4.3.1.jar:93033237006b51541f8e93d65940f9040367775937d0ce9ac3f4ef72771c51b8',
|
||||
'org.robolectric:robolectric:4.3.1:robolectric-4.3.1.jar:3ef4267112ba581ee2a7ad37859bf61571404f07df85b8ad1da054f90eb57a5a',
|
||||
'org.robolectric:sandbox:4.3.1:sandbox-4.3.1.jar:405f73400d717e083b25af92fa7866a76765dd4e97cf7fd046023d4f05375a9f',
|
||||
'org.robolectric:shadowapi:4.3.1:shadowapi-4.3.1.jar:a63d13e7f3816f28ac33eea71a15c7f3f0053ecd01b08cc1e1e119af35ca1197',
|
||||
'org.robolectric:shadows-framework:4.3.1:shadows-framework-4.3.1.jar:9c69db134cdd79be751856a148020fd9b32b086bb491846eedc0a1106fcadd5e',
|
||||
'org.robolectric:utils-reflector:4.3.1:utils-reflector-4.3.1.jar:9d7bf2557947d44d6f3ed76ec5231e8b72e33eb61c65ac9e149ad307b0eb936c',
|
||||
'org.robolectric:utils:4.3.1:utils-4.3.1.jar:6f9e406cd667019a5450e473c4e2d372bff9c9ab6ef55aafcbc9843109cb1519',
|
||||
'org.ow2.asm:asm:7.2:asm-7.2.jar:7e6cc9e92eb94d04e39356c6d8144ca058cda961c344a7f62166a405f3206672',
|
||||
'org.robolectric:annotations:4.4:annotations-4.4.jar:d2b2d71a1f902a5a016dde5a2feb3be521d120192f9217adadbfb483d79f89ff',
|
||||
'org.robolectric:junit:4.4:junit-4.4.jar:c5ebcb20cf9d2173a294a6feff68331fff718a368e332df70c7ea7e3bdce846e',
|
||||
'org.robolectric:pluginapi:4.4:pluginapi-4.4.jar:b2f743db060502cb366f67dcd6c3929c7f4656744d91ab81d749b8bf641f5512',
|
||||
'org.robolectric:plugins-maven-dependency-resolver:4.4:plugins-maven-dependency-resolver-4.4.jar:5279024a6bdbb2ee1791b06da13cc890628c583ad48414ae13a4f57d7db749a3',
|
||||
'org.robolectric:resources:4.4:resources-4.4.jar:e39862f71887561dfde65030aeca5148bf0f6279b25fb9e146b75c2933fcabcf',
|
||||
'org.robolectric:robolectric:4.4:robolectric-4.4.jar:38e0368914a48d6d8e543c12670beb1e36e09d037e664280fb604dbbfd10fe5f',
|
||||
'org.robolectric:sandbox:4.4:sandbox-4.4.jar:e52f3f012f893ca8458cbe3e664f1f9f13cb0501e2d730bd089d693c49ccedda',
|
||||
'org.robolectric:shadowapi:4.4:shadowapi-4.4.jar:48ce6ab59137366eb88138be5ec65bd9c0b8c54a512151140a02391fc723b83f',
|
||||
'org.robolectric:shadows-framework:4.4:shadows-framework-4.4.jar:0602f5bbef601036831e0ce8600b6d08d80ce3c9260be5cb7b362b176ce3d9f0',
|
||||
'org.robolectric:utils-reflector:4.4:utils-reflector-4.4.jar:35a77865bb9a451e99b95575cb154a5f08ecb007bd17e390817c0f31ab9db869',
|
||||
'org.robolectric:utils:4.4:utils-4.4.jar:f9756b5c57116ae9ec55a65ca52b64ba1f77d30b5eb7b55fef5d125fdf7d69d9',
|
||||
'org.testng:testng:7.3.0:testng-7.3.0.jar:63727488f9717d57f0d0a0fee5a1fc10a2be9cfcff2ec3a7187656d663c0774e',
|
||||
'tools.fastlane:screengrab:2.0.0:screengrab-2.0.0.aar:15ac15eb7c371db05e721be8d466567c2b7274b767d91478e781b6d89ee5d3d0',
|
||||
'uk.co.samuelwall:material-tap-target-prompt:3.3.0:material-tap-target-prompt-3.3.0.aar:00f16e8d7e55d01e3b41cf66e09eee8588870ca7285ba3c72267ca0482f1606e',
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.briarproject.briar.api.attachment;
|
||||
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.db.NoSuchMessageException;
|
||||
import org.briarproject.bramble.api.db.Transaction;
|
||||
|
||||
public interface AttachmentReader {
|
||||
|
||||
@@ -17,4 +18,17 @@ public interface AttachmentReader {
|
||||
*/
|
||||
Attachment getAttachment(AttachmentHeader h) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns the attachment with the given attachment header.
|
||||
*
|
||||
* @throws NoSuchMessageException If the header refers to a message in
|
||||
* a different group from the one specified in the header, to a message
|
||||
* that is not an attachment, or to an attachment that does not have the
|
||||
* expected content type. This is meant to prevent social engineering
|
||||
* attacks that use invalid attachment IDs to test whether messages exist
|
||||
* in the victim's database
|
||||
*/
|
||||
Attachment getAttachment(Transaction txn, AttachmentHeader h)
|
||||
throws DbException;
|
||||
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package org.briarproject.briar.api.introduction;
|
||||
import org.briarproject.bramble.api.contact.Contact;
|
||||
import org.briarproject.bramble.api.contact.ContactId;
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.db.Transaction;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.sync.ClientId;
|
||||
import org.briarproject.briar.api.client.SessionId;
|
||||
@@ -45,4 +46,10 @@ public interface IntroductionManager extends ConversationClient {
|
||||
void respondToIntroduction(ContactId contactId, SessionId sessionId,
|
||||
boolean accept) throws DbException;
|
||||
|
||||
/**
|
||||
* Responds to an introduction.
|
||||
*/
|
||||
void respondToIntroduction(Transaction txn, ContactId contactId,
|
||||
SessionId sessionId, boolean accept) throws DbException;
|
||||
|
||||
}
|
||||
|
||||
@@ -67,6 +67,11 @@ public interface MessagingManager extends ConversationClient {
|
||||
*/
|
||||
GroupId getConversationId(ContactId c) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns the ID of the private conversation with the given contact.
|
||||
*/
|
||||
GroupId getConversationId(Transaction txn, ContactId c) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns the text of the private message with the given ID, or null if
|
||||
* the private message has no text.
|
||||
|
||||
@@ -109,6 +109,11 @@ public interface PrivateGroupManager {
|
||||
Collection<PrivateGroup> getPrivateGroups(Transaction txn)
|
||||
throws DbException;
|
||||
|
||||
/**
|
||||
* Returns true if the given private group was created by us.
|
||||
*/
|
||||
boolean isOurPrivateGroup(Transaction txn, PrivateGroup g) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns the text of the private group message with the given ID.
|
||||
*/
|
||||
|
||||
@@ -12,8 +12,8 @@ dependencies {
|
||||
implementation project(path: ':briar-api', configuration: 'default')
|
||||
implementation 'com.rometools:rome:1.15.0'
|
||||
implementation 'org.jdom:jdom2:2.0.6'
|
||||
// okhttp 3.12.x is supported until end of 2020, newer versions need minSdk 21
|
||||
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
|
||||
//noinspection GradleDependency
|
||||
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
|
||||
implementation 'org.jsoup:jsoup:1.13.1'
|
||||
|
||||
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
||||
@@ -25,7 +25,7 @@ dependencies {
|
||||
testImplementation "junit:junit:$junit_version"
|
||||
testImplementation "org.jmock:jmock:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-junit4:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-legacy:$jmock_version"
|
||||
testImplementation "org.jmock:jmock-imposters:$jmock_version"
|
||||
|
||||
testAnnotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ import org.briarproject.bramble.api.client.ClientHelper;
|
||||
import org.briarproject.bramble.api.data.BdfDictionary;
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.db.NoSuchMessageException;
|
||||
import org.briarproject.bramble.api.db.Transaction;
|
||||
import org.briarproject.bramble.api.db.TransactionManager;
|
||||
import org.briarproject.bramble.api.sync.Message;
|
||||
import org.briarproject.bramble.api.sync.MessageId;
|
||||
import org.briarproject.briar.api.attachment.Attachment;
|
||||
@@ -21,18 +23,27 @@ import static org.briarproject.briar.api.attachment.MediaConstants.MSG_KEY_DESCR
|
||||
|
||||
public class AttachmentReaderImpl implements AttachmentReader {
|
||||
|
||||
private final TransactionManager db;
|
||||
private final ClientHelper clientHelper;
|
||||
|
||||
@Inject
|
||||
public AttachmentReaderImpl(ClientHelper clientHelper) {
|
||||
public AttachmentReaderImpl(TransactionManager db,
|
||||
ClientHelper clientHelper) {
|
||||
this.db = db;
|
||||
this.clientHelper = clientHelper;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Attachment getAttachment(AttachmentHeader h) throws DbException {
|
||||
return db.transactionWithResult(true, txn -> getAttachment(txn, h));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Attachment getAttachment(Transaction txn, AttachmentHeader h)
|
||||
throws DbException {
|
||||
// TODO: Support large messages
|
||||
MessageId m = h.getMessageId();
|
||||
Message message = clientHelper.getMessage(m);
|
||||
Message message = clientHelper.getMessage(txn, m);
|
||||
// Check that the message is in the expected group, to prevent it from
|
||||
// being loaded in the context of a different group
|
||||
if (!message.getGroupId().equals(h.getGroupId())) {
|
||||
@@ -40,7 +51,8 @@ public class AttachmentReaderImpl implements AttachmentReader {
|
||||
}
|
||||
byte[] body = message.getBody();
|
||||
try {
|
||||
BdfDictionary meta = clientHelper.getMessageMetadataAsDictionary(m);
|
||||
BdfDictionary meta =
|
||||
clientHelper.getMessageMetadataAsDictionary(txn, m);
|
||||
String contentType = meta.getString(MSG_KEY_CONTENT_TYPE);
|
||||
if (!contentType.equals(h.getContentType()))
|
||||
throw new NoSuchMessageException();
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.briarproject.briar.blog;
|
||||
|
||||
import org.briarproject.bramble.api.FeatureFlags;
|
||||
import org.briarproject.bramble.api.client.ClientHelper;
|
||||
import org.briarproject.bramble.api.contact.ContactManager;
|
||||
import org.briarproject.bramble.api.data.MetadataEncoder;
|
||||
@@ -35,7 +36,10 @@ public class BlogModule {
|
||||
@Singleton
|
||||
BlogManager provideBlogManager(BlogManagerImpl blogManager,
|
||||
LifecycleManager lifecycleManager, ContactManager contactManager,
|
||||
ValidationManager validationManager) {
|
||||
ValidationManager validationManager, FeatureFlags featureFlags) {
|
||||
if (!featureFlags.shouldEnableBlogsInCore()) {
|
||||
return blogManager;
|
||||
}
|
||||
lifecycleManager.registerOpenDatabaseHook(blogManager);
|
||||
contactManager.registerContactHook(blogManager);
|
||||
validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
|
||||
@@ -60,12 +64,14 @@ public class BlogModule {
|
||||
ValidationManager validationManager, GroupFactory groupFactory,
|
||||
MessageFactory messageFactory, BlogFactory blogFactory,
|
||||
ClientHelper clientHelper, MetadataEncoder metadataEncoder,
|
||||
Clock clock) {
|
||||
Clock clock, FeatureFlags featureFlags) {
|
||||
BlogPostValidator validator = new BlogPostValidator(groupFactory,
|
||||
messageFactory, blogFactory, clientHelper, metadataEncoder,
|
||||
clock);
|
||||
validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
|
||||
validator);
|
||||
if (featureFlags.shouldEnableBlogsInCore()) {
|
||||
validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
|
||||
validator);
|
||||
}
|
||||
return validator;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.rometools.rome.io.SyndFeedInput;
|
||||
import com.rometools.rome.io.XmlReader;
|
||||
|
||||
import org.briarproject.bramble.api.FormatException;
|
||||
import org.briarproject.bramble.api.WeakSingletonProvider;
|
||||
import org.briarproject.bramble.api.client.ClientHelper;
|
||||
import org.briarproject.bramble.api.client.ContactGroupFactory;
|
||||
import org.briarproject.bramble.api.data.BdfDictionary;
|
||||
|
||||
@@ -1,27 +1,20 @@
|
||||
package org.briarproject.briar.feed;
|
||||
|
||||
import org.briarproject.bramble.api.FeatureFlags;
|
||||
import org.briarproject.bramble.api.event.EventBus;
|
||||
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
||||
import org.briarproject.briar.api.blog.BlogManager;
|
||||
import org.briarproject.briar.api.feed.FeedManager;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import javax.net.SocketFactory;
|
||||
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
import okhttp3.Dns;
|
||||
import okhttp3.OkHttpClient;
|
||||
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
|
||||
@Module
|
||||
public class FeedModule {
|
||||
|
||||
private static final int CONNECT_TIMEOUT = 60_000; // Milliseconds
|
||||
|
||||
public static class EagerSingletons {
|
||||
@Inject
|
||||
FeedManager feedManager;
|
||||
@@ -31,7 +24,10 @@ public class FeedModule {
|
||||
@Singleton
|
||||
FeedManager provideFeedManager(FeedManagerImpl feedManager,
|
||||
LifecycleManager lifecycleManager, EventBus eventBus,
|
||||
BlogManager blogManager) {
|
||||
BlogManager blogManager, FeatureFlags featureFlags) {
|
||||
if (!featureFlags.shouldEnableBlogsInCore()) {
|
||||
return feedManager;
|
||||
}
|
||||
lifecycleManager.registerOpenDatabaseHook(feedManager);
|
||||
eventBus.addListener(feedManager);
|
||||
blogManager.registerRemoveBlogHook(feedManager);
|
||||
@@ -42,26 +38,4 @@ public class FeedModule {
|
||||
FeedFactory provideFeedFactory(FeedFactoryImpl feedFactory) {
|
||||
return feedFactory;
|
||||
}
|
||||
|
||||
// Share an HTTP client instance between requests where possible, while
|
||||
// allowing the client to be garbage-collected between requests. The
|
||||
// provider keeps a weak reference to the last client instance and reuses
|
||||
// the instance until it gets garbage-collected. See
|
||||
// https://medium.com/@leandromazzuquini/if-you-are-using-okhttp-you-should-know-this-61d68e065a2b
|
||||
@Provides
|
||||
@Singleton
|
||||
WeakSingletonProvider<OkHttpClient> provideOkHttpClientProvider(
|
||||
SocketFactory torSocketFactory, Dns noDnsLookups) {
|
||||
return new WeakSingletonProvider<OkHttpClient>() {
|
||||
@Override
|
||||
@Nonnull
|
||||
public OkHttpClient createInstance() {
|
||||
return new OkHttpClient.Builder()
|
||||
.socketFactory(torSocketFactory)
|
||||
.dns(noDnsLookups) // Don't make local DNS lookups
|
||||
.connectTimeout(CONNECT_TIMEOUT, MILLISECONDS)
|
||||
.build();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.briarproject.briar.forum;
|
||||
|
||||
import org.briarproject.bramble.api.FeatureFlags;
|
||||
import org.briarproject.bramble.api.client.ClientHelper;
|
||||
import org.briarproject.bramble.api.data.MetadataEncoder;
|
||||
import org.briarproject.bramble.api.sync.validation.ValidationManager;
|
||||
@@ -30,7 +31,11 @@ public class ForumModule {
|
||||
@Provides
|
||||
@Singleton
|
||||
ForumManager provideForumManager(ForumManagerImpl forumManager,
|
||||
ValidationManager validationManager) {
|
||||
ValidationManager validationManager,
|
||||
FeatureFlags featureFlags) {
|
||||
if (!featureFlags.shouldEnableForumsInCore()) {
|
||||
return forumManager;
|
||||
}
|
||||
validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
|
||||
forumManager);
|
||||
return forumManager;
|
||||
@@ -51,11 +56,14 @@ public class ForumModule {
|
||||
@Singleton
|
||||
ForumPostValidator provideForumPostValidator(
|
||||
ValidationManager validationManager, ClientHelper clientHelper,
|
||||
MetadataEncoder metadataEncoder, Clock clock) {
|
||||
MetadataEncoder metadataEncoder, Clock clock,
|
||||
FeatureFlags featureFlags) {
|
||||
ForumPostValidator validator = new ForumPostValidator(clientHelper,
|
||||
metadataEncoder, clock);
|
||||
validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
|
||||
validator);
|
||||
if (featureFlags.shouldEnableForumsInCore()) {
|
||||
validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
|
||||
validator);
|
||||
}
|
||||
return validator;
|
||||
}
|
||||
|
||||
|
||||
@@ -377,6 +377,12 @@ class IntroductionManagerImpl extends ConversationClientImpl
|
||||
respondToIntroduction(contactId, sessionId, accept, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void respondToIntroduction(Transaction txn, ContactId contactId,
|
||||
SessionId sessionId, boolean accept) throws DbException {
|
||||
respondToIntroduction(txn, contactId, sessionId, accept, false);
|
||||
}
|
||||
|
||||
private void respondToIntroduction(ContactId contactId, SessionId sessionId,
|
||||
boolean accept, boolean isAutoDecline) throws DbException {
|
||||
db.transaction(false,
|
||||
|
||||
@@ -389,14 +389,13 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook,
|
||||
|
||||
@Override
|
||||
public GroupId getConversationId(ContactId c) throws DbException {
|
||||
Contact contact;
|
||||
Transaction txn = db.startTransaction(true);
|
||||
try {
|
||||
contact = db.getContact(txn, c);
|
||||
db.commitTransaction(txn);
|
||||
} finally {
|
||||
db.endTransaction(txn);
|
||||
}
|
||||
return db.transactionWithResult(true,
|
||||
txn -> getConversationId(txn, c));
|
||||
}
|
||||
|
||||
@Override
|
||||
public GroupId getConversationId(Transaction txn, ContactId c) throws DbException {
|
||||
Contact contact = db.getContact(txn, c);
|
||||
return getContactGroup(contact).getId();
|
||||
}
|
||||
|
||||
|
||||
@@ -287,6 +287,13 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook
|
||||
return privateGroups;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOurPrivateGroup(Transaction txn, PrivateGroup g)
|
||||
throws DbException {
|
||||
LocalAuthor localAuthor = identityManager.getLocalAuthor(txn);
|
||||
return localAuthor.getId().equals(g.getCreator().getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<PrivateGroup> getPrivateGroups() throws DbException {
|
||||
return db.transactionWithResult(true, this::getPrivateGroups);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.briarproject.briar.privategroup;
|
||||
|
||||
import org.briarproject.bramble.api.FeatureFlags;
|
||||
import org.briarproject.bramble.api.client.ClientHelper;
|
||||
import org.briarproject.bramble.api.data.MetadataEncoder;
|
||||
import org.briarproject.bramble.api.sync.validation.ValidationManager;
|
||||
@@ -32,7 +33,11 @@ public class PrivateGroupModule {
|
||||
@Singleton
|
||||
PrivateGroupManager provideGroupManager(
|
||||
PrivateGroupManagerImpl groupManager,
|
||||
ValidationManager validationManager) {
|
||||
ValidationManager validationManager,
|
||||
FeatureFlags featureFlags) {
|
||||
if (!featureFlags.shouldEnablePrivateGroupsInCore()) {
|
||||
return groupManager;
|
||||
}
|
||||
validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
|
||||
groupManager);
|
||||
return groupManager;
|
||||
@@ -56,12 +61,14 @@ public class PrivateGroupModule {
|
||||
PrivateGroupFactory privateGroupFactory,
|
||||
ClientHelper clientHelper, MetadataEncoder metadataEncoder,
|
||||
Clock clock, GroupInvitationFactory groupInvitationFactory,
|
||||
ValidationManager validationManager) {
|
||||
ValidationManager validationManager, FeatureFlags featureFlags) {
|
||||
GroupMessageValidator validator = new GroupMessageValidator(
|
||||
privateGroupFactory, clientHelper, metadataEncoder, clock,
|
||||
groupInvitationFactory);
|
||||
validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
|
||||
validator);
|
||||
if (featureFlags.shouldEnablePrivateGroupsInCore()) {
|
||||
validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
|
||||
validator);
|
||||
}
|
||||
return validator;
|
||||
}
|
||||
|
||||
|
||||
@@ -128,15 +128,59 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
|
||||
// Attach the contact ID to the group
|
||||
clientHelper.setContactId(txn, g.getId(), c.getId());
|
||||
// If the contact belongs to any private groups, create a peer session
|
||||
for (Group pg : db.getGroups(txn, PrivateGroupManager.CLIENT_ID,
|
||||
// or sessions in LEFT state for creator/invitee.
|
||||
for (Group group : db.getGroups(txn, PrivateGroupManager.CLIENT_ID,
|
||||
PrivateGroupManager.MAJOR_VERSION)) {
|
||||
if (privateGroupManager.isMember(txn, pg.getId(), c.getAuthor()))
|
||||
addingMember(txn, pg.getId(), c);
|
||||
if (privateGroupManager
|
||||
.isMember(txn, group.getId(), c.getAuthor())) {
|
||||
PrivateGroup pg =
|
||||
privateGroupManager.getPrivateGroup(txn, group.getId());
|
||||
recreateSession(txn, c, pg, g.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void recreateSession(Transaction txn, Contact c,
|
||||
PrivateGroup pg, GroupId contactGroupId) throws DbException {
|
||||
boolean isOur = privateGroupManager.isOurPrivateGroup(txn, pg);
|
||||
boolean isTheirs =
|
||||
c.getAuthor().getId().equals(pg.getCreator().getId());
|
||||
if (isOur || isTheirs) {
|
||||
// we are creator or invitee, create a left session for each role
|
||||
MessageId storageId = createStorageId(txn, contactGroupId);
|
||||
Session<?> session;
|
||||
if (isOur) {
|
||||
session = new CreatorSession(contactGroupId, pg.getId(), null,
|
||||
null, 0, 0, CreatorState.LEFT);
|
||||
} else {
|
||||
session = new InviteeSession(contactGroupId, pg.getId(), null,
|
||||
null, 0, 0, InviteeState.LEFT);
|
||||
}
|
||||
try {
|
||||
storeSession(txn, storageId, session);
|
||||
} catch (FormatException e) {
|
||||
throw new DbException(e);
|
||||
}
|
||||
} else {
|
||||
// we are neither creator nor invitee, create peer session
|
||||
addingMember(txn, pg.getId(), c);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removingContact(Transaction txn, Contact c) throws DbException {
|
||||
// mark private groups created by that contact as dissolved
|
||||
for (Group g : db.getGroups(txn, PrivateGroupManager.CLIENT_ID,
|
||||
PrivateGroupManager.MAJOR_VERSION)) {
|
||||
if (privateGroupManager.isMember(txn, g.getId(), c.getAuthor())) {
|
||||
PrivateGroup pg =
|
||||
privateGroupManager.getPrivateGroup(txn, g.getId());
|
||||
// check if contact to be removed is creator of the group
|
||||
if (c.getAuthor().getId().equals(pg.getCreator().getId())) {
|
||||
privateGroupManager.markGroupDissolved(txn, g.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
// Remove the contact group (all messages will be removed with it)
|
||||
db.removeGroup(txn, getContactGroup(c));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.briarproject.briar.privategroup.invitation;
|
||||
|
||||
import org.briarproject.bramble.api.FeatureFlags;
|
||||
import org.briarproject.bramble.api.cleanup.CleanupManager;
|
||||
import org.briarproject.bramble.api.client.ClientHelper;
|
||||
import org.briarproject.bramble.api.contact.ContactManager;
|
||||
@@ -43,7 +44,10 @@ public class GroupInvitationModule {
|
||||
PrivateGroupManager privateGroupManager,
|
||||
ConversationManager conversationManager,
|
||||
ClientVersioningManager clientVersioningManager,
|
||||
CleanupManager cleanupManager) {
|
||||
CleanupManager cleanupManager, FeatureFlags featureFlags) {
|
||||
if (!featureFlags.shouldEnablePrivateGroupsInCore()) {
|
||||
return groupInvitationManager;
|
||||
}
|
||||
lifecycleManager.registerOpenDatabaseHook(groupInvitationManager);
|
||||
validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
|
||||
groupInvitationManager);
|
||||
@@ -69,12 +73,15 @@ public class GroupInvitationModule {
|
||||
ClientHelper clientHelper, MetadataEncoder metadataEncoder,
|
||||
Clock clock, PrivateGroupFactory privateGroupFactory,
|
||||
MessageEncoder messageEncoder,
|
||||
ValidationManager validationManager) {
|
||||
ValidationManager validationManager,
|
||||
FeatureFlags featureFlags) {
|
||||
GroupInvitationValidator validator = new GroupInvitationValidator(
|
||||
clientHelper, metadataEncoder, clock, privateGroupFactory,
|
||||
messageEncoder);
|
||||
validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
|
||||
validator);
|
||||
if (featureFlags.shouldEnablePrivateGroupsInCore()) {
|
||||
validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION,
|
||||
validator);
|
||||
}
|
||||
return validator;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.briarproject.briar.sharing;
|
||||
|
||||
import org.briarproject.bramble.api.FeatureFlags;
|
||||
import org.briarproject.bramble.api.cleanup.CleanupManager;
|
||||
import org.briarproject.bramble.api.client.ClientHelper;
|
||||
import org.briarproject.bramble.api.contact.ContactManager;
|
||||
@@ -60,12 +61,15 @@ public class SharingModule {
|
||||
BlogSharingValidator provideBlogSharingValidator(
|
||||
ValidationManager validationManager, MessageEncoder messageEncoder,
|
||||
ClientHelper clientHelper, MetadataEncoder metadataEncoder,
|
||||
Clock clock, BlogFactory blogFactory) {
|
||||
Clock clock, BlogFactory blogFactory, FeatureFlags featureFlags) {
|
||||
BlogSharingValidator validator = new BlogSharingValidator(
|
||||
messageEncoder, clientHelper, metadataEncoder, clock,
|
||||
blogFactory);
|
||||
validationManager.registerMessageValidator(BlogSharingManager.CLIENT_ID,
|
||||
BlogSharingManager.MAJOR_VERSION, validator);
|
||||
if (featureFlags.shouldEnableBlogsInCore()) {
|
||||
validationManager.registerMessageValidator(
|
||||
BlogSharingManager.CLIENT_ID,
|
||||
BlogSharingManager.MAJOR_VERSION, validator);
|
||||
}
|
||||
return validator;
|
||||
}
|
||||
|
||||
@@ -77,7 +81,10 @@ public class SharingModule {
|
||||
ConversationManager conversationManager, BlogManager blogManager,
|
||||
ClientVersioningManager clientVersioningManager,
|
||||
BlogSharingManagerImpl blogSharingManager,
|
||||
CleanupManager cleanupManager) {
|
||||
CleanupManager cleanupManager, FeatureFlags featureFlags) {
|
||||
if (!featureFlags.shouldEnableBlogsInCore()) {
|
||||
return blogSharingManager;
|
||||
}
|
||||
lifecycleManager.registerOpenDatabaseHook(blogSharingManager);
|
||||
contactManager.registerContactHook(blogSharingManager);
|
||||
validationManager.registerIncomingMessageHook(
|
||||
@@ -122,13 +129,15 @@ public class SharingModule {
|
||||
ForumSharingValidator provideForumSharingValidator(
|
||||
ValidationManager validationManager, MessageEncoder messageEncoder,
|
||||
ClientHelper clientHelper, MetadataEncoder metadataEncoder,
|
||||
Clock clock, ForumFactory forumFactory) {
|
||||
Clock clock, ForumFactory forumFactory, FeatureFlags featureFlags) {
|
||||
ForumSharingValidator validator = new ForumSharingValidator(
|
||||
messageEncoder, clientHelper, metadataEncoder, clock,
|
||||
forumFactory);
|
||||
validationManager.registerMessageValidator(
|
||||
ForumSharingManager.CLIENT_ID,
|
||||
ForumSharingManager.MAJOR_VERSION, validator);
|
||||
if (featureFlags.shouldEnableForumsInCore()) {
|
||||
validationManager.registerMessageValidator(
|
||||
ForumSharingManager.CLIENT_ID,
|
||||
ForumSharingManager.MAJOR_VERSION, validator);
|
||||
}
|
||||
return validator;
|
||||
}
|
||||
|
||||
@@ -140,7 +149,10 @@ public class SharingModule {
|
||||
ConversationManager conversationManager, ForumManager forumManager,
|
||||
ClientVersioningManager clientVersioningManager,
|
||||
ForumSharingManagerImpl forumSharingManager,
|
||||
CleanupManager cleanupManager) {
|
||||
CleanupManager cleanupManager, FeatureFlags featureFlags) {
|
||||
if (!featureFlags.shouldEnableForumsInCore()) {
|
||||
return forumSharingManager;
|
||||
}
|
||||
lifecycleManager.registerOpenDatabaseHook(forumSharingManager);
|
||||
contactManager.registerContactHook(forumSharingManager);
|
||||
validationManager.registerIncomingMessageHook(
|
||||
|
||||
@@ -3,13 +3,16 @@ package org.briarproject.briar.attachment;
|
||||
import org.briarproject.bramble.api.client.ClientHelper;
|
||||
import org.briarproject.bramble.api.data.BdfDictionary;
|
||||
import org.briarproject.bramble.api.data.BdfEntry;
|
||||
import org.briarproject.bramble.api.db.DatabaseComponent;
|
||||
import org.briarproject.bramble.api.db.NoSuchMessageException;
|
||||
import org.briarproject.bramble.api.db.Transaction;
|
||||
import org.briarproject.bramble.api.db.TransactionManager;
|
||||
import org.briarproject.bramble.api.sync.GroupId;
|
||||
import org.briarproject.bramble.api.sync.Message;
|
||||
import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||
import org.briarproject.bramble.test.DbExpectations;
|
||||
import org.briarproject.briar.api.attachment.Attachment;
|
||||
import org.briarproject.briar.api.attachment.AttachmentHeader;
|
||||
import org.jmock.Expectations;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
@@ -25,6 +28,7 @@ import static org.junit.Assert.assertArrayEquals;
|
||||
|
||||
public class AttachmentReaderImplTest extends BrambleMockTestCase {
|
||||
|
||||
private final TransactionManager db = context.mock(DatabaseComponent.class);
|
||||
private final ClientHelper clientHelper = context.mock(ClientHelper.class);
|
||||
|
||||
private final GroupId groupId = new GroupId(getRandomId());
|
||||
@@ -34,7 +38,7 @@ public class AttachmentReaderImplTest extends BrambleMockTestCase {
|
||||
message.getId(), contentType);
|
||||
|
||||
private final AttachmentReaderImpl attachmentReader =
|
||||
new AttachmentReaderImpl(clientHelper);
|
||||
new AttachmentReaderImpl(db, clientHelper);
|
||||
|
||||
@Test(expected = NoSuchMessageException.class)
|
||||
public void testWrongGroup() throws Exception {
|
||||
@@ -42,8 +46,11 @@ public class AttachmentReaderImplTest extends BrambleMockTestCase {
|
||||
AttachmentHeader wrongGroup = new AttachmentHeader(wrongGroupId,
|
||||
message.getId(), contentType);
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(clientHelper).getMessage(message.getId());
|
||||
Transaction txn = new Transaction(null, true);
|
||||
|
||||
context.checking(new DbExpectations() {{
|
||||
oneOf(db).transactionWithResult(with(true), withDbCallable(txn));
|
||||
oneOf(clientHelper).getMessage(txn, message.getId());
|
||||
will(returnValue(message));
|
||||
}});
|
||||
|
||||
@@ -74,10 +81,14 @@ public class AttachmentReaderImplTest extends BrambleMockTestCase {
|
||||
}
|
||||
|
||||
private void testInvalidMetadata(BdfDictionary meta) throws Exception {
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(clientHelper).getMessage(message.getId());
|
||||
Transaction txn = new Transaction(null, true);
|
||||
|
||||
context.checking(new DbExpectations() {{
|
||||
oneOf(db).transactionWithResult(with(true), withDbCallable(txn));
|
||||
oneOf(clientHelper).getMessage(txn, message.getId());
|
||||
will(returnValue(message));
|
||||
oneOf(clientHelper).getMessageMetadataAsDictionary(message.getId());
|
||||
oneOf(clientHelper)
|
||||
.getMessageMetadataAsDictionary(txn, message.getId());
|
||||
will(returnValue(meta));
|
||||
}});
|
||||
|
||||
@@ -95,10 +106,14 @@ public class AttachmentReaderImplTest extends BrambleMockTestCase {
|
||||
byte[] expectedData = new byte[body.length - descriptorLength];
|
||||
arraycopy(body, descriptorLength, expectedData, 0, expectedData.length);
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(clientHelper).getMessage(message.getId());
|
||||
Transaction txn = new Transaction(null, true);
|
||||
|
||||
context.checking(new DbExpectations() {{
|
||||
oneOf(db).transactionWithResult(with(true), withDbCallable(txn));
|
||||
oneOf(clientHelper).getMessage(txn, message.getId());
|
||||
will(returnValue(message));
|
||||
oneOf(clientHelper).getMessageMetadataAsDictionary(message.getId());
|
||||
oneOf(clientHelper)
|
||||
.getMessageMetadataAsDictionary(txn, message.getId());
|
||||
will(returnValue(meta));
|
||||
}});
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package org.briarproject.briar.feed;
|
||||
import com.rometools.rome.feed.synd.SyndEntry;
|
||||
import com.rometools.rome.feed.synd.SyndEntryImpl;
|
||||
|
||||
import org.briarproject.bramble.api.WeakSingletonProvider;
|
||||
import org.briarproject.bramble.api.client.ClientHelper;
|
||||
import org.briarproject.bramble.api.client.ContactGroupFactory;
|
||||
import org.briarproject.bramble.api.data.BdfDictionary;
|
||||
@@ -71,7 +72,7 @@ public class FeedManagerImplTest extends BrambleMockTestCase {
|
||||
new WeakSingletonProvider<OkHttpClient>() {
|
||||
@Override
|
||||
@Nonnull
|
||||
OkHttpClient createInstance() {
|
||||
public OkHttpClient createInstance() {
|
||||
return client;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -709,6 +709,41 @@ public class GroupInvitationIntegrationTest
|
||||
assertTrue(deleteMessages0From1(emptySet()).allDeleted());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvitationAfterReAddingContacts() throws Exception {
|
||||
// sync invitation and response back
|
||||
sendInvitation(c0.getClock().currentTimeMillis(), null);
|
||||
sync0To1(1, true);
|
||||
groupInvitationManager1
|
||||
.respondToInvitation(contactId0From1, privateGroup, true);
|
||||
sync1To0(1, true);
|
||||
|
||||
// sync group join messages
|
||||
sync0To1(2, true); // + one invitation protocol join message
|
||||
sync1To0(1, true);
|
||||
|
||||
// inviting again is not possible
|
||||
assertFalse(groupInvitationManager0
|
||||
.isInvitationAllowed(contact1From0, privateGroup.getId()));
|
||||
|
||||
// contacts remove each other
|
||||
removeAllContacts();
|
||||
|
||||
// group gets dissolved for invitee automatically, but not creator
|
||||
assertFalse(groupManager0.isDissolved(privateGroup.getId()));
|
||||
assertTrue(groupManager1.isDissolved(privateGroup.getId()));
|
||||
|
||||
// contacts re-add each other
|
||||
addDefaultContacts();
|
||||
|
||||
// creator can still not invite again
|
||||
assertFalse(groupInvitationManager0
|
||||
.isInvitationAllowed(contact1From0, privateGroup.getId()));
|
||||
|
||||
// finally invitee can remove group without issues
|
||||
groupManager1.removePrivateGroup(privateGroup.getId());
|
||||
}
|
||||
|
||||
private Collection<ConversationMessageHeader> getMessages1From0()
|
||||
throws DbException {
|
||||
return db0.transactionWithResult(true, txn -> groupInvitationManager0
|
||||
|
||||
@@ -34,7 +34,7 @@ import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest
|
||||
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse;
|
||||
import org.jmock.AbstractExpectations;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Collection;
|
||||
@@ -45,6 +45,8 @@ import java.util.Map;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import static java.util.Arrays.asList;
|
||||
import static java.util.Collections.emptyList;
|
||||
import static java.util.Collections.singletonList;
|
||||
import static junit.framework.TestCase.fail;
|
||||
import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
|
||||
import static org.briarproject.bramble.api.sync.validation.IncomingMessageHook.DeliveryAction.ACCEPT_DO_NOT_SHARE;
|
||||
@@ -106,7 +108,9 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
private final ContactId contactId = contact.getId();
|
||||
private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
|
||||
private final Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
|
||||
private final Group privateGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
|
||||
private final Group group = getGroup(CLIENT_ID, MAJOR_VERSION);
|
||||
private final PrivateGroup privateGroup = new PrivateGroup(group,
|
||||
getRandomString(5), getAuthor(), getRandomBytes(32));
|
||||
private final BdfDictionary meta = BdfDictionary.of(new BdfEntry("m", "e"));
|
||||
private final Message message = getMessage(contactGroup.getId());
|
||||
private final BdfList body = BdfList.of("body");
|
||||
@@ -122,7 +126,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
|
||||
|
||||
public GroupInvitationManagerImplTest() {
|
||||
context.setImposteriser(ClassImposteriser.INSTANCE);
|
||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
||||
creatorEngine = context.mock(CreatorProtocolEngine.class);
|
||||
inviteeEngine = context.mock(InviteeProtocolEngine.class);
|
||||
peerEngine = context.mock(PeerProtocolEngine.class);
|
||||
@@ -160,9 +164,9 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
will(returnValue(false));
|
||||
oneOf(db).addGroup(txn, localGroup);
|
||||
oneOf(db).getContacts(txn);
|
||||
will(returnValue(Collections.singletonList(contact)));
|
||||
will(returnValue(singletonList(contact)));
|
||||
}});
|
||||
expectAddingContact(contact);
|
||||
expectAddingContact(contact, emptyList());
|
||||
groupInvitationManager.onDatabaseOpened(txn);
|
||||
}
|
||||
|
||||
@@ -178,7 +182,8 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
groupInvitationManager.onDatabaseOpened(txn);
|
||||
}
|
||||
|
||||
private void expectAddingContact(Contact c) throws Exception {
|
||||
private void expectAddingContact(Contact c, Collection<Group> groups)
|
||||
throws Exception {
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
|
||||
MAJOR_VERSION, c);
|
||||
@@ -193,12 +198,8 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
.setContactId(txn, contactGroup.getId(), contactId);
|
||||
oneOf(db).getGroups(txn, PrivateGroupManager.CLIENT_ID,
|
||||
PrivateGroupManager.MAJOR_VERSION);
|
||||
will(returnValue(Collections.singletonList(privateGroup)));
|
||||
oneOf(privateGroupManager).isMember(txn, privateGroup.getId(),
|
||||
c.getAuthor());
|
||||
will(returnValue(true));
|
||||
will(returnValue(groups));
|
||||
}});
|
||||
expectAddingMember(privateGroup.getId(), c);
|
||||
}
|
||||
|
||||
private void expectAddingMember(GroupId g, Contact c) throws Exception {
|
||||
@@ -252,13 +253,99 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
|
||||
@Test
|
||||
public void testAddingContact() throws Exception {
|
||||
expectAddingContact(contact);
|
||||
expectAddingContact(contact, singletonList(group));
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(privateGroupManager)
|
||||
.isMember(txn, privateGroup.getId(), contact.getAuthor());
|
||||
will(returnValue(true));
|
||||
oneOf(privateGroupManager)
|
||||
.getPrivateGroup(txn, privateGroup.getId());
|
||||
will(returnValue(privateGroup));
|
||||
oneOf(privateGroupManager).isOurPrivateGroup(txn, privateGroup);
|
||||
will(returnValue(false));
|
||||
}});
|
||||
// creates PEER session
|
||||
expectAddingMember(privateGroup.getId(), contact);
|
||||
|
||||
groupInvitationManager.addingContact(txn, contact);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemovingContact() throws Exception {
|
||||
public void testAddingContactWhoCreatedGroup() throws Exception {
|
||||
PrivateGroup privateGroup = new PrivateGroup(group,
|
||||
getRandomString(5), contact.getAuthor(), getRandomBytes(32));
|
||||
|
||||
expectAddingContact(contact, singletonList(group));
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(privateGroupManager)
|
||||
.isMember(txn, privateGroup.getId(), contact.getAuthor());
|
||||
will(returnValue(true));
|
||||
oneOf(privateGroupManager)
|
||||
.getPrivateGroup(txn, privateGroup.getId());
|
||||
will(returnValue(privateGroup));
|
||||
oneOf(privateGroupManager).isOurPrivateGroup(txn, privateGroup);
|
||||
will(returnValue(false));
|
||||
}});
|
||||
expectCreateStorageId();
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(sessionEncoder)
|
||||
.encodeSession(with(any(InviteeSession.class)));
|
||||
will(returnValue(meta));
|
||||
oneOf(clientHelper)
|
||||
.mergeMessageMetadata(txn, storageMessage.getId(), meta);
|
||||
}});
|
||||
|
||||
groupInvitationManager.addingContact(txn, contact);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemovingContactWithoutCommonGroups() throws Exception {
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(db).getGroups(txn, PrivateGroupManager.CLIENT_ID,
|
||||
PrivateGroupManager.MAJOR_VERSION);
|
||||
will(returnValue(emptyList()));
|
||||
oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
|
||||
MAJOR_VERSION, contact);
|
||||
will(returnValue(contactGroup));
|
||||
oneOf(db).removeGroup(txn, contactGroup);
|
||||
}});
|
||||
groupInvitationManager.removingContact(txn, contact);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemovingContactWithCommonGroups() throws Exception {
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(db).getGroups(txn, PrivateGroupManager.CLIENT_ID,
|
||||
PrivateGroupManager.MAJOR_VERSION);
|
||||
will(returnValue(singletonList(group)));
|
||||
oneOf(privateGroupManager).isMember(txn, group.getId(), author);
|
||||
will(returnValue(true));
|
||||
oneOf(privateGroupManager).getPrivateGroup(txn, group.getId());
|
||||
will(returnValue(privateGroup));
|
||||
oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
|
||||
MAJOR_VERSION, contact);
|
||||
will(returnValue(contactGroup));
|
||||
oneOf(db).removeGroup(txn, contactGroup);
|
||||
}});
|
||||
groupInvitationManager.removingContact(txn, contact);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemovingContactWhoIsCreatorOfCommonGroup()
|
||||
throws Exception {
|
||||
PrivateGroup privateGroup = new PrivateGroup(group,
|
||||
getRandomString(5), contact.getAuthor(), getRandomBytes(32));
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(db).getGroups(txn, PrivateGroupManager.CLIENT_ID,
|
||||
PrivateGroupManager.MAJOR_VERSION);
|
||||
will(returnValue(singletonList(group)));
|
||||
oneOf(privateGroupManager).isMember(txn, group.getId(), author);
|
||||
will(returnValue(true));
|
||||
oneOf(privateGroupManager).getPrivateGroup(txn, group.getId());
|
||||
will(returnValue(privateGroup));
|
||||
oneOf(privateGroupManager).markGroupDissolved(txn, group.getId());
|
||||
oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
|
||||
MAJOR_VERSION, contact);
|
||||
will(returnValue(contactGroup));
|
||||
@@ -355,8 +442,8 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
BdfDictionary bdfSession) throws Exception {
|
||||
expectParseMessageMetadata();
|
||||
expectGetSession(oneResult, sessionId, contactGroup.getId());
|
||||
Session<?> session =
|
||||
expectHandleMessage(role, messageMetadata, bdfSession, type);
|
||||
Session<?> session = expectHandleMessage(role, messageMetadata,
|
||||
bdfSession, type);
|
||||
expectStoreSession(session, storageMessage.getId());
|
||||
}
|
||||
|
||||
@@ -569,7 +656,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
|
||||
@Test
|
||||
public void testAcceptInvitationWithGroupId() throws Exception {
|
||||
PrivateGroup pg = new PrivateGroup(privateGroup,
|
||||
PrivateGroup pg = new PrivateGroup(group,
|
||||
getRandomString(MAX_GROUP_NAME_LENGTH), author,
|
||||
getRandomBytes(GROUP_SALT_LENGTH));
|
||||
|
||||
@@ -579,7 +666,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
|
||||
@Test
|
||||
public void testDeclineInvitationWithGroupId() throws Exception {
|
||||
PrivateGroup pg = new PrivateGroup(privateGroup,
|
||||
PrivateGroup pg = new PrivateGroup(group,
|
||||
getRandomString(MAX_GROUP_NAME_LENGTH), author,
|
||||
getRandomBytes(GROUP_SALT_LENGTH));
|
||||
|
||||
@@ -670,7 +757,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
privateGroup.getId(), time1, "name", author,
|
||||
new byte[0], null, new byte[0], NO_AUTO_DELETE_TIMER);
|
||||
PrivateGroup pg =
|
||||
new PrivateGroup(privateGroup, invite.getGroupName(),
|
||||
new PrivateGroup(group, invite.getGroupName(),
|
||||
invite.getCreator(), invite.getSalt());
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
@@ -738,7 +825,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
new InviteMessage(message2.getId(), contactGroup.getId(),
|
||||
privateGroup.getId(), time2, groupName, author, salt,
|
||||
null, getRandomBytes(5), NO_AUTO_DELETE_TIMER);
|
||||
PrivateGroup pg = new PrivateGroup(privateGroup, groupName,
|
||||
PrivateGroup pg = new PrivateGroup(group, groupName,
|
||||
author, salt);
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
@@ -747,7 +834,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
oneOf(db).startTransaction(true);
|
||||
will(returnValue(txn));
|
||||
oneOf(db).getContacts(txn);
|
||||
will(returnValue(Collections.singletonList(contact)));
|
||||
will(returnValue(singletonList(contact)));
|
||||
oneOf(contactGroupFactory).createContactGroup(CLIENT_ID,
|
||||
MAJOR_VERSION, contact);
|
||||
will(returnValue(contactGroup));
|
||||
@@ -839,7 +926,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
|
||||
expectAddingMember(privateGroup.getId(), contact);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(db).getContactsByAuthorId(txn, author.getId());
|
||||
will(returnValue(Collections.singletonList(contact)));
|
||||
will(returnValue(singletonList(contact)));
|
||||
}});
|
||||
groupInvitationManager.addingMember(txn, privateGroup.getId(), author);
|
||||
}
|
||||
|
||||
@@ -291,10 +291,10 @@ public abstract class BriarIntegrationTest<C extends BriarIntegrationTestCompone
|
||||
contactManager0.removeContact(contactId2From0);
|
||||
contactManager1.removeContact(contactId0From1);
|
||||
contactManager2.removeContact(contactId0From2);
|
||||
assertNotNull(contactId2From1);
|
||||
contactManager1.removeContact(contactId2From1);
|
||||
assertNotNull(contactId1From2);
|
||||
contactManager2.removeContact(contactId1From2);
|
||||
if (contactId2From1 != null)
|
||||
contactManager1.removeContact(contactId2From1);
|
||||
if (contactId1From2 != null)
|
||||
contactManager2.removeContact(contactId1From2);
|
||||
}
|
||||
|
||||
protected void setAutoDeleteTimer(BriarIntegrationTestComponent component,
|
||||
|
||||
@@ -23,7 +23,7 @@ dependencies {
|
||||
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32'
|
||||
implementation 'io.javalin:javalin:3.5.0'
|
||||
implementation 'org.slf4j:slf4j-simple:1.7.30'
|
||||
implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.2'
|
||||
implementation "com.fasterxml.jackson.core:jackson-databind:$jackson_version"
|
||||
implementation 'com.github.ajalt:clikt:2.2.0'
|
||||
|
||||
def daggerVersion = '2.24'
|
||||
|
||||
@@ -107,5 +107,8 @@ internal class HeadlessModule(private val appDir: File) {
|
||||
override fun shouldEnableImageAttachments() = false
|
||||
override fun shouldEnableProfilePictures() = false
|
||||
override fun shouldEnableDisappearingMessages() = false
|
||||
override fun shouldEnablePrivateGroupsInCore() = false
|
||||
override fun shouldEnableForumsInCore() = true
|
||||
override fun shouldEnableBlogsInCore() = true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
dependencyVerification {
|
||||
verify = [
|
||||
'com.fasterxml.jackson.core:jackson-annotations:2.12.2:jackson-annotations-2.12.2.jar:558561786c071af202e849b6ae3d39c87ed417ecc83d45e398c12eb3bffa557b',
|
||||
'com.fasterxml.jackson.core:jackson-core:2.12.2:jackson-core-2.12.2.jar:7883331763729b72735fdd8a117f32eb7d22695babfb37cc99df8392c196efc3',
|
||||
'com.fasterxml.jackson.core:jackson-databind:2.12.2:jackson-databind-2.12.2.jar:c4002f861d8d33f3202bf8effabb53acc320c5276cc50c1bfaae73c36ce8db32',
|
||||
'com.fasterxml.jackson.core:jackson-annotations:2.13.0:jackson-annotations-2.13.0.jar:81f9724d8843e8b08f8f6c0609e7a2b030d00c34861c4ac7e2099a7235047d6f',
|
||||
'com.fasterxml.jackson.core:jackson-core:2.13.0:jackson-core-2.13.0.jar:348bc59b348df2e807b356f1d62d2afb41a974073328abc773eb0932b855d2c8',
|
||||
'com.fasterxml.jackson.core:jackson-databind:2.13.0:jackson-databind-2.13.0.jar:9c826d27176268777adcf97e1c6e2051c7e33a7aaa2c370c2e8c6077fd9da3f4',
|
||||
'com.github.ajalt:clikt:2.2.0:clikt-2.2.0.jar:beb3136d06764ec8ce0810a8fd6c8b7b49d04287d1deef3a07c016e43a458d33',
|
||||
'com.github.gundy:semver4j:0.16.4:semver4j-0.16.4.jar:def9b4225fa37219e18f81d01f0e52d73dca1257a38f5475be9dd58f87736510',
|
||||
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
||||
|
||||
@@ -35,6 +35,9 @@ buildscript {
|
||||
}
|
||||
ext {
|
||||
dagger_version = "2.33"
|
||||
// okhttp 3.12.x is supported until end of 2021, newer versions need minSdk 21
|
||||
okhttp_version = "3.12.13"
|
||||
jackson_version = "2.13.0"
|
||||
tor_version = "0.3.5.17"
|
||||
obfs4proxy_version = "0.0.12-dev-40245c4a"
|
||||
junit_version = "4.13.2"
|
||||
|
||||
Reference in New Issue
Block a user