Compare commits

..

1 Commits

Author SHA1 Message Date
akwizgran
b4d0a221a3 Add executor with high and low priority queues. 2019-02-14 14:51:31 +00:00
101 changed files with 769 additions and 1637 deletions

View File

@@ -39,6 +39,31 @@
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<Objective-C-extensions>
<file>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
</file>
<class>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
</class>
<extensions>
<pair source="cpp" header="h" fileNamingConvention="NONE" />
<pair source="c" header="h" fileNamingConvention="NONE" />
</extensions>
</Objective-C-extensions>
<XML>
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
</XML>

View File

@@ -11,8 +11,8 @@ android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 26
versionCode 10106
versionName "1.1.6"
versionCode 10105
versionName "1.1.5"
consumerProguardFiles 'proguard-rules.txt'
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
@@ -30,8 +30,8 @@ configurations {
dependencies {
implementation project(path: ':bramble-core', configuration: 'default')
tor 'org.briarproject:tor-android:0.3.5.8@zip'
tor 'org.briarproject:obfs4proxy-android:0.0.9@zip'
tor 'org.briarproject:tor-android:0.3.4.8@zip'
tor 'org.briarproject:obfs4proxy-android:0.0.7@zip'
annotationProcessor 'com.google.dagger:dagger-compiler:2.19'

View File

@@ -12,15 +12,11 @@ import org.briarproject.bramble.api.identity.IdentityManager;
import org.briarproject.bramble.util.IoUtils;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import javax.inject.Inject;
import static android.os.Build.VERSION.SDK_INT;
class AndroidAccountManager extends AccountManagerImpl
implements AccountManager {
@@ -93,42 +89,20 @@ class AndroidAccountManager extends AccountManagerImpl
LOG.warning("Could not clear shared preferences");
}
// Delete files, except lib and shared_prefs directories
Set<File> files = new HashSet<>();
File dataDir = new File(appContext.getApplicationInfo().dataDir);
@Nullable
File[] fileArray = dataDir.listFiles();
if (fileArray == null) {
File[] children = dataDir.listFiles();
if (children == null) {
LOG.warning("Could not list files in app data dir");
} else {
for (File file : fileArray) {
String name = file.getName();
for (File child : children) {
String name = child.getName();
if (!name.equals("lib") && !name.equals("shared_prefs")) {
files.add(file);
IoUtils.deleteFileOrDir(child);
}
}
}
files.add(appContext.getFilesDir());
files.add(appContext.getCacheDir());
addIfNotNull(files, appContext.getExternalCacheDir());
if (SDK_INT >= 19) {
for (File file : appContext.getExternalCacheDirs()) {
addIfNotNull(files, file);
}
}
if (SDK_INT >= 21) {
for (File file : appContext.getExternalMediaDirs()) {
addIfNotNull(files, file);
}
}
for (File file : files) {
IoUtils.deleteFileOrDir(file);
}
// Recreate the cache dir as some OpenGL drivers expect it to exist
if (!new File(dataDir, "cache").mkdirs())
if (!new File(dataDir, "cache").mkdir())
LOG.warning("Could not recreate cache dir");
}
private void addIfNotNull(Set<File> files, @Nullable File file) {
if (file != null) files.add(file);
}
}

View File

@@ -112,8 +112,6 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
// Other directories should be deleted
File potatoDir = new File(testDir, ".potato");
File potatoFile = new File(potatoDir, "file");
File filesDir = new File(testDir, "filesDir");
File externalCacheDir = new File(testDir, "externalCacheDir");
context.checking(new Expectations() {{
oneOf(prefs).edit();
@@ -130,12 +128,6 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
will(returnValue(true));
oneOf(app).getApplicationInfo();
will(returnValue(applicationInfo));
oneOf(app).getFilesDir();
will(returnValue(filesDir));
oneOf(app).getCacheDir();
will(returnValue(cacheDir));
oneOf(app).getExternalCacheDir();
will(returnValue(externalCacheDir));
}});
assertTrue(dbDir.mkdirs());
@@ -148,8 +140,6 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
assertTrue(cacheFile.createNewFile());
assertTrue(potatoDir.mkdirs());
assertTrue(potatoFile.createNewFile());
assertTrue(filesDir.mkdirs());
assertTrue(externalCacheDir.mkdirs());
accountManager.deleteAccount();
@@ -163,8 +153,6 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
assertFalse(cacheFile.exists());
assertFalse(potatoDir.exists());
assertFalse(potatoFile.exists());
assertFalse(filesDir.exists());
assertFalse(externalCacheDir.exists());
}
@After

View File

@@ -1,45 +1,46 @@
dependencyVerification {
verify = [
'cglib:cglib:3.2.0:cglib-3.2.0.jar:adb13bab79712ad6bdf1bd59f2a3918018a8016e722e8a357065afb9e6690861',
'com.android.tools.analytics-library:protos:26.3.2:protos-26.3.2.jar:50238fb4298b297217b184b9cd93c14f83536fcee829eb0ca850bdb5b53251f0',
'com.android.tools.analytics-library:shared:26.3.2:shared-26.3.2.jar:ddd80dcf21905018b7c0583ba72b7282f446084d4952422609a09fbf8237ef71',
'com.android.tools.analytics-library:tracker:26.3.2:tracker-26.3.2.jar:28c575d2d1af003e96d7b375a668ee10b2673a2dd0f6438750aa8c3b42e7d0ad',
'com.android.tools.build:aapt2:3.3.2-5309881:aapt2-3.3.2-5309881-linux.jar:9beead7e8b1057359049f450538aadcd3eb2a5bc3fbdd5e3296cb8fdc2a22412',
'com.android.tools.build:apksig:3.3.2:apksig-3.3.2.jar:84c4aaa20127c6c1fe6bdd334b3f5df71f54ad080be9029c8a10f43b6a908acd',
'com.android.tools.build:apkzlib:3.3.2:apkzlib-3.3.2.jar:d34e523278e5dff565eba3ef3c089d515b2b5cc7b47dc77e2f3465e5e47176ac',
'com.android.tools.build:builder-model:3.3.2:builder-model-3.3.2.jar:055e3db0ecee9e06b9f024034999a29cd92cb1885207b37542126bd8bcc57f46',
'com.android.tools.build:builder-test-api:3.3.2:builder-test-api-3.3.2.jar:0b2e4cd7615bbcad14a3c91fe45ae26693508d06e40ba06c5968b8bc24416618',
'com.android.tools.build:builder:3.3.2:builder-3.3.2.jar:65649704da7aef0487235fd326f0f2e99ed5cf958e80f204496e6e08a42bd9f5',
'com.android.tools.build:gradle-api:3.3.2:gradle-api-3.3.2.jar:3cbd47e41bb70330dd72ec2c9fe51e6173554b484a03829b5a2de9e00841e040',
'com.android.tools.build:manifest-merger:26.3.2:manifest-merger-26.3.2.jar:05c4a6d8b02fb9f08744876477d0a68547c03a8a9069b1f086684fa04af97c33',
'com.android.tools.ddms:ddmlib:26.3.2:ddmlib-26.3.2.jar:d248da8a563d6e46d2c7ebbf371a4877e00510f4ca763c0bb272d5a281bf8b85',
'com.android.tools.external.com-intellij:intellij-core:26.3.2:intellij-core-26.3.2.jar:6c5ecc968230e9f4dcd0fef28885379feace1f0cd8130de6f61d649c86139bf3',
'com.android.tools.external.com-intellij:kotlin-compiler:26.3.2:kotlin-compiler-26.3.2.jar:1007d9b07ccb49cd8eaf30fda10ed4681d4714f2f9ab2ecda39b4e539cc51bbe',
'com.android.tools.external.org-jetbrains:uast:26.3.2:uast-26.3.2.jar:5d1833e562ea4f38a89708dfde695f0a162cbd39d003d3dde818c3fdc2b05317',
'com.android.tools.layoutlib:layoutlib-api:26.3.2:layoutlib-api-26.3.2.jar:d7e61e874ab95f5c350dd38b6a95b5c9dbe0083a02001884264cdb390cb255b8',
'com.android.tools.lint:lint-api:26.3.2:lint-api-26.3.2.jar:5867dfd7fb4a4e161a816a5d29d045f9b542d34594c00a1efec46fb4cd0e1033',
'com.android.tools.lint:lint-checks:26.3.2:lint-checks-26.3.2.jar:4b163b9c93790d2771e92ba8de58a0d9e0671ffcf2ccef3cf496efd442e27517',
'com.android.tools.lint:lint-gradle-api:26.3.2:lint-gradle-api-26.3.2.jar:54cb282e0c054f9bed3f51302ce08b003c8ab7961dfd5a4f6de26c23cc23062f',
'com.android.tools.lint:lint-gradle:26.3.2:lint-gradle-26.3.2.jar:bb139615f4ce97d42cc394b9389b49b76a6eb85be6785a5d272991543b519013',
'com.android.tools.lint:lint:26.3.2:lint-26.3.2.jar:ef7b369f8a56a92ccb0f4c1c357666b9339e4a711a9d84747d446441746cfe4e',
'com.android.tools:annotations:26.3.2:annotations-26.3.2.jar:5bcce8e98b6a2f5ccf13ebcefd8f734e0b35f8b19e456575665631442ce1f7a1',
'com.android.tools:common:26.3.2:common-26.3.2.jar:d9f8e7f0669e9a701568e3db6a87c89cf12d8fa6811c9991e969f950215ecfac',
'com.android.tools:dvlib:26.3.2:dvlib-26.3.2.jar:d84aad56161c7773579303d69714ded6897c64c6ddfd7d456e453231e4dfe811',
'com.android.tools:repository:26.3.2:repository-26.3.2.jar:da611eeb06e9ab8750d25b9e2901e10db8e5ec6304eb4c8b7103d39e0921ea40',
'com.android.tools:sdk-common:26.3.2:sdk-common-26.3.2.jar:82823a3bf25e64fac33a286490f0cf5ac50c2cdb3c540149b030896bb44bf96c',
'com.android.tools:sdklib:26.3.2:sdklib-26.3.2.jar:424d15492af67321900963238646d27495ab60de2a5b19e6a416963bc5d6932b',
'com.android.tools.analytics-library:protos:26.2.1:protos-26.2.1.jar:2f371f5b1f551e85ab08be4d6a2873471b3d44afd1ebf6aa3298f3b796bf691f',
'com.android.tools.analytics-library:shared:26.2.1:shared-26.2.1.jar:4c1e4e705fa4d45f23aaea230557f6508155012d9c296337787c1d7b26a97f5a',
'com.android.tools.analytics-library:tracker:26.2.1:tracker-26.2.1.jar:4a624ecc976539f755ddb0bb8dfc2dd3d08326cfec59a098dbd70f701ca7fb75',
'com.android.tools.build:aapt2:3.2.1-4818971:aapt2-3.2.1-4818971-linux.jar:f431b6f96c91a2c155144b091a9c97d9805c589fe8efc9c930b6cd346cb60a1e',
'com.android.tools.build:apksig:3.2.1:apksig-3.2.1.jar:2b46f2feffea66037aab29e4261b2433c190194a6ef97b958511eb157f2ccba5',
'com.android.tools.build:apkzlib:3.2.1:apkzlib-3.2.1.jar:c39ad0313905932431fe81c8899c2cf39a4d92ad6c4edcaa4b25432f461452aa',
'com.android.tools.build:builder-model:3.2.1:builder-model-3.2.1.jar:a9f68e6abcec122f9cb5ad352d3f05a3eb03acbcdca95e4d25c16310c2c965ff',
'com.android.tools.build:builder-test-api:3.2.1:builder-test-api-3.2.1.jar:533ac6c2b5884bb54967a33791f2628dfdfac7981af39417a333b43d4379b6be',
'com.android.tools.build:builder:3.2.1:builder-3.2.1.jar:aedcbfd115dbe91d09b4113e66ef50589b558d0aa3b2f133b1d867c9b87fae83',
'com.android.tools.build:gradle-api:3.2.1:gradle-api-3.2.1.jar:57cf0ac5ac1dca8afdb3f62b94265e776e7dcfa641cc3844fb53a05193de208d',
'com.android.tools.build:manifest-merger:26.2.1:manifest-merger-26.2.1.jar:8830573263361035d38cfdcb51e2db94029c93865b21334f5fbf8a27984281a6',
'com.android.tools.ddms:ddmlib:26.2.1:ddmlib-26.2.1.jar:a4bf0a29a19980bf27269465cc782064656750b77c26728f82f9e148b705218b',
'com.android.tools.external.com-intellij:intellij-core:26.2.1:intellij-core-26.2.1.jar:4925ad1892c2687cb1a63427d440ef519c8c59215fefe0dc5d541d5d411fcafe',
'com.android.tools.external.com-intellij:kotlin-compiler:26.2.1:kotlin-compiler-26.2.1.jar:daa064fd708f340ee25fb9823c4c74104ac77f1370b76d907eb9ae6daec0a2ae',
'com.android.tools.external.org-jetbrains:uast:26.2.1:uast-26.2.1.jar:f10f7258d2ab9189562cc0f9ad838c0378fdba439229173390a99de02ebac75b',
'com.android.tools.layoutlib:layoutlib-api:26.2.1:layoutlib-api-26.2.1.jar:ddbf4fca123733fa011595b1cc1f4ac2937ed327b60990711fafc33c775c2ade',
'com.android.tools.lint:lint-api:26.2.1:lint-api-26.2.1.jar:3b57e739de567b98bc9ab56c2c0ee66fc026b4adf5843e8f9804ca0666a6f66e',
'com.android.tools.lint:lint-checks:26.2.1:lint-checks-26.2.1.jar:c86f4cc9aaee722ee4ad70062f7b5af91e9b041914af27adc09f545ab0fb3bc6',
'com.android.tools.lint:lint-gradle-api:26.2.1:lint-gradle-api-26.2.1.jar:2283e7af32e301565f2a797e531f0fc8c648077d457afb3ffdddbee638976c2f',
'com.android.tools.lint:lint-gradle:26.2.1:lint-gradle-26.2.1.jar:8fd90b2f3ec788cbb9801c07ab3e1ea2255aa31a6093157d7ea0ff13d0315ecb',
'com.android.tools.lint:lint-kotlin:26.2.1:lint-kotlin-26.2.1.jar:7a6a5d2b18f69cf1b900d857c2632b4c683713c533295933b8b759f8cab4a877',
'com.android.tools.lint:lint:26.2.1:lint-26.2.1.jar:7848b82ae988b90dee259ae7c7e86e05cbf52db6cd21c8bbd38ce7df08f3f8c5',
'com.android.tools:annotations:26.2.1:annotations-26.2.1.jar:7391c6a1e080174b96e64ceb078dadd31ce4d8a2d2fee0ec65be202126f90f24',
'com.android.tools:common:26.2.1:common-26.2.1.jar:a50aab2d6411ff68f4004a87c7e93d87d8e980a0ec3b352246549897ea2d78e5',
'com.android.tools:dvlib:26.2.1:dvlib-26.2.1.jar:72a83bf2839b1df9b1fbf67ba45d1bfb9f966cd774da4320c762b2be8f1688aa',
'com.android.tools:repository:26.2.1:repository-26.2.1.jar:fa74dae09103faef703df38550ad8fa244c5b6d1bf90d6198be932292b3d9cc1',
'com.android.tools:sdk-common:26.2.1:sdk-common-26.2.1.jar:759d4b292ca69a35cf961fca377b54158fc6c88108978006999442e80a011cf4',
'com.android.tools:sdklib:26.2.1:sdklib-26.2.1.jar:248df7ad5eac4aeb6f96c394c76760de4b7b89ac056e54d0c21a739368b91b45',
'com.google.code.findbugs:jsr305:1.3.9:jsr305-1.3.9.jar:905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed',
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
'com.google.code.gson:gson:2.8.0:gson-2.8.0.jar:c6221763bd79c4f1c3dc7f750b5f29a0bb38b367b81314c4f71896e340c40825',
'com.google.dagger:dagger-compiler:2.19:dagger-compiler-2.19.jar:27a4b202a2de908182edb261f8c0a264e08e5e4733d7514bc7fbf0d31da5c0fc',
'com.google.dagger:dagger-producers:2.19:dagger-producers-2.19.jar:a17663abe0fc38b676026950907d4c5f5e2bf338375415861eaff6e3bdb0b768',
'com.google.dagger:dagger-spi:2.19:dagger-spi-2.19.jar:e7a6379d82c841f6aac2866948ad1eed716528707814602842a8d844ce04e2e1',
'com.google.dagger:dagger:2.19:dagger-2.19.jar:514b6f1e0727c6572e1d65cb27e4ae668b7aeaeb93a29515182965265b609939',
'com.google.errorprone:error_prone_annotations:2.0.18:error_prone_annotations-2.0.18.jar:cb4cfad870bf563a07199f3ebea5763f0dec440fcda0b318640b1feaa788656b',
'com.google.errorprone:error_prone_annotations:2.1.3:error_prone_annotations-2.1.3.jar:03d0329547c13da9e17c634d1049ea2ead093925e290567e1a364fd6b1fc7ff8',
'com.google.errorprone:javac-shaded:9-dev-r4023-3:javac-shaded-9-dev-r4023-3.jar:65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30',
'com.google.googlejavaformat:google-java-format:1.5:google-java-format-1.5.jar:aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e',
'com.google.guava:guava:23.0:guava-23.0.jar:7baa80df284117e5b945b19b98d367a85ea7b7801bd358ff657946c3bd1b6596',
'com.google.guava:guava:25.0-jre:guava-25.0-jre.jar:3fd4341776428c7e0e5c18a7c10de129475b69ab9d30aeafbb5c277bb6074fa9',
'com.google.guava:guava:26.0-jre:guava-26.0-jre.jar:a0e9cabad665bc20bcd2b01f108e5fc03f756e13aea80abaadb9f407033bea2c',
'com.google.j2objc:j2objc-annotations:1.1:j2objc-annotations-1.1.jar:40ceb7157feb263949e0f503fe5f71689333a621021aa20ce0d0acee3badaa0f',
'com.google.jimfs:jimfs:1.1:jimfs-1.1.jar:c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd',
'com.google.protobuf:protobuf-java:3.4.0:protobuf-java-3.4.0.jar:dce7e66b32456a1b1198da0caff3a8acb71548658391e798c79369241e6490a4',
@@ -67,22 +68,21 @@ dependencyVerification {
'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8',
'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.briarproject:obfs4proxy-android:0.0.9:obfs4proxy-android-0.0.9.zip:9b7e9181535ea8d8bbe8ae6338e08cf4c5fc1e357a779393e0ce49586d459ae0',
'org.briarproject:tor-android:0.3.5.8:tor-android-0.3.5.8.zip:42a13a6f185be1a62f42e3f30ce66a3c099ac5ec890a65e7593111b65b44a54a',
'org.briarproject:obfs4proxy-android:0.0.7:obfs4proxy-android-0.0.7.zip:abdfb5d889d848de9bf214f9276abbf454808a505b870819eccc9a9e985bf617',
'org.briarproject:tor-android:0.3.4.8:tor-android-0.3.4.8.zip:989a0352d9d8d8172cd6c2137654e165e5d2beb10ed1211bab3814e224ad1926',
'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.codehaus.groovy:groovy-all:2.4.15:groovy-all-2.4.15.jar:51d6c4e71782e85674239189499854359d380fb75e1a703756e3aaa5b98a5af0',
'org.codehaus.groovy:groovy-all:2.4.12:groovy-all-2.4.12.jar:6a56af4bd48903d56bec62821876cadefafd007360cc6bd0d8f7aa8d72b38be4',
'org.codehaus.mojo:animal-sniffer-annotations:1.14:animal-sniffer-annotations-1.14.jar:2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d',
'org.glassfish.jaxb:jaxb-core:2.2.11:jaxb-core-2.2.11.jar:37bcaee8ebb04362c8352a5bf6221b86967ecdab5164c696b10b9a2bb587b2aa',
'org.glassfish.jaxb:jaxb-runtime:2.2.11:jaxb-runtime-2.2.11.jar:a874f2351cfba8e2946be3002d10c18a6da8f21b52ba2acf52f2b85d5520ed70',
'org.glassfish.jaxb:txw2:2.2.11:txw2-2.2.11.jar:272a3ccad45a4511351920cd2a8633c53cab8d5220c7a92954da5526bb5eafea',
'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9',
'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c',
'org.jetbrains.kotlin:kotlin-reflect:1.3.21:kotlin-reflect-1.3.21.jar:a3065c822633191e0a3e3ee12a29bec234fc4b2864a6bb87ef48cce3e9e0c26a',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.21:kotlin-stdlib-common-1.3.21.jar:cea61f7b611895e64f58569a9757fc0ab0d582f107211e1930e0ce2a0add52a7',
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21:kotlin-stdlib-jdk7-1.3.21.jar:a87875604fd42140da6938ae4d35ee61081f4482536efc6d2615b8b626a198af',
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.21:kotlin-stdlib-jdk8-1.3.21.jar:5823ed66ac122a1c55442ebca5a209a843ccd87f562edc31a787f3d2e47f74d4',
'org.jetbrains.kotlin:kotlin-stdlib:1.3.21:kotlin-stdlib-1.3.21.jar:38ba2370d9f06f50433e06b2ca775b94473c2e2785f410926079ab793c72b034',
'org.jetbrains.kotlin:kotlin-reflect:1.2.0:kotlin-reflect-1.2.0.jar:4f48a872bad6e4d9c053f4ad610d11e4012ad7e58dc19a03dd5eb811f36069dd',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.2.71:kotlin-stdlib-common-1.2.71.jar:63999687ff2fce8a592dd180ffbbf8f1d21c26b4044c55cdc74ff3cf3b3cf328',
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.71:kotlin-stdlib-jdk7-1.2.71.jar:b136bd61b240e07d4d92ce00d3bd1dbf584400a7bf5f220c2f3cd22446858082',
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.71:kotlin-stdlib-jdk8-1.2.71.jar:ac3c8abf47790b64b4f7e2509a53f0c145e061ac1612a597520535d199946ea9',
'org.jetbrains.kotlin:kotlin-stdlib:1.2.71:kotlin-stdlib-1.2.71.jar:4c895c270b87f5fec2a2796e1d89c15407ee821de961527c28588bb46afbc68b',
'org.jetbrains.trove4j:trove4j:20160824:trove4j-20160824.jar:1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7',
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c',

View File

@@ -0,0 +1,20 @@
package org.briarproject.bramble.api.contact;
import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@NotNullByDefault
public interface ContactExchangeListener {
void contactExchangeSucceeded(Author remoteAuthor);
/**
* The exchange failed because the contact already exists.
*/
void duplicateContact(Author remoteAuthor);
/**
* A general failure.
*/
void contactExchangeFailed();
}

View File

@@ -41,7 +41,8 @@ public interface ContactExchangeTask {
/**
* Exchanges contact information with a remote peer.
*/
void startExchange(LocalAuthor localAuthor, SecretKey masterSecret,
void startExchange(ContactExchangeListener listener,
LocalAuthor localAuthor, SecretKey masterSecret,
DuplexTransportConnection conn, TransportId transportId,
boolean alice);
}

View File

@@ -1,32 +0,0 @@
package org.briarproject.bramble.api.contact.event;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.Nullable;
@NotNullByDefault
public class ContactExchangeFailedEvent extends Event {
@Nullable
private final Author duplicateRemoteAuthor;
public ContactExchangeFailedEvent(@Nullable Author duplicateRemoteAuthor) {
this.duplicateRemoteAuthor = duplicateRemoteAuthor;
}
public ContactExchangeFailedEvent() {
this(null);
}
@Nullable
public Author getDuplicateRemoteAuthor() {
return duplicateRemoteAuthor;
}
public boolean wasDuplicateContact() {
return duplicateRemoteAuthor != null;
}
}

View File

@@ -1,20 +0,0 @@
package org.briarproject.bramble.api.contact.event;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@NotNullByDefault
public class ContactExchangeSucceededEvent extends Event {
private final Author remoteAuthor;
public ContactExchangeSucceededEvent(Author remoteAuthor) {
this.remoteAuthor = remoteAuthor;
}
public Author getRemoteAuthor() {
return remoteAuthor;
}
}

View File

@@ -0,0 +1,67 @@
package org.briarproject.bramble;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.Executor;
import javax.annotation.concurrent.GuardedBy;
@NotNullByDefault
public class PriorityExecutor {
private final Object lock = new Object();
private final Executor delegate, high, low;
@GuardedBy("lock")
private final Queue<Runnable> highQueue = new LinkedList<>();
@GuardedBy("lock")
private final Queue<Runnable> lowQueue = new LinkedList<>();
@GuardedBy("lock")
private boolean isTaskRunning = false;
public PriorityExecutor(Executor delegate) {
this.delegate = delegate;
high = r -> submit(r, true);
low = r -> submit(r, false);
}
public Executor getHighPriorityExecutor() {
return high;
}
public Executor getLowPriorityExecutor() {
return low;
}
private void submit(Runnable r, boolean isHighPriority) {
Runnable wrapped = () -> {
try {
r.run();
} finally {
scheduleNext();
}
};
synchronized (lock) {
if (!isTaskRunning && highQueue.isEmpty() &&
(isHighPriority || lowQueue.isEmpty())) {
isTaskRunning = true;
delegate.execute(wrapped);
} else if (isHighPriority) {
highQueue.add(wrapped);
} else {
lowQueue.add(wrapped);
}
}
}
private void scheduleNext() {
synchronized (lock) {
Runnable next = highQueue.poll();
if (next == null) next = lowQueue.poll();
if (next == null) isTaskRunning = false;
else delegate.execute(next);
}
}
}

View File

@@ -2,11 +2,10 @@ package org.briarproject.bramble.contact;
import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.client.ClientHelper;
import org.briarproject.bramble.api.contact.ContactExchangeListener;
import org.briarproject.bramble.api.contact.ContactExchangeTask;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.contact.ContactManager;
import org.briarproject.bramble.api.contact.event.ContactExchangeFailedEvent;
import org.briarproject.bramble.api.contact.event.ContactExchangeSucceededEvent;
import org.briarproject.bramble.api.crypto.CryptoComponent;
import org.briarproject.bramble.api.crypto.SecretKey;
import org.briarproject.bramble.api.data.BdfDictionary;
@@ -14,7 +13,6 @@ import org.briarproject.bramble.api.data.BdfList;
import org.briarproject.bramble.api.db.ContactExistsException;
import org.briarproject.bramble.api.db.DatabaseComponent;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.identity.LocalAuthor;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
@@ -65,7 +63,6 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
private final ClientHelper clientHelper;
private final RecordReaderFactory recordReaderFactory;
private final RecordWriterFactory recordWriterFactory;
private final EventBus eventBus;
private final Clock clock;
private final ConnectionManager connectionManager;
private final ContactManager contactManager;
@@ -74,6 +71,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
private final StreamReaderFactory streamReaderFactory;
private final StreamWriterFactory streamWriterFactory;
private volatile ContactExchangeListener listener;
private volatile LocalAuthor localAuthor;
private volatile DuplexTransportConnection conn;
private volatile TransportId transportId;
@@ -83,9 +81,8 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
@Inject
ContactExchangeTaskImpl(DatabaseComponent db, ClientHelper clientHelper,
RecordReaderFactory recordReaderFactory,
RecordWriterFactory recordWriterFactory, EventBus eventBus,
Clock clock, ConnectionManager connectionManager,
ContactManager contactManager,
RecordWriterFactory recordWriterFactory, Clock clock,
ConnectionManager connectionManager, ContactManager contactManager,
TransportPropertyManager transportPropertyManager,
CryptoComponent crypto, StreamReaderFactory streamReaderFactory,
StreamWriterFactory streamWriterFactory) {
@@ -93,7 +90,6 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
this.clientHelper = clientHelper;
this.recordReaderFactory = recordReaderFactory;
this.recordWriterFactory = recordWriterFactory;
this.eventBus = eventBus;
this.clock = clock;
this.connectionManager = connectionManager;
this.contactManager = contactManager;
@@ -104,9 +100,11 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
}
@Override
public void startExchange(LocalAuthor localAuthor, SecretKey masterSecret,
public void startExchange(ContactExchangeListener listener,
LocalAuthor localAuthor, SecretKey masterSecret,
DuplexTransportConnection conn, TransportId transportId,
boolean alice) {
this.listener = listener;
this.localAuthor = localAuthor;
this.conn = conn;
this.transportId = transportId;
@@ -125,8 +123,8 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
out = conn.getWriter().getOutputStream();
} catch (IOException e) {
logException(LOG, WARNING, e);
listener.contactExchangeFailed();
tryToClose(conn);
eventBus.broadcast(new ContactExchangeFailedEvent());
return;
}
@@ -136,7 +134,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
localProperties = transportPropertyManager.getLocalProperties();
} catch (DbException e) {
logException(LOG, WARNING, e);
eventBus.broadcast(new ContactExchangeFailedEvent());
listener.contactExchangeFailed();
tryToClose(conn);
return;
}
@@ -198,7 +196,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
}
} catch (IOException e) {
logException(LOG, WARNING, e);
eventBus.broadcast(new ContactExchangeFailedEvent());
listener.contactExchangeFailed();
tryToClose(conn);
return;
}
@@ -206,7 +204,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
// Verify the contact's signature
if (!verify(remoteInfo.author, remoteNonce, remoteInfo.signature)) {
LOG.warning("Invalid signature");
eventBus.broadcast(new ContactExchangeFailedEvent());
listener.contactExchangeFailed();
tryToClose(conn);
return;
}
@@ -223,17 +221,15 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
conn);
// Pseudonym exchange succeeded
LOG.info("Pseudonym exchange succeeded");
eventBus.broadcast(
new ContactExchangeSucceededEvent(remoteInfo.author));
listener.contactExchangeSucceeded(remoteInfo.author);
} catch (ContactExistsException e) {
logException(LOG, WARNING, e);
tryToClose(conn);
eventBus.broadcast(
new ContactExchangeFailedEvent(remoteInfo.author));
listener.duplicateContact(remoteInfo.author);
} catch (DbException e) {
logException(LOG, WARNING, e);
tryToClose(conn);
eventBus.broadcast(new ContactExchangeFailedEvent());
listener.contactExchangeFailed();
}
}

View File

@@ -17,24 +17,16 @@ public interface CircumventionProvider {
String[] BLOCKED = {"CN", "IR", "EG", "BY", "TR", "SY", "VE"};
/**
* Countries where obfs4 bridge connection are likely to work.
* Countries where vanilla bridge connection are likely to work.
* Should be a subset of {@link #BLOCKED}.
*/
String[] BRIDGES = { "CN", "IR", "EG", "BY", "TR", "SY", "VE" };
/**
* Countries where obfs4 bridges won't work and meek is needed.
* Should be a subset of {@link #BRIDGES}.
*/
String[] NEEDS_MEEK = {"CN", "IR"};
String[] BRIDGES = { "EG", "BY", "TR", "SY", "VE" };
boolean isTorProbablyBlocked(String countryCode);
boolean doBridgesWork(String countryCode);
boolean needsMeek(String countryCode);
@IoExecutor
List<String> getBridges(boolean meek);
List<String> getBridges();
}

View File

@@ -22,8 +22,6 @@ class CircumventionProviderImpl implements CircumventionProvider {
new HashSet<>(asList(BLOCKED));
private static final Set<String> BRIDGES_WORK_IN_COUNTRIES =
new HashSet<>(asList(BRIDGES));
private static final Set<String> BRIDGES_NEED_MEEK =
new HashSet<>(asList(NEEDS_MEEK));
@Nullable
private volatile List<String> bridges = null;
@@ -42,14 +40,9 @@ class CircumventionProviderImpl implements CircumventionProvider {
return BRIDGES_WORK_IN_COUNTRIES.contains(countryCode);
}
@Override
public boolean needsMeek(String countryCode) {
return BRIDGES_NEED_MEEK.contains(countryCode);
}
@Override
@IoExecutor
public List<String> getBridges(boolean useMeek) {
public List<String> getBridges() {
List<String> bridges = this.bridges;
if (bridges != null) return new ArrayList<>(bridges);
@@ -60,8 +53,6 @@ class CircumventionProviderImpl implements CircumventionProvider {
bridges = new ArrayList<>();
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
boolean isMeekBridge = line.startsWith("Bridge meek");
if (useMeek && !isMeekBridge || !useMeek && isMeekBridge) continue;
if (!line.startsWith("#")) bridges.add(line);
}
scanner.close();

View File

@@ -470,19 +470,13 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
if (!enable) callback.transportDisabled();
}
private void enableBridges(boolean enable, boolean needsMeek)
throws IOException {
private void enableBridges(boolean enable) throws IOException {
if (enable) {
Collection<String> conf = new ArrayList<>();
conf.add("UseBridges 1");
if (needsMeek) {
conf.add("ClientTransportPlugin meek_lite exec " +
obfs4File.getAbsolutePath());
} else {
conf.add("ClientTransportPlugin obfs4 exec " +
obfs4File.getAbsolutePath());
}
conf.addAll(circumventionProvider.getBridges(needsMeek));
conf.add("ClientTransportPlugin obfs4 exec " +
obfs4File.getAbsolutePath());
conf.addAll(circumventionProvider.getBridges());
controlConnection.setConf(conf);
} else {
controlConnection.setConf("UseBridges", "0");
@@ -722,17 +716,12 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
enableNetwork(false);
} else if (network == PREF_TOR_NETWORK_WITH_BRIDGES ||
(automatic && bridgesWork)) {
if (circumventionProvider.needsMeek(country)) {
LOG.info("Enabling network, using meek bridges");
enableBridges(true, true);
} else {
LOG.info("Enabling network, using obfs4 bridges");
enableBridges(true, false);
}
LOG.info("Enabling network, using bridges");
enableBridges(true);
enableNetwork(true);
} else {
LOG.info("Enabling network, not using bridges");
enableBridges(false, false);
enableBridges(false);
enableNetwork(true);
}
if (online && wifi && charging) {

View File

@@ -1,5 +1,4 @@
Bridge obfs4 78.46.188.239:37356 5A2D2F4158D0453E00C7C176978D3F41D69C45DB cert=3c0SwxpOisbohNxEc4tb875RVW8eOu1opRTVXJhafaKA/PNNtI7ElQIVOVZg1AdL5bxGCw iat-mode=0
Bridge obfs4 52.15.78.72:9443 02069A3C5362476936B62BA6F5ACC41ABD573A9B cert=ijYG/OKc7kqu2YzKNFfeXN7/BG2BOgfEP2KyYEiGDQthnHbsOiTWHeIG0WJVW+BckzDgKw iat-mode=0
Bridge obfs4 13.58.29.242:9443 0C58939A77DA6B6B29D4B5236A75865659607AE0 cert=OylWIEHb/ezpq1zWxW0sgKRn+9ARH2eOcQOZ8/Gew+4l+oKOhQ2jUX/Y+FSl61JorXZUWA iat-mode=0
Bridge obfs4 45.33.37.112:9443 60A609BB4ABE8D46E634AE81ED29ADAB7776B399 cert=t5v19WmNv5Sc2YPNr8RQids365W7MY8zJwQVkOxBjUMFomMWARDzsbYpcWLLcw0J9Gm+BQ iat-mode=0
Bridge meek_lite 0.0.2.0:2 97700DFE9F483596DDA6264C4D7DF7641E1E39CE url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com
Bridge obfs4 45.33.37.112:9443 60A609BB4ABE8D46E634AE81ED29ADAB7776B399 cert=t5v19WmNv5Sc2YPNr8RQids365W7MY8zJwQVkOxBjUMFomMWARDzsbYpcWLLcw0J9Gm+BQ iat-mode=0

View File

@@ -0,0 +1,86 @@
package org.briarproject.bramble;
import org.briarproject.bramble.test.BrambleTestCase;
import org.junit.Test;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import static java.util.Arrays.asList;
import static java.util.concurrent.Executors.newSingleThreadExecutor;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class PriorityExecutorTest extends BrambleTestCase {
@Test
public void testHighPriorityTasksAreDelegatedInOrderOfSubmission()
throws Exception {
Executor delegate = newSingleThreadExecutor();
PriorityExecutor priority = new PriorityExecutor(delegate);
Executor high = priority.getHighPriorityExecutor();
testTasksAreDelegatedInOrderOfSubmission(high);
}
@Test
public void testLowPriorityTasksAreDelegatedInOrderOfSubmission()
throws Exception {
Executor delegate = newSingleThreadExecutor();
PriorityExecutor priority = new PriorityExecutor(delegate);
Executor low = priority.getLowPriorityExecutor();
testTasksAreDelegatedInOrderOfSubmission(low);
}
@Test
public void testHighPriorityTasksAreRunFirst() throws Exception {
Executor delegate = newSingleThreadExecutor();
PriorityExecutor priority = new PriorityExecutor(delegate);
Executor high = priority.getHighPriorityExecutor();
Executor low = priority.getLowPriorityExecutor();
// Submit a task that will block, causing other tasks to be queued
CountDownLatch cork = new CountDownLatch(1);
low.execute(() -> {
try {
cork.await();
} catch (InterruptedException e) {
fail();
}
});
// Submit alternating tasks to the high and low priority executors
List<Integer> results = new Vector<>();
CountDownLatch tasksFinished = new CountDownLatch(10);
for (int i = 0; i < 10; i++) {
int result = i;
Runnable task = () -> {
results.add(result);
tasksFinished.countDown();
};
if (i % 2 == 0) high.execute(task);
else low.execute(task);
}
// Release the cork and wait for all tasks to finish
cork.countDown();
tasksFinished.await();
// The high-priority tasks should have run before the low-priority tasks
assertEquals(asList(0, 2, 4, 6, 8, 1, 3, 5, 7, 9), results);
}
private void testTasksAreDelegatedInOrderOfSubmission(Executor e)
throws Exception {
List<Integer> results = new Vector<>();
CountDownLatch tasksFinished = new CountDownLatch(10);
for (int i = 0; i < 10; i++) {
int result = i;
e.execute(() -> {
results.add(result);
tasksFinished.countDown();
});
}
// Wait for all the tasks to finish
tasksFinished.await();
// The tasks should have run in the order they were submitted
assertEquals(asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), results);
}
}

View File

@@ -16,7 +16,7 @@ dependencies {
implementation fileTree(dir: 'libs', include: '*.jar')
implementation 'net.java.dev.jna:jna:4.5.2'
implementation 'net.java.dev.jna:jna-platform:4.5.2'
tor 'org.briarproject:tor:0.3.5.8@zip'
tor 'org.briarproject:tor:0.3.4.8@zip'
tor 'org.briarproject:obfs4proxy:0.0.7@zip'
annotationProcessor 'com.google.dagger:dagger-compiler:2.19'

View File

@@ -44,7 +44,7 @@ public class BridgeTest extends BrambleTestCase {
public static Iterable<String> data() {
BrambleJavaIntegrationTestComponent component =
DaggerBrambleJavaIntegrationTestComponent.builder().build();
return component.getCircumventionProvider().getBridges(false);
return component.getCircumventionProvider().getBridges();
}
private final static long TIMEOUT = SECONDS.toMillis(30);
@@ -104,12 +104,7 @@ public class BridgeTest extends BrambleTestCase {
}
@Override
public boolean needsMeek(String countryCode) {
return false;
}
@Override
public List<String> getBridges(boolean useMeek) {
public List<String> getBridges() {
return singletonList(bridge);
}
};

View File

@@ -21,7 +21,7 @@ dependencyVerification {
'org.apache.ant:ant:1.9.4:ant-1.9.4.jar:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8',
'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8',
'org.briarproject:obfs4proxy:0.0.7:obfs4proxy-0.0.7.zip:5b2f693262ce43a7e130f7cc7d5d1617925330640a2eb6d71085e95df8ee0642',
'org.briarproject:tor:0.3.5.8:tor-0.3.5.8.zip:96e83391f01984f28669235fc02fbb0243140a2b3b2c73aeffd0042c8d3ced18',
'org.briarproject:tor:0.3.4.8:tor-0.3.4.8.zip:bc0158c34002f471a4fe14a6a481816c918eb520a220bb027f64be902beb757f',
'org.checkerframework:checker-compat-qual:2.5.3:checker-compat-qual-2.5.3.jar:d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d',
'org.codehaus.mojo:animal-sniffer-annotations:1.14:animal-sniffer-annotations-1.14.jar:2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d',
'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9',

View File

@@ -22,8 +22,8 @@ android {
defaultConfig {
minSdkVersion 15
targetSdkVersion 26
versionCode 10106
versionName "1.1.6"
versionCode 10105
versionName "1.1.5"
applicationId "org.briarproject.briar.android"
buildConfigField "String", "GitHash",
"\"${getStdout(['git', 'rev-parse', '--short=7', 'HEAD'], 'No commit hash')}\""

View File

@@ -22,7 +22,6 @@
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC" />
<uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE" />
<application
android:name="org.briarproject.briar.android.BriarApplicationImpl"

View File

@@ -231,7 +231,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
showForumPostNotification(f.getGroupId());
} else if (e instanceof BlogPostAddedEvent) {
BlogPostAddedEvent b = (BlogPostAddedEvent) e;
if (!b.isLocal()) showBlogPostNotification(b.getGroupId());
showBlogPostNotification(b.getGroupId());
} else if (e instanceof IntroductionSucceededEvent) {
showIntroductionNotification();
}

View File

@@ -185,15 +185,13 @@ public abstract class BriarActivity extends BaseActivity {
b.show();
}
protected void signOut(boolean removeFromRecentApps,
boolean deleteAccount) {
protected void signOut(boolean removeFromRecentApps) {
if (briarController.accountSignedIn()) {
// Don't use UiResultHandler because we want the result even if
// this activity has been destroyed
briarController.signOut(result -> runOnUiThread(
() -> exit(removeFromRecentApps)), deleteAccount);
() -> exit(removeFromRecentApps)));
} else {
if (deleteAccount) briarController.deleteAccount();
exit(removeFromRecentApps);
}
}

View File

@@ -3,14 +3,12 @@ package org.briarproject.briar.android.blog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.annotation.UiThread;
import android.support.design.widget.Snackbar;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView.LayoutManager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -64,12 +62,9 @@ public class BlogFragment extends BaseFragment
BlogController blogController;
@Inject
SharingController sharingController;
@Nullable
private Parcelable layoutManagerState;
private GroupId groupId;
private BlogPostAdapter adapter;
private LayoutManager layoutManager;
private BriarRecyclerView list;
private MenuItem writeButton, deleteButton;
private boolean isMyBlog = false, canDeleteBlog = false;
@@ -106,17 +101,11 @@ public class BlogFragment extends BaseFragment
adapter = new BlogPostAdapter(requireNonNull(getActivity()), this,
getFragmentManager());
list = v.findViewById(R.id.postList);
layoutManager = new LinearLayoutManager(getActivity());
list.setLayoutManager(layoutManager);
list.setLayoutManager(new LinearLayoutManager(getActivity()));
list.setAdapter(adapter);
list.showProgressBar();
list.setEmptyText(getString(R.string.blogs_other_blog_empty_state));
if (savedInstanceState != null) {
layoutManagerState =
savedInstanceState.getParcelable("layoutManager");
}
return v;
}
@@ -137,15 +126,6 @@ public class BlogFragment extends BaseFragment
list.stopPeriodicUpdate();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (layoutManager != null) {
layoutManagerState = layoutManager.onSaveInstanceState();
outState.putParcelable("layoutManager", layoutManagerState);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.blogs_blog_actions, menu);
@@ -258,12 +238,7 @@ public class BlogFragment extends BaseFragment
list.showData();
} else {
adapter.addAll(posts);
if (reload || layoutManagerState == null) {
list.scrollToPosition(0);
} else {
layoutManager.onRestoreInstanceState(
layoutManagerState);
}
if (reload) list.scrollToPosition(0);
}
}

View File

@@ -2,7 +2,6 @@ package org.briarproject.briar.android.blog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.annotation.UiThread;
import android.support.design.widget.Snackbar;
import android.support.v4.content.ContextCompat;
@@ -55,10 +54,7 @@ public class FeedFragment extends BaseFragment implements
private BlogPostAdapter adapter;
private LinearLayoutManager layoutManager;
private BriarRecyclerView list;
@Nullable
private Blog personalBlog;
@Nullable
private Parcelable layoutManagerState;
private Blog personalBlog = null;
public static FeedFragment newInstance() {
FeedFragment f = new FeedFragment();
@@ -95,11 +91,6 @@ public class FeedFragment extends BaseFragment implements
list.setEmptyText(R.string.blogs_feed_empty_state);
list.setEmptyAction(R.string.blogs_feed_empty_state_action);
if (savedInstanceState != null) {
layoutManagerState =
savedInstanceState.getParcelable("layoutManager");
}
return v;
}
@@ -132,15 +123,6 @@ public class FeedFragment extends BaseFragment implements
// TODO save list position in database/preferences?
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (layoutManager != null) {
layoutManagerState = layoutManager.onSaveInstanceState();
outState.putParcelable("layoutManager", layoutManagerState);
}
}
private void loadPersonalBlog() {
feedController.loadPersonalBlog(
new UiResultExceptionHandler<Blog, DbException>(this) {
@@ -168,12 +150,6 @@ public class FeedFragment extends BaseFragment implements
if (clear) adapter.setItems(posts);
else adapter.addAll(posts);
if (posts.isEmpty()) list.showData();
if (layoutManagerState == null) {
list.scrollToPosition(0); // Scroll to the top
} else {
layoutManager.onRestoreInstanceState(
layoutManagerState);
}
} else {
LOG.info("Concurrent update, reloading");
loadBlogPosts(clear);

View File

@@ -29,7 +29,6 @@ import javax.inject.Inject;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
import static java.util.logging.Level.WARNING;
import static org.briarproject.bramble.util.LogUtils.logException;
@@ -73,15 +72,6 @@ public class RssFeedImportActivity extends BriarActivity {
enableOrDisableImportButton();
}
});
urlInput.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == IME_ACTION_DONE && importButton.isEnabled() &&
importButton.getVisibility() == VISIBLE) {
publish();
hideSoftKeyboard(urlInput);
return true;
}
return false;
});
importButton = findViewById(R.id.importButton);
importButton.setOnClickListener(v -> publish());

View File

@@ -38,7 +38,7 @@ public abstract class BaseContactListAdapter<I extends ContactItem, VH extends C
@Override
public boolean areItemsTheSame(I c1, I c2) {
return c1.getContact().equals(c2.getContact());
return c1.getContact().getId().equals(c2.getContact().getId());
}
@Override
@@ -47,7 +47,8 @@ public abstract class BaseContactListAdapter<I extends ContactItem, VH extends C
}
int findItemPosition(ContactId c) {
for (int i = 0; i < getItemCount(); i++) {
int count = getItemCount();
for (int i = 0; i < count; i++) {
I item = getItemAt(i);
if (item != null && item.getContact().getId().equals(c))
return i;

View File

@@ -5,10 +5,8 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.R;
@NotNullByDefault
public class ContactListAdapter extends
BaseContactListAdapter<ContactListItem, ContactListItemViewHolder> {
@@ -30,9 +28,6 @@ public class ContactListAdapter extends
public boolean areContentsTheSame(ContactListItem c1, ContactListItem c2) {
// check for all properties that influence visual
// representation of contact
if (c1.isEmpty() != c2.isEmpty()) {
return false;
}
if (c1.getUnreadCount() != c2.getUnreadCount()) {
return false;
}
@@ -44,7 +39,11 @@ public class ContactListAdapter extends
@Override
public int compare(ContactListItem c1, ContactListItem c2) {
return Long.compare(c2.getTimestamp(), c1.getTimestamp());
long time1 = c1.getTimestamp();
long time2 = c2.getTimestamp();
if (time1 < time2) return 1;
if (time1 > time2) return -1;
return 0;
}
}

View File

@@ -281,7 +281,7 @@ public class ContactListFragment extends BaseFragment implements EventListener {
ContactListItem item = adapter.getItemAt(position);
if (item != null) {
item.setConnected(connected);
adapter.updateItemAt(position, item);
adapter.notifyItemChanged(position);
}
});
}

View File

@@ -16,8 +16,5 @@ public interface BriarController extends ActivityLifecycleController {
void doNotAskAgainForDozeWhiteListing();
void signOut(ResultHandler<Void> eventHandler, boolean deleteAccount);
void deleteAccount();
void signOut(ResultHandler<Void> eventHandler);
}

View File

@@ -120,8 +120,7 @@ public class BriarControllerImpl implements BriarController {
}
@Override
public void signOut(ResultHandler<Void> eventHandler,
boolean deleteAccount) {
public void signOut(ResultHandler<Void> eventHandler) {
new Thread(() -> {
try {
// Wait for the service to finish starting up
@@ -135,18 +134,11 @@ public class BriarControllerImpl implements BriarController {
service.waitForShutdown();
} catch (InterruptedException e) {
LOG.warning("Interrupted while waiting for service");
} finally {
if (deleteAccount) accountManager.deleteAccount();
}
eventHandler.onResult(null);
}).start();
}
@Override
public void deleteAccount() {
accountManager.deleteAccount();
}
private void unbindService() {
if (bound) activity.unbindService(serviceConnection);
}

View File

@@ -47,6 +47,7 @@ import org.briarproject.bramble.api.plugin.ConnectionRegistry;
import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent;
import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent;
import org.briarproject.bramble.api.settings.SettingsManager;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.sync.event.MessagesAckedEvent;
import org.briarproject.bramble.api.sync.event.MessagesSentEvent;
@@ -255,9 +256,6 @@ public class ConversationActivity extends BriarActivity
list.setLayoutManager(layoutManager);
list.setAdapter(adapter);
list.setEmptyText(getString(R.string.no_private_messages));
ConversationScrollListener scrollListener =
new ConversationScrollListener(adapter, viewModel);
list.getRecyclerView().addOnScrollListener(scrollListener);
textInputView = findViewById(R.id.text_input_container);
if (FEATURE_FLAG_IMAGE_ATTACHMENTS) {
@@ -789,6 +787,23 @@ public class ConversationActivity extends BriarActivity
.show();
}
@Override
public void onItemVisible(ConversationItem item) {
if (!item.isRead()) markMessageRead(item.getGroupId(), item.getId());
}
private void markMessageRead(GroupId g, MessageId m) {
runOnDbThread(() -> {
try {
long start = now();
messagingManager.setReadFlag(g, m, true);
logDuration(LOG, "Marking read", start);
} catch (DbException e) {
logException(LOG, WARNING, e);
}
});
}
@UiThread
@Override
public void respondToRequest(ConversationRequestItem item, boolean accept) {

View File

@@ -14,14 +14,12 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.R;
import org.briarproject.briar.android.util.BriarAdapter;
import org.briarproject.briar.android.util.ItemReturningAdapter;
import javax.annotation.Nullable;
@NotNullByDefault
class ConversationAdapter
extends BriarAdapter<ConversationItem, ConversationItemViewHolder>
implements ItemReturningAdapter<ConversationItem> {
extends BriarAdapter<ConversationItem, ConversationItemViewHolder> {
private ConversationListener listener;
private final RecycledViewPool imageViewPool;
@@ -71,6 +69,7 @@ class ConversationAdapter
public void onBindViewHolder(ConversationItemViewHolder ui, int position) {
ConversationItem item = items.get(position);
ui.bind(item);
listener.onItemVisible(item);
}
@Override

View File

@@ -69,10 +69,6 @@ abstract class ConversationItem {
return read;
}
void markRead() {
read = true;
}
/**
* Only useful for outgoing messages.
*/

View File

@@ -9,6 +9,8 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@NotNullByDefault
interface ConversationListener {
void onItemVisible(ConversationItem item);
void respondToRequest(ConversationRequestItem item, boolean accept);
void openRequestedShareable(ConversationRequestItem item);

View File

@@ -1,26 +0,0 @@
package org.briarproject.briar.android.conversation;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.android.view.BriarRecyclerViewScrollListener;
@NotNullByDefault
class ConversationScrollListener extends
BriarRecyclerViewScrollListener<ConversationAdapter, ConversationItem> {
private final ConversationViewModel viewModel;
protected ConversationScrollListener(ConversationAdapter adapter,
ConversationViewModel viewModel) {
super(adapter);
this.viewModel = viewModel;
}
@Override
protected void onItemVisible(ConversationItem item) {
if (!item.isRead()) {
viewModel.markMessageRead(item.getGroupId(), item.getId());
item.markRead();
}
}
}

View File

@@ -26,7 +26,6 @@ import org.briarproject.bramble.api.settings.Settings;
import org.briarproject.bramble.api.settings.SettingsManager;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.android.util.UiUtils;
import org.briarproject.briar.api.messaging.Attachment;
import org.briarproject.briar.api.messaging.AttachmentHeader;
@@ -151,18 +150,6 @@ public class ConversationViewModel extends AndroidViewModel {
});
}
void markMessageRead(GroupId g, MessageId m) {
dbExecutor.execute(() -> {
try {
long start = now();
messagingManager.setReadFlag(g, m, true);
logDuration(LOG, "Marking read", start);
} catch (DbException e) {
logException(LOG, WARNING, e);
}
});
}
void setContactAlias(String alias) {
dbExecutor.execute(() -> {
try {

View File

@@ -67,10 +67,6 @@ public class ImageActivity extends BriarActivity
final static String NAME = "name";
final static String DATE = "date";
@RequiresApi(api = 16)
private final static int UI_FLAGS_DEFAULT =
SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
@Inject
ViewModelProvider.Factory viewModelFactory;
@@ -142,7 +138,9 @@ public class ImageActivity extends BriarActivity
if (SDK_INT >= 16) {
viewModel.getOnImageClicked().observe(this, this::onImageClicked);
window.getDecorView().setSystemUiVisibility(UI_FLAGS_DEFAULT);
window.getDecorView().setSystemUiVisibility(
SYSTEM_UI_FLAG_LAYOUT_STABLE |
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
}
@@ -208,16 +206,9 @@ public class ImageActivity extends BriarActivity
@Override
public void onPullComplete() {
showStatusBarBeforeFinishing();
supportFinishAfterTransition();
}
@Override
public void onBackPressed() {
showStatusBarBeforeFinishing();
super.onBackPressed();
}
@RequiresApi(api = 16)
private void onImageClicked(@Nullable Boolean clicked) {
if (clicked != null && clicked) {
@@ -238,8 +229,9 @@ public class ImageActivity extends BriarActivity
@RequiresApi(api = 16)
private void hideSystemUi(View decorView) {
decorView.setSystemUiVisibility(
SYSTEM_UI_FLAG_FULLSCREEN | UI_FLAGS_DEFAULT);
decorView.setSystemUiVisibility(SYSTEM_UI_FLAG_FULLSCREEN |
SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
);
appBarLayout.animate()
.translationYBy(-1 * appBarLayout.getHeight())
.alpha(0f)
@@ -249,7 +241,9 @@ public class ImageActivity extends BriarActivity
@RequiresApi(api = 16)
private void showSystemUi(View decorView) {
decorView.setSystemUiVisibility(UI_FLAGS_DEFAULT);
decorView.setSystemUiVisibility(
SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
);
appBarLayout.animate()
.translationYBy(appBarLayout.getHeight())
.alpha(1f)
@@ -257,18 +251,6 @@ public class ImageActivity extends BriarActivity
.start();
}
/**
* If we don't show the status bar again before finishing this activity,
* the return transition will "jump" down the size of the status bar
* when the previous activity (with visible status bar) is shown.
*/
private void showStatusBarBeforeFinishing() {
if (SDK_INT >= 16 && appBarLayout.getVisibility() == GONE) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(UI_FLAGS_DEFAULT);
}
}
private void showSaveImageDialog() {
OnClickListener okListener = (dialog, which) -> {
if (SDK_INT >= 19) {

View File

@@ -134,6 +134,12 @@ public class ForumActivity extends
return MAX_FORUM_POST_TEXT_LENGTH;
}
@Override
@StringRes
protected int getItemPostedString() {
return R.string.forum_new_entry_posted;
}
private void showUnsubscribeDialog() {
OnClickListener okListener = (dialog, which) -> deleteForum();
AlertDialog.Builder builder = new AlertDialog.Builder(this,

View File

@@ -4,12 +4,9 @@ import android.os.Bundle;
import android.support.annotation.UiThread;
import android.widget.Toast;
import org.briarproject.bramble.api.contact.ContactExchangeListener;
import org.briarproject.bramble.api.contact.ContactExchangeTask;
import org.briarproject.bramble.api.contact.event.ContactExchangeFailedEvent;
import org.briarproject.bramble.api.contact.event.ContactExchangeSucceededEvent;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.event.EventListener;
import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.identity.IdentityManager;
import org.briarproject.bramble.api.identity.LocalAuthor;
@@ -31,7 +28,7 @@ import static org.briarproject.bramble.util.LogUtils.logException;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class ContactExchangeActivity extends KeyAgreementActivity implements
EventListener {
ContactExchangeListener {
private static final Logger LOG =
Logger.getLogger(ContactExchangeActivity.class.getName());
@@ -53,20 +50,6 @@ public class ContactExchangeActivity extends KeyAgreementActivity implements
getSupportActionBar().setTitle(R.string.add_contact_title);
}
@Override
public void onStart() {
super.onStart();
// Listen to updates from contactExchangeTask
eventBus.addListener(this);
}
@Override
protected void onStop() {
super.onStop();
// Stop listen to updates from contactExchangeTask
eventBus.addListener(this);
}
private void startContactExchange(KeyAgreementResult result) {
runOnDbThread(() -> {
LocalAuthor localAuthor;
@@ -80,28 +63,15 @@ public class ContactExchangeActivity extends KeyAgreementActivity implements
}
// Exchange contact details
contactExchangeTask.startExchange(localAuthor,
result.getMasterKey(), result.getConnection(),
result.getTransportId(), result.wasAlice());
contactExchangeTask.startExchange(ContactExchangeActivity.this,
localAuthor, result.getMasterKey(),
result.getConnection(), result.getTransportId(),
result.wasAlice());
});
}
@Override
public void eventOccurred(Event e) {
if (e instanceof ContactExchangeSucceededEvent) {
contactExchangeSucceeded(
((ContactExchangeSucceededEvent) e).getRemoteAuthor());
} else if (e instanceof ContactExchangeFailedEvent) {
ContactExchangeFailedEvent fe = (ContactExchangeFailedEvent) e;
if (fe.wasDuplicateContact()) {
duplicateContact(fe.getDuplicateRemoteAuthor());
} else {
contactExchangeFailed();
}
}
}
private void contactExchangeSucceeded(Author remoteAuthor) {
public void contactExchangeSucceeded(Author remoteAuthor) {
runOnUiThreadUnlessDestroyed(() -> {
String contactName = remoteAuthor.getName();
String format = getString(R.string.contact_added_toast);
@@ -112,7 +82,8 @@ public class ContactExchangeActivity extends KeyAgreementActivity implements
});
}
private void duplicateContact(Author remoteAuthor) {
@Override
public void duplicateContact(Author remoteAuthor) {
runOnUiThreadUnlessDestroyed(() -> {
String contactName = remoteAuthor.getName();
String format = getString(R.string.contact_already_exists);
@@ -123,7 +94,8 @@ public class ContactExchangeActivity extends KeyAgreementActivity implements
});
}
private void contactExchangeFailed() {
@Override
public void contactExchangeFailed() {
runOnUiThreadUnlessDestroyed(() -> {
showErrorFragment(R.string.connection_error_explanation);
});

View File

@@ -109,7 +109,7 @@ public class NavDrawerActivity extends BriarActivity implements
} else if (intent.getBooleanExtra(INTENT_BLOGS, false)) {
startFragment(FeedFragment.newInstance(), R.id.nav_btn_blogs);
} else if (intent.getBooleanExtra(INTENT_SIGN_OUT, false)) {
signOut(false, false);
signOut(false);
}
setIntent(null);
}
@@ -279,7 +279,7 @@ public class NavDrawerActivity extends BriarActivity implements
private void signOut() {
drawerLayout.setDrawerLockMode(LOCK_MODE_LOCKED_CLOSED);
signOut(false, false);
signOut(false);
finish();
}

View File

@@ -5,16 +5,13 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.preference.PreferenceManager;
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.account.AccountManager;
import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import javax.inject.Inject;
import info.guardianproject.GuardianProjectRSA4096;
@@ -26,20 +23,18 @@ import static android.os.Build.VERSION.SDK_INT;
import static org.briarproject.briar.android.panic.PanicPreferencesFragment.KEY_LOCK;
import static org.briarproject.briar.android.panic.PanicPreferencesFragment.KEY_PURGE;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class PanicResponderActivity extends BriarActivity {
private static final Logger LOG =
Logger.getLogger(PanicResponderActivity.class.getName());
@Inject
protected LifecycleManager lifecycleManager;
protected AccountManager accountManager;
@Inject
protected AndroidExecutor androidExecutor;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TrustedIntents trustedIntents = TrustedIntents.get(this);
@@ -69,7 +64,7 @@ public class PanicResponderActivity extends BriarActivity {
// non-destructive actions are allowed by non-connected trusted apps
if (sharedPref.getBoolean(KEY_LOCK, true)) {
LOG.info("Signing out...");
signOut(true, false);
signOut(true);
}
}
}
@@ -88,8 +83,14 @@ public class PanicResponderActivity extends BriarActivity {
private void deleteAllData() {
androidExecutor.runOnBackgroundThread(() -> {
accountManager.deleteAccount();
// TODO somehow delete/shred the database more thoroughly
PanicResponder.deleteAllAppData(PanicResponderActivity.this);
// nothing left to do after everything is deleted,
// so still sign out
LOG.info("Signing out...");
signOut(true, true);
signOut(true);
});
}
}

View File

@@ -179,16 +179,14 @@ public class GroupActivity extends
}
@Override
public void onItemReceived(GroupMessageItem item) {
super.onItemReceived(item);
if (item instanceof JoinMessageItem) {
if (((JoinMessageItem) item).isInitial()) loadSharingContacts();
}
protected int getMaxTextLength() {
return MAX_GROUP_POST_TEXT_LENGTH;
}
@Override
protected int getMaxTextLength() {
return MAX_GROUP_POST_TEXT_LENGTH;
@StringRes
protected int getItemPostedString() {
return R.string.groups_message_sent;
}
@Override

View File

@@ -7,20 +7,14 @@ import android.view.MenuItem;
import android.widget.TextView;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.event.EventListener;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.event.GroupRemovedEvent;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity;
import org.briarproject.briar.android.controller.handler.UiResultExceptionHandler;
import org.briarproject.briar.android.view.BriarRecyclerView;
import org.briarproject.briar.api.privategroup.JoinMessageHeader;
import org.briarproject.briar.api.privategroup.event.GroupMessageAddedEvent;
import java.util.Collection;
@@ -29,13 +23,10 @@ import javax.inject.Inject;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class GroupMemberListActivity extends BriarActivity
implements EventListener {
public class GroupMemberListActivity extends BriarActivity {
@Inject
GroupMemberListController controller;
@Inject
EventBus eventBus;
private MemberListAdapter adapter;
private BriarRecyclerView list;
@@ -70,50 +61,6 @@ public class GroupMemberListActivity extends BriarActivity
@Override
public void onStart() {
super.onStart();
loadMembers();
eventBus.addListener(this);
list.startPeriodicUpdate();
}
@Override
public void onStop() {
super.onStop();
eventBus.removeListener(this);
list.stopPeriodicUpdate();
}
@Override
public void eventOccurred(Event e) {
if (e instanceof GroupMessageAddedEvent) {
// we can't use GroupInvitationResponseReceivedEvent, because
// a peer only becomes a member after joining the group by message
GroupMessageAddedEvent ge = (GroupMessageAddedEvent) e;
if (ge.getGroupId().equals(groupId) &&
ge.getHeader() instanceof JoinMessageHeader) {
loadMembers();
}
} else if (e instanceof GroupRemovedEvent) {
GroupRemovedEvent g = (GroupRemovedEvent) e;
if (g.getGroup().getId().equals(groupId)) {
runOnUiThreadUnlessDestroyed(
this::supportFinishAfterTransition);
}
}
// TODO ContactConnectedEvent and ContactDisconnectedEvent
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void loadMembers() {
controller.loadMembers(groupId,
new UiResultExceptionHandler<Collection<MemberListItem>, DbException>(
this) {
@@ -127,6 +74,24 @@ public class GroupMemberListActivity extends BriarActivity
handleDbException(exception);
}
});
list.startPeriodicUpdate();
}
@Override
public void onStop() {
super.onStop();
list.stopPeriodicUpdate();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}

View File

@@ -3,14 +3,11 @@ package org.briarproject.briar.android.sharing;
import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.db.DatabaseExecutor;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.api.blog.BlogInvitationResponse;
import org.briarproject.briar.api.blog.BlogSharingManager;
import org.briarproject.briar.api.blog.event.BlogInvitationResponseReceivedEvent;
import java.util.Collection;
@@ -29,19 +26,6 @@ public class BlogSharingStatusActivity extends SharingStatusActivity {
component.inject(this);
}
@Override
public void eventOccurred(Event e) {
super.eventOccurred(e);
if (e instanceof BlogInvitationResponseReceivedEvent) {
BlogInvitationResponseReceivedEvent r =
(BlogInvitationResponseReceivedEvent) e;
BlogInvitationResponse h = r.getMessageHeader();
if (h.getShareableId().equals(getGroupId()) && h.wasAccepted()) {
loadSharedWith();
}
}
}
@Override
int getInfoText() {
return R.string.sharing_status_blog;

View File

@@ -3,14 +3,11 @@ package org.briarproject.briar.android.sharing;
import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.db.DatabaseExecutor;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.api.forum.ForumInvitationResponse;
import org.briarproject.briar.api.forum.ForumSharingManager;
import org.briarproject.briar.api.forum.event.ForumInvitationResponseReceivedEvent;
import java.util.Collection;
@@ -29,19 +26,6 @@ public class ForumSharingStatusActivity extends SharingStatusActivity {
component.inject(this);
}
@Override
public void eventOccurred(Event e) {
super.eventOccurred(e);
if (e instanceof ForumInvitationResponseReceivedEvent) {
ForumInvitationResponseReceivedEvent r =
(ForumInvitationResponseReceivedEvent) e;
ForumInvitationResponse h = r.getMessageHeader();
if (h.getShareableId().equals(getGroupId()) && h.wasAccepted()) {
loadSharedWith();
}
}
}
@Override
int getInfoText() {
return R.string.sharing_status_forum;

View File

@@ -2,7 +2,6 @@ package org.briarproject.briar.android.sharing;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.annotation.StringRes;
import android.support.v7.widget.LinearLayoutManager;
import android.view.MenuItem;
@@ -11,19 +10,14 @@ import android.widget.TextView;
import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.db.DatabaseExecutor;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.event.EventListener;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.plugin.ConnectionRegistry;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.event.GroupRemovedEvent;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.BriarActivity;
import org.briarproject.briar.android.contact.ContactItem;
import org.briarproject.briar.android.view.BriarRecyclerView;
import org.briarproject.briar.api.sharing.event.ContactLeftShareableEvent;
import java.util.ArrayList;
import java.util.Collection;
@@ -38,13 +32,10 @@ import static org.briarproject.bramble.util.LogUtils.logException;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
abstract class SharingStatusActivity extends BriarActivity
implements EventListener {
abstract class SharingStatusActivity extends BriarActivity {
@Inject
ConnectionRegistry connectionRegistry;
@Inject
EventBus eventBus;
private static final Logger LOG =
Logger.getLogger(SharingStatusActivity.class.getName());
@@ -77,7 +68,6 @@ abstract class SharingStatusActivity extends BriarActivity
@Override
public void onStart() {
super.onStart();
eventBus.addListener(this);
loadSharedWith();
}
@@ -85,28 +75,9 @@ abstract class SharingStatusActivity extends BriarActivity
public void onStop() {
super.onStop();
adapter.clear();
eventBus.removeListener(this);
list.showProgressBar();
}
@Override
@CallSuper
public void eventOccurred(Event e) {
if (e instanceof ContactLeftShareableEvent) {
ContactLeftShareableEvent c = (ContactLeftShareableEvent) e;
if (c.getGroupId().equals(getGroupId())) {
loadSharedWith();
}
} else if (e instanceof GroupRemovedEvent) {
GroupRemovedEvent g = (GroupRemovedEvent) e;
if (g.getGroup().getId().equals(getGroupId())) {
runOnUiThreadUnlessDestroyed(
this::supportFinishAfterTransition);
}
}
// TODO ContactConnectedEvent and ContactDisconnectedEvent
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
@@ -129,7 +100,7 @@ abstract class SharingStatusActivity extends BriarActivity
return groupId;
}
protected void loadSharedWith() {
private void loadSharedWith() {
runOnDbThread(() -> {
try {
List<ContactItem> contactItems = new ArrayList<>();
@@ -147,7 +118,6 @@ abstract class SharingStatusActivity extends BriarActivity
private void displaySharedWith(List<ContactItem> contacts) {
runOnUiThreadUnlessDestroyed(() -> {
adapter.clear();
if (contacts.isEmpty()) list.showData();
else adapter.addAll(contacts);
});

View File

@@ -51,6 +51,7 @@ public abstract class BaseThreadItemViewHolder<I extends ThreadItem>
} else if (!item.isRead()) {
layout.setActivated(true);
animateFadeOut();
listener.onUnreadItemVisible(item);
} else {
layout.setActivated(false);
}

View File

@@ -10,7 +10,6 @@ import android.view.ViewGroup;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.briar.R;
import org.briarproject.briar.android.util.ItemReturningAdapter;
import org.briarproject.briar.android.util.VersionedAdapter;
import java.util.Collection;
@@ -22,7 +21,7 @@ import static android.support.v7.widget.RecyclerView.NO_POSITION;
@UiThread
public class ThreadItemAdapter<I extends ThreadItem>
extends RecyclerView.Adapter<BaseThreadItemViewHolder<I>>
implements VersionedAdapter, ItemReturningAdapter<I> {
implements VersionedAdapter {
static final int UNDEFINED = -1;
@@ -137,6 +136,30 @@ public class ThreadItemAdapter<I extends ThreadItem>
return null;
}
/**
* Gets the number of unread items above and below the current view port.
*
* Attention: Do not call this when the list is still scrolling,
* because then the view port is unknown.
*/
public UnreadCount getUnreadCount() {
int positionTop = layoutManager.findFirstVisibleItemPosition();
int positionBottom = layoutManager.findLastVisibleItemPosition();
if (positionTop == NO_POSITION && positionBottom == NO_POSITION)
return new UnreadCount(0, 0);
int unreadCounterTop = 0, unreadCounterBottom = 0;
for (int i = 0; i < items.size(); i++) {
I item = items.get(i);
if (i < positionTop && !item.isRead()) {
unreadCounterTop++;
} else if (i > positionBottom && !item.isRead()) {
unreadCounterBottom++;
}
}
return new UnreadCount(unreadCounterTop, unreadCounterBottom);
}
/**
* Returns the position of the first unread item below the current viewport
*/
@@ -165,7 +188,20 @@ public class ThreadItemAdapter<I extends ThreadItem>
return NO_POSITION;
}
static class UnreadCount {
final int top, bottom;
private UnreadCount(int top, int bottom) {
this.top = top;
this.bottom = bottom;
}
}
public interface ThreadItemListener<I> {
void onUnreadItemVisible(I item);
void onReplyClick(I item);
}

View File

@@ -3,13 +3,13 @@ package org.briarproject.briar.android.threaded;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.annotation.CallSuper;
import android.support.annotation.StringRes;
import android.support.annotation.UiThread;
import android.support.design.widget.Snackbar;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.MenuItem;
import org.briarproject.bramble.api.contact.ContactId;
@@ -43,7 +43,10 @@ import javax.inject.Inject;
import static android.support.design.widget.Snackbar.make;
import static android.support.v7.widget.RecyclerView.NO_POSITION;
import static android.support.v7.widget.RecyclerView.SCROLL_STATE_IDLE;
import static java.util.logging.Level.INFO;
import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
import static org.briarproject.briar.android.threaded.ThreadItemAdapter.UnreadCount;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
@@ -58,13 +61,11 @@ public abstract class ThreadListActivity<G extends NamedGroup, I extends ThreadI
Logger.getLogger(ThreadListActivity.class.getName());
protected A adapter;
private ThreadScrollListener<I> scrollListener;
protected BriarRecyclerView list;
private LinearLayoutManager layoutManager;
protected TextInputView textInput;
protected GroupId groupId;
@Nullable
private Parcelable layoutManagerState;
private UnreadMessageButton upButton, downButton;
@Nullable
private MessageId replyId;
@@ -75,6 +76,7 @@ public abstract class ThreadListActivity<G extends NamedGroup, I extends ThreadI
@CallSuper
@Override
@SuppressWarnings("ConstantConditions")
public void onCreate(@Nullable Bundle state) {
super.onCreate(state);
@@ -91,18 +93,37 @@ public abstract class ThreadListActivity<G extends NamedGroup, I extends ThreadI
new TextSendController(textInput, this, false);
textInput.setSendController(sendController);
textInput.setMaxTextLength(getMaxTextLength());
UnreadMessageButton upButton = findViewById(R.id.upButton);
UnreadMessageButton downButton = findViewById(R.id.downButton);
list = findViewById(R.id.list);
layoutManager = new LinearLayoutManager(this);
// FIXME pre-fetching messes with read state, find better solution #1289
layoutManager.setItemPrefetchEnabled(false);
list.setLayoutManager(layoutManager);
adapter = createAdapter(layoutManager);
list.setAdapter(adapter);
scrollListener = new ThreadScrollListener<>(adapter, getController(),
upButton, downButton);
list.getRecyclerView().addOnScrollListener(scrollListener);
list.getRecyclerView().addOnScrollListener(
new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx,
int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dx == 0 && dy == 0) {
// scrollToPosition has been called and finished
updateUnreadCount();
}
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView,
int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == SCROLL_STATE_IDLE) {
updateUnreadCount();
}
}
});
upButton = findViewById(R.id.upButton);
downButton = findViewById(R.id.downButton);
upButton.setOnClickListener(v -> {
int position = adapter.getVisibleUnreadPosTop();
if (position != NO_POSITION) {
@@ -190,12 +211,8 @@ public abstract class ThreadListActivity<G extends NamedGroup, I extends ThreadI
MessageId messageId = items.getFirstVisibleItemId();
if (messageId != null)
adapter.setItemWithIdVisible(messageId);
updateUnreadCount();
list.showData();
if (layoutManagerState == null) {
list.scrollToPosition(0); // Scroll to the top
} else {
layoutManager.onRestoreInstanceState(layoutManagerState);
}
}
protected void loadSharingContacts() {
@@ -236,21 +253,11 @@ public abstract class ThreadListActivity<G extends NamedGroup, I extends ThreadI
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (layoutManager != null) {
layoutManagerState = layoutManager.onSaveInstanceState();
outState.putParcelable("layoutManager", layoutManagerState);
}
if (replyId != null) {
outState.putByteArray(KEY_REPLY_ID, replyId.getBytes());
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
layoutManagerState = savedInstanceState.getParcelable("layoutManager");
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
@@ -273,6 +280,14 @@ public abstract class ThreadListActivity<G extends NamedGroup, I extends ThreadI
}
}
@Override
public void onUnreadItemVisible(I item) {
if (!item.isRead()) {
item.setRead(true);
getController().markItemRead(item);
}
}
@Override
public void onReplyClick(I item) {
replyId = item.getId();
@@ -386,10 +401,24 @@ public abstract class ThreadListActivity<G extends NamedGroup, I extends ThreadI
adapter.add(item);
if (isLocal) {
displaySnackbar(getItemPostedString());
scrollToItemAtTop(item);
} else {
scrollListener.updateUnreadButtons(layoutManager);
updateUnreadCount();
}
}
private void updateUnreadCount() {
UnreadCount unreadCount = adapter.getUnreadCount();
if (LOG.isLoggable(INFO)) {
LOG.info("Updating unread count: top=" + unreadCount.top +
" bottom=" + unreadCount.bottom);
}
upButton.setUnreadCount(unreadCount.top);
downButton.setUnreadCount(unreadCount.bottom);
}
@StringRes
protected abstract int getItemPostedString();
}

View File

@@ -1,86 +0,0 @@
package org.briarproject.briar.android.threaded;
import android.support.v7.widget.LinearLayoutManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.android.view.BriarRecyclerViewScrollListener;
import org.briarproject.briar.android.view.UnreadMessageButton;
import java.util.logging.Logger;
import static android.support.v7.widget.RecyclerView.NO_POSITION;
import static java.util.Objects.requireNonNull;
import static java.util.logging.Level.INFO;
import static java.util.logging.Logger.getLogger;
@NotNullByDefault
class ThreadScrollListener<I extends ThreadItem>
extends BriarRecyclerViewScrollListener<ThreadItemAdapter<I>, I> {
private static final Logger LOG =
getLogger(ThreadScrollListener.class.getName());
private final ThreadListController<?, I> controller;
private final UnreadMessageButton upButton, downButton;
protected ThreadScrollListener(ThreadItemAdapter<I> adapter,
ThreadListController<?, I> controller,
UnreadMessageButton upButton,
UnreadMessageButton downButton) {
super(adapter);
this.controller = controller;
this.upButton = upButton;
this.downButton = downButton;
}
@Override
protected void onItemsVisible(int firstVisible, int lastVisible,
int itemCount) {
super.onItemsVisible(firstVisible, lastVisible, itemCount);
updateUnreadButtons(firstVisible, lastVisible, itemCount);
}
@Override
protected void onItemVisible(I item) {
if (!item.isRead()) {
item.setRead(true);
controller.markItemRead(item);
}
}
void updateUnreadButtons(LinearLayoutManager layoutManager) {
int firstVisible = layoutManager.findFirstVisibleItemPosition();
int lastVisible = layoutManager.findLastVisibleItemPosition();
int itemCount = adapter.getItemCount();
updateUnreadButtons(firstVisible, lastVisible, itemCount);
}
private void updateUnreadButtons(int firstVisible, int lastVisible,
int count) {
if (firstVisible == NO_POSITION && lastVisible == NO_POSITION) {
setUnreadButtons(0, 0);
return;
}
int unreadCounterFirst = 0;
for (int i = 0; i < firstVisible; i++) {
I item = requireNonNull(adapter.getItemAt(i));
if (!item.isRead()) unreadCounterFirst++;
}
int unreadCounterLast = 0;
for (int i = lastVisible + 1; i < count; i++) {
I item = requireNonNull(adapter.getItemAt(i));
if (!item.isRead()) unreadCounterLast++;
}
setUnreadButtons(unreadCounterFirst, unreadCounterLast);
}
private void setUnreadButtons(int upCount, int downCount) {
if (LOG.isLoggable(INFO)) {
LOG.info("Updating unread count: top=" + upCount +
" bottom=" + downCount);
}
upButton.setUnreadCount(upCount);
downButton.setUnreadCount(downCount);
}
}

View File

@@ -1,9 +0,0 @@
package org.briarproject.briar.android.util;
public interface ItemReturningAdapter<I> {
I getItemAt(int position);
int getItemCount();
}

View File

@@ -7,6 +7,7 @@ import android.os.Handler;
import android.os.Looper;
import android.support.annotation.DrawableRes;
import android.support.annotation.StringRes;
import android.support.constraint.Group;
import android.support.v7.widget.AppCompatImageView;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.Adapter;
@@ -28,13 +29,14 @@ public class BriarRecyclerView extends FrameLayout {
private final Handler handler = new Handler(Looper.getMainLooper());
private RecyclerView recyclerView;
private Group emptyState;
private AppCompatImageView emptyImage;
private TextView emptyText, emptyAction;
private ProgressBar progressBar;
private RecyclerView.AdapterDataObserver emptyObserver;
@Nullable
private Runnable refresher = null;
private boolean isScrollingToEnd;
private boolean isScrollingToEnd = false;
public BriarRecyclerView(Context context) {
this(context, null, 0);
@@ -75,6 +77,7 @@ public class BriarRecyclerView extends FrameLayout {
R.layout.briar_recycler_view, this, true);
recyclerView = v.findViewById(R.id.recyclerView);
emptyState = v.findViewById(R.id.emptyState);
emptyImage = v.findViewById(R.id.emptyImage);
emptyText = v.findViewById(R.id.emptyText);
emptyAction = v.findViewById(R.id.emptyAction);
@@ -171,9 +174,7 @@ public class BriarRecyclerView extends FrameLayout {
public void showProgressBar() {
if (recyclerView == null) initViews();
recyclerView.setVisibility(INVISIBLE);
emptyImage.setVisibility(INVISIBLE);
emptyText.setVisibility(INVISIBLE);
emptyAction.setVisibility(INVISIBLE);
emptyState.setVisibility(INVISIBLE);
progressBar.setVisibility(VISIBLE);
}
@@ -182,14 +183,11 @@ public class BriarRecyclerView extends FrameLayout {
Adapter adapter = recyclerView.getAdapter();
if (adapter != null) {
if (adapter.getItemCount() == 0) {
emptyImage.setVisibility(VISIBLE);
emptyText.setVisibility(VISIBLE);
emptyAction.setVisibility(VISIBLE);
emptyState.setVisibility(VISIBLE);
recyclerView.setVisibility(INVISIBLE);
} else {
emptyImage.setVisibility(INVISIBLE);
emptyText.setVisibility(INVISIBLE);
emptyAction.setVisibility(INVISIBLE);
// use GONE here so empty view doesn't use space on small lists
emptyState.setVisibility(GONE);
recyclerView.setVisibility(VISIBLE);
}
progressBar.setVisibility(GONE);

View File

@@ -1,61 +0,0 @@
package org.briarproject.briar.android.view;
import android.support.annotation.CallSuper;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.OnScrollListener;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.android.util.ItemReturningAdapter;
import static android.support.v7.widget.RecyclerView.NO_POSITION;
import static java.util.Objects.requireNonNull;
@NotNullByDefault
public abstract class BriarRecyclerViewScrollListener<A extends ItemReturningAdapter<I>, I>
extends OnScrollListener {
protected final A adapter;
private int prevFirstVisible = NO_POSITION;
private int prevLastVisible = NO_POSITION;
private int prevItemCount = 0;
protected BriarRecyclerViewScrollListener(A adapter) {
this.adapter = adapter;
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
LinearLayoutManager layoutManager = (LinearLayoutManager)
requireNonNull(recyclerView.getLayoutManager());
int firstVisible = layoutManager.findFirstVisibleItemPosition();
int lastVisible = layoutManager.findLastVisibleItemPosition();
int itemCount = adapter.getItemCount();
if (firstVisible != prevFirstVisible ||
lastVisible != prevLastVisible ||
itemCount != prevItemCount) {
onItemsVisible(firstVisible, lastVisible, itemCount);
prevFirstVisible = firstVisible;
prevLastVisible = lastVisible;
prevItemCount = itemCount;
}
}
@CallSuper
protected void onItemsVisible(int firstVisible, int lastVisible,
int itemCount) {
for (int i = firstVisible; i <= lastVisible; i++) {
onItemVisible(i);
}
}
private void onItemVisible(int position) {
I item = requireNonNull(adapter.getItemAt(position));
onItemVisible(item);
}
protected abstract void onItemVisible(I item);
}

View File

@@ -26,7 +26,6 @@ import javax.inject.Inject;
import static android.content.Context.INPUT_METHOD_SERVICE;
import static android.content.Context.LAYOUT_INFLATER_SERVICE;
import static android.view.KeyEvent.KEYCODE_ENTER;
import static android.view.inputmethod.EditorInfo.IME_ACTION_SEND;
import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT;
import static java.util.Objects.requireNonNull;
import static org.briarproject.bramble.util.StringUtils.utf8IsTooLong;
@@ -81,15 +80,7 @@ public class EmojiTextInputView extends KeyboardAwareLinearLayout implements
if (maxLines > 0) editText.setMaxLines(maxLines);
editText.setOnClickListener(v -> showSoftKeyboard());
editText.addTextChangedListener(this);
editText.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == IME_ACTION_SEND) {
listener.onSendEvent();
hideSoftKeyboard();
return true;
}
return false;
});
// also support sending with Ctrl+Enter
// support sending with Ctrl+Enter
editText.setOnKeyListener((v, keyCode, event) -> {
if (listener != null && keyCode == KEYCODE_ENTER &&
event.isCtrlPressed()) {

View File

@@ -5,7 +5,7 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
@@ -13,18 +13,10 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import java.util.List;
import static android.content.Intent.ACTION_VIEW;
import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
import static java.util.Objects.requireNonNull;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class LinkDialogFragment extends DialogFragment {
private static final String TAG = LinkDialogFragment.class.getName();
@@ -42,19 +34,17 @@ public class LinkDialogFragment extends DialogFragment {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = requireNonNull(getArguments());
url = requireNonNull(args.getString("url"));
url = getArguments().getString("url");
setStyle(STYLE_NO_TITLE, R.style.BriarDialogTheme);
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_link_dialog, container,
false);
@@ -63,11 +53,10 @@ public class LinkDialogFragment extends DialogFragment {
urlView.setText(url);
// prepare normal intent or intent chooser
Intent i = new Intent(ACTION_VIEW, Uri.parse(url));
PackageManager packageManager =
requireNonNull(getContext()).getPackageManager();
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
PackageManager packageManager = getContext().getPackageManager();
List activities = packageManager.queryIntentActivities(i,
MATCH_DEFAULT_ONLY);
PackageManager.MATCH_DEFAULT_ONLY);
boolean choice = activities.size() > 1;
Intent intent = choice ? Intent.createChooser(i,
getString(R.string.link_warning_open_link)) : i;

View File

@@ -25,7 +25,6 @@
android:background="@android:color/transparent"
android:gravity="top"
android:hint="@string/blogs_rss_feeds_import_hint"
android:imeOptions="actionDone"
android:inputType="textUri"
android:padding="@dimen/margin_medium"
android:textColor="?android:attr/textColorPrimary"/>

View File

@@ -27,6 +27,13 @@
app:layout_constraintTop_toTopOf="parent"
tools:visibility="invisible"/>
<android.support.constraint.Group
android:id="@+id/emptyState"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:constraint_referenced_ids="emptyImage, emptyText, emptyAction"
tools:visibility="invisible"/>
<android.support.v7.widget.AppCompatImageView
android:id="@+id/emptyImage"
android:layout_width="wrap_content"

View File

@@ -26,7 +26,6 @@
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@android:color/transparent"
android:imeOptions="actionSend"
android:inputType="textMultiLine|textCapSentences|textAutoCorrect"
android:minHeight="@dimen/text_input_height"
android:textColor="?android:attr/textColorPrimary"

View File

@@ -1,109 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/linkWarning"
android:layout_width="0dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:text="@string/link_warning_title"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_large"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/scrollView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
app:layout_constraintVertical_chainStyle="packed"/>
android:textStyle="bold"/>
<ScrollView
android:id="@+id/scrollView"
android:layout_width="0dp"
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
app:layout_constrainedHeight="true"
app:layout_constraintBottom_toTopOf="@+id/cancelButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linkWarning">
android:layout_marginTop="@dimen/margin_large"
android:text="@string/link_warning_intro"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_medium"/>
<LinearLayout
android:layout_width="match_parent"
<TextView
android:id="@+id/urlView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_large"
android:textColor="?android:attr/textColorPrimary"
android:textIsSelectable="true"
android:textSize="@dimen/text_size_medium"
android:typeface="monospace"
tools:text="http://very.bad.site.com"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_large"
android:text="@string/link_warning_text"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_medium"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/margin_xxlarge"
android:layout_marginStart="@dimen/margin_xxlarge"
android:gravity="end"
android:orientation="horizontal">
<Button
android:id="@+id/cancelButton"
style="@style/BriarButtonFlat.Positive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
android:text="@string/cancel"/>
<TextView
android:id="@+id/linkIntro"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/link_warning_intro"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_medium"/>
<Button
android:id="@+id/openButton"
style="@style/BriarButtonFlat.Negative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/link_warning_open_link"/>
<TextView
android:id="@+id/urlView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
android:background="@color/briar_white"
android:padding="8dp"
android:textColor="@color/briar_text_primary"
android:textIsSelectable="true"
android:textSize="@dimen/text_size_medium"
android:typeface="monospace"
tools:text="http://very.bad.site.com/with/a/super/long/address/that/can/push/stuff/off/screen/so/much/that/buttons/are/not/visible/which/is/bad/for/users/when/they/dont/know/what/to/do/they/might/be/completely/lost/crying/in/despair/so/we/need/to/make/sure/that/they/see/all/buttons"/>
</LinearLayout>
<TextView
android:id="@+id/thinkBeforeOpen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/link_warning_text"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_medium"/>
</LinearLayout>
</ScrollView>
<Button
android:id="@+id/cancelButton"
style="@style/BriarButtonFlat.Positive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cancel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/openButton"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/scrollView"
app:layout_constraintVertical_bias="1.0"/>
<Button
android:id="@+id/openButton"
style="@style/BriarButtonFlat.Negative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/link_warning_open_link"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/cancelButton"
app:layout_constraintTop_toTopOf="@+id/cancelButton"/>
</android.support.constraint.ConstraintLayout>
</LinearLayout>

View File

@@ -82,11 +82,11 @@
android:layout_marginStart="@dimen/listitem_horizontal_margin"
android:layout_marginTop="@dimen/margin_medium"
android:textColor="?android:attr/textColorTertiary"
app:layout_constraintEnd_toStartOf="@+id/removeButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toRightOf="@+id/avatarView"
app:layout_constraintStart_toEndOf="@+id/avatarView"
app:layout_constraintTop_toBottomOf="@+id/messageCountView"
tools:text="This group is empty, but has a long status text"/>
tools:text="@string/groups_group_is_empty"/>
<Button
android:id="@+id/removeButton"
@@ -94,11 +94,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/groups_remove"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/divider"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/statusView"
tools:visibility="visible"/>
tools:visibility="gone"/>
<View
android:id="@+id/divider"

View File

@@ -13,7 +13,7 @@
android:id="@+id/action_group_member_list"
android:icon="@drawable/ic_group_white"
android:title="@string/groups_member_list"
app:showAsAction="never"/>
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_group_reveal"

View File

@@ -52,7 +52,6 @@
<string name="download_briar_button">تحميل Briar (براير) 1.0</string>
<string name="startup_open_database">جارِ فك تشفير قاعدة البيانات...</string>
<string name="startup_migrate_database">جارِ ترقية قاعدة البيانات...</string>
<string name="startup_compact_database">جارِ ضغظ قاعدة البيانات…</string>
<!--Navigation Drawer-->
<string name="nav_drawer_open_description">فتح راسم التصفح</string>
<string name="nav_drawer_close_description">غلق راسم التصفح</string>
@@ -136,7 +135,6 @@
<string name="date_no_private_messages">لا رسائل.</string>
<string name="no_private_messages">لا رسائل للعرض.</string>
<string name="message_hint">كتابة رسالة</string>
<string name="image_attach">إرفاق صورة</string>
<string name="set_contact_alias_hint">اسم جهة الاتصال</string>
<string name="set_alias_button">تغيير</string>
<string name="delete_contact">حذف جهة الإتصال</string>
@@ -145,11 +143,6 @@
<string name="contact_deleted_toast">تم حذف جهة اتصال</string>
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
<string name="you">أنتَ/أنتِ</string>
<string name="save_image">حفظ الصورة</string>
<string name="dialog_title_save_image">حفظ الصورة؟</string>
<string name="save_image_success">تم حفظ الصورة</string>
<string name="dialog_title_no_image_support">الصور غير متوفرة</string>
<string name="dialog_message_image_support">اضغط على هذه الأيقونة لإرفاق صور.</string>
<!--Adding Contacts-->
<string name="add_contact_title">إضافة جهة اتصال</string>
<string name="face_to_face">لا بد من مقابلة الشخص الذي تريد/ين إضافته كجهة اتصال.\n\nهذا سيمنع أي شخص من انتحال شخصيتك أو قراءة رسائلك في المستقبل.</string>
@@ -216,6 +209,7 @@
<string name="groups_create_group_invitation_button">إرسال دعوة</string>
<string name="groups_create_group_hint">اختيار اسم لمجموعتك الخاصة</string>
<string name="groups_invitation_sent">تم إرسال دعوة للمجموعة</string>
<string name="groups_message_sent">تم إرسال الرسالة</string>
<string name="groups_member_list">قائمة الأعضاء</string>
<string name="groups_invite_members">دعوة أعضاء</string>
<string name="groups_member_created_you">أنت أنشأت المجموعة</string>
@@ -275,6 +269,7 @@
<item quantity="many">%d منشور</item>
<item quantity="other">%d منشور</item>
</plurals>
<string name="forum_new_entry_posted">تم نشر منشور المنتدى</string>
<string name="forum_new_message_hint">منشور جديد</string>
<string name="forum_message_reply_hint">رد جديد</string>
<string name="btn_reply">الرد</string>
@@ -452,6 +447,7 @@
<!--Link Warning-->
<string name="link_warning_title">تنبيه بوجود رابط</string>
<string name="link_warning_intro">أنت بصدد فتح هذا الرابط في تطبيق خارجي</string>
<string name="link_warning_text">يمكن أن يستعمل هذا في تحديد هويتك. يرجى التفكير في مدى ثقتك بالشخص الذي أرسل لك هذا الرابط و من الأفضل فتحه بإستعمال أورفوكس.</string>
<string name="link_warning_open_link">افتح الرابط</string>
<!--Crash Reporter-->
<string name="crash_report_title">تقرير إنهيار Briar (براير)</string>
@@ -478,7 +474,6 @@
<!--Permission Requests-->
<string name="permission_camera_title">إذن الكاميرا</string>
<string name="permission_camera_request_body">للتمكن من مسح رمز QR، يحتاج Briar (براير) إلى إستعمال الكاميرا.</string>
<string name="permission_camera_location_title">آلة التصوير والموقع</string>
<string name="permission_camera_denied_body">قد رفضت إعطاء إذن الكاميرا، لكن إضافة جهات إتصال يتطلب إستعمال الكاميرا.\n\nالرجاء منح الإذن.</string>
<string name="qr_code">رمز QR</string>
<string name="show_qr_code_fullscreen">اظهار رمز QR بوضع ملء الشاشة</string>
@@ -491,11 +486,8 @@
<string name="lock_tap_to_unlock">الرجاء اللمس لفك القفل</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">آليس</string>
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_bob">بوب</string>
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_carol">كارول</string>
<!--This is a message to be used in screenshots. Please use the same translation for Bob!-->
<!--This is a message to be used in screenshots. Please use the same translation for Alice!-->
<!--This is a message to be used in screenshots.-->

View File

@@ -1,429 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Setup-->
<string name="setup_title">Briar-a xoş gəlmisiniz!</string>
<string name="setup_name_explanation">Sizin nikiniz yazdığlarınızın yanında görsənəcək. Hesabı yaradandan sonra onu dəyişə bilməzsiniz.</string>
<string name="setup_next">Növbəti</string>
<string name="setup_password_intro">Şifrə seçin</string>
<string name="setup_password_explanation">Sizin Briar hesabınız internetda yox, cihazınızda şifrələnir. Şifrənizi unutursanız və ya Briar\'ı qaldırsanız, hesabınızı bərpa etmək üçün heç bir yol yoxdur. Uzun şifrə seçin. Və o şifrəni təxmin etmək çətin olan dörd təsadüfi sözdən və ya on təsadüfi hərfdən, nömrələrdən və simvollardan olması məsləhətdir.</string>
<string name="setup_doze_title">Fon qoşulmaları</string>
<string name="setup_doze_intro">Mesajları qəbul etmək üçün Briar arxa planda işləməlidir.</string>
<string name="setup_doze_explanation">Mesajları qəbul etmək üçün Briar arxa planda işləməlidir. Briar-ın xəttdə qalması üçün, batareya optimallaşdırmalarını söndürün</string>
<string name="setup_doze_button">Qoşulmalara izn ver</string>
<string name="choose_nickname">Nik seçin</string>
<string name="choose_password">Şifrə seçin</string>
<string name="confirm_password">Şifrəni təsdiq edin</string>
<string name="name_too_long">Adınız çox uzundur</string>
<string name="password_too_weak">Şifrə çox zəifdir</string>
<string name="passwords_do_not_match">Parollar uyğun deyil</string>
<string name="create_account_button">Hesab yaradın</string>
<string name="more_info">Digər məlumatlar</string>
<string name="don_t_ask_again">Bir daha soruşulmasın</string>
<string name="setup_huawei_text">Aşağıdakı düyməni basın və əmin olun ki, Briar \"Qorunan proqramlar\" ekranında qorunur.</string>
<string name="setup_huawei_button">Briar-ın qorunması</string>
<string name="setup_huawei_help">Briar qorunan tətbiqlər siyahısına əlavə olunmasa, arxa planda işləməyəcəkdir.</string>
<string name="warning_dozed">%sarxa planda işə düşmədi</string>
<!--Login-->
<string name="enter_password">Şifrə</string>
<string name="try_again">Şifrə yanlışdır, bir daha cəhd edin</string>
<string name="sign_in_button">Daxil ol</string>
<string name="forgotten_password">Mən şifrəni unutmuşam</string>
<string name="dialog_title_lost_password">Yaddan çıxmış şifrə</string>
<string name="dialog_message_lost_password">Sizin Briar hesabınız internetda yox, cihazınızda şifrələnir, ona görə biz onu silə bilmirik. Hesabı silib yenidən başlamaq istəyirsiniz? Diqqət: Sizin şəxsi məlumatlarınız, kontaktlarınız, məktublar  parametrlər silinəcək.</string>
<string name="startup_failed_notification_title">Briar başlamadı</string>
<string name="startup_failed_notification_text">Digər malumat üçün toxunun.</string>
<string name="startup_failed_activity_title">Başlama xətası</string>
<string name="startup_failed_db_error">Briar məlumat bazası nədənsə sıradan çıxıb. Hesabınız, məlumatlarınız və bütün əlaqələriniz itirilmişdır. Təəssüf ki, Briar\'ı yenidən bərpa etməli və ya \'Şifrəni unutmuşam\' seçərək yeni hesab yaratmalısınız.</string>
<string name="startup_failed_data_too_old_error">Hesabınız bu tətbiqin köhnə versiyası ilə yaradılmış və bu versiya ilə açıla bilməz. Parolu istəniləndə \'Mənim parolumu unutdum\' seçərək köhnə versiyanı yenidən bərpa etməli və ya yeni hesab yaratmalısınız</string>
<string name="startup_failed_data_too_new_error">Bu tətbiq çox köhnədir. Zəhmət olmasa ən son versiyaya keçin və yenidən cəhd edin</string>
<string name="startup_failed_service_error">Briar lazımi bir plugin qura bilmədi. Briarın yenidən qurulması bu problemi həll edir. Lakin, Briar sizin məlumatlarınızı saxlamaq üçün mərkəzi serverlərdən istifadə etmədikdən sonra hesabınızı və onunla əlaqəli bütün məlumatları itirəcəyinizi nəzərə alın.</string>
<plurals name="expiry_warning">
<item quantity="one">Bu Briar\'ın test versiyasıdır. Hesabınız %dgün ərzində sona çatacaq və yeniləmə mümkün deyil.</item>
<item quantity="other">Bu Briar\'ın test versiyasıdır. Hesabınız %dgün ərzində sona çatacaq və yeniləmə mümkün deyil.</item>
</plurals>
<string name="expiry_update">Testin sona çatma tarixi uzadıldı. Hesabınız testi %d gün ərzində sona çatacaq.</string>
<string name="expiry_date_reached">Bu proqram sona çatdı. Test üçün təşəkkür edirik!</string>
<string name="download_briar">Briar istifadə etməyə davam etmək üçün, 1.0 versiyasını yükləyin.</string>
<string name="create_new_account">Yeni bir hesab yaratmaq lazımdır, lakin eyni ləqəbi istifadə edə bilərsiniz.</string>
<string name="download_briar_button">Briar 1.0 yükləyin</string>
<string name="startup_open_database">Məlumatlar şifrədən açılması...</string>
<string name="startup_migrate_database">Məlumatların təzələnməsi...</string>
<string name="startup_compact_database">Məlumatın sıxılması...</string>
<!--Navigation Drawer-->
<string name="nav_drawer_open_description">Naviqasiya çekmecini açın</string>
<string name="nav_drawer_close_description">Naviqasiya çekməyini bağlayın</string>
<string name="contact_list_button">Kontaktlar</string>
<string name="groups_button">Şəxsi Qruplar</string>
<string name="forums_button">Forumlar</string>
<string name="blogs_button">Bloglar</string>
<!--This is part of the main menu. The app will be locked when this is tapped.-->
<string name="lock_button">Tətbiqetməni kilidlə</string>
<string name="settings_button">Quraşdırmalar</string>
<string name="sign_out_button">Çıxış</string>
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Briar-dan çıxdı</string>
<string name="reminder_notification_text">Daxil olmağınız üçün toxunun.</string>
<string name="reminder_notification_channel_title">Briar-a giriş haqqında xatırlama</string>
<string name="reminder_notification_dismiss">İmtina</string>
<string name="ongoing_notification_title">Briar-da imza olundu</string>
<string name="ongoing_notification_text">Briar-ı açmaq üçün toxunun</string>
<plurals name="private_message_notification_text">
<item quantity="one">Yeni şəxsi məktub</item>
<item quantity="other">%dyeni şəxsi məktub</item>
</plurals>
<plurals name="group_message_notification_text">
<item quantity="one">Yeni qrup məktubu</item>
<item quantity="other">%dyeni qrup məktubu</item>
</plurals>
<plurals name="forum_post_notification_text">
<item quantity="one">yeni forum postu.</item>
<item quantity="other">%dyeni forum postu.</item>
</plurals>
<plurals name="blog_post_notification_text">
<item quantity="one">yeni bloq postu</item>
<item quantity="other">%dyeni bloq postu</item>
</plurals>
<!--Misc-->
<string name="now">İndi</string>
<string name="show">Göstər</string>
<string name="hide">Gizlətmək</string>
<string name="ok">Oldu</string>
<string name="cancel">Ləğv et</string>
<string name="got_it">Anladım</string>
<string name="delete">Sil</string>
<string name="accept">Qəbul et</string>
<string name="decline">Azaldılma</string>
<string name="options">Seçimlər</string>
<string name="online">Online</string>
<string name="offline">Offline</string>
<string name="send">Göndər</string>
<string name="allow">Izn vermək</string>
<string name="open"></string>
<string name="no_data">Məlumat yoxdur</string>
<string name="ellipsis">...</string>
<string name="text_too_long">Daxil olunmuş mətn çox uzundur</string>
<string name="show_onboarding">Kömək dialoqunu göstərin</string>
<string name="fix">Düzəliş</string>
<string name="help">Yardım</string>
<string name="sorry">Bağışlayın</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Göstərmək üçün əlaqə yoxdur</string>
<string name="no_contacts_action">Kontakt əlavə etmək üçün + işarəsinə toxunun</string>
<string name="date_no_private_messages">Məktub yixdur.</string>
<string name="no_private_messages">Göstərmək üçün məktub yixdur</string>
<string name="message_hint">Mesaj yazın</string>
<string name="image_caption_hint">Mövzu əlavə edin (isteyə bağlı)</string>
<string name="image_attach">Şəkil əlavə edin</string>
<string name="image_attach_error">Şəkil əlavə edilmədi</string>
<string name="set_contact_alias">Kontakt adı dəyişdirin</string>
<string name="set_contact_alias_hint">Əlaqə adı</string>
<string name="set_alias_button">Dəyiş</string>
<string name="delete_contact">Kontakt silin</string>
<string name="dialog_title_delete_contact">Kontaktın silinməsini təsdiqləyin</string>
<string name="dialog_message_delete_contact">Bu kontaktı və bu kontaktla əvəzlənən bütün mesajları silmək istədiyinizə əminsinizmi?</string>
<string name="contact_deleted_toast">Kontakt silindi</string>
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
<string name="you">Siz</string>
<string name="save_image">Şəkili saxlamaq</string>
<string name="dialog_title_save_image">Şəkili saxlamaq?</string>
<string name="dialog_message_save_image">Bu görüntünün saxlanması digər tətbiqlərə daxil olmağa imkan verir. Saxlamaq istədiyinizə əminsinizmi?</string>
<string name="save_image_success">Şəkil saxlanıldı</string>
<string name="save_image_error">Şəkil saxlanılmadı</string>
<string name="dialog_title_no_image_support">Şəkillər mövcud deyil</string>
<string name="dialog_message_no_image_support">Sizin Briar kontaktınız hələlik şəkillər dəstəkləmir. Təkmilləşmədən sonra fərqli bir simvol görürsünüz.</string>
<string name="dialog_title_image_support">İndi bu kontakta şəkilləri göndərə bilərsiniz</string>
<string name="dialog_message_image_support">Şəkilləri əlavə etmək üçün bu simvola toxunun.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Kontaktlara əlavə etmək</string>
<string name="face_to_face">Kontakta əlavə etmək istədiyiniz şəxslə tanış olmalısınız. Bu, hər kəsin kimliyinizi və ya mesajlarınızı gələcəkdə oxumasını maneə törədir.</string>
<string name="continue_button">Davam et</string>
<string name="try_again_button">Yenidən cəhd elə</string>
<string name="waiting_for_contact_to_scan">Skan üçün əlaqə gözləyir və \u2026 qoşulur</string>
<string name="exchanging_contact_details">Əlaqə məlumatları mübadiləsi \u2026</string>
<string name="contact_added_toast">Kontakt eləvə edildi: %s</string>
<string name="contact_already_exists">Kontakt %s artıq mövcuddur</string>
<string name="qr_code_invalid">QR kodu yanlışdır</string>
<string name="qr_code_too_old">Skan etdiyiniz QR kodunun köhnə bir versiyası gəlir. %s dən ən son versiyaya keçməyi xahiş edin və daha sonra yenidən cəhd edin.</string>
<string name="qr_code_too_new">Skan etdiyiniz QR kodunun köhnə bir versiyası gəlir. %sdən ən son versiyaya keçməyi xahiş edin və daha sonra yenidən cəhd edin.</string>
<string name="camera_error">Kamera xətası</string>
<string name="connecting_to_device">Cihaza qoşulma /2026</string>
<string name="authenticating_with_device">Cihazla təsdiqlənir \u2026</string>
<string name="connection_error_title">Kontaktınıza qoşula bilmədi</string>
<string name="connection_error_explanation">Həmin Wi-Fi şəbəkəsinə qoşulduğunuzu yoxlayın.</string>
<string name="connection_error_feedback">Bu problem davam edərsə, tətbiqin təkmilləşdirilməsinə kömək etmək üçün rəy göndərin.</string>
<!--Introductions-->
<string name="introduction_onboarding_title">Kontaktınızı tanıtın</string>
<string name="introduction_onboarding_text">Kontaktlarınızı bir-birinizə təqdim edə bilərsiniz, lakin Briar-a qoşulmaq üçün şəxsən görüşmək lazım deyil.</string>
<string name="introduction_menu_item">Giriş edin</string>
<string name="introduction_activity_title">Kontakt seçin</string>
<string name="introduction_not_possible">Bu kontaktlara artıq bir girişiniz var. Xahiş edirik, bu işi bitirməyə icazə verin. Siz və ya kontaktlarınız nadir hallarda onlaynsa, bu bir az vaxt tələb edə bilər.</string>
<string name="introduction_message_title">Kontaktları təqdim edin</string>
<string name="introduction_message_hint">Mesaj əlavə et (istəyə bağlı)</string>
<string name="introduction_button">Şərh edin</string>
<string name="introduction_sent">Şərhiniz göndərildi.</string>
<string name="introduction_error">Şərhinizi gödərəndə xəta baş verdi.</string>
<string name="introduction_response_error">Cavab verərkən səhv</string>
<string name="introduction_request_sent">Siz %1$s-i %2$s-ə təqdim etmək istədiniz.</string>
<string name="introduction_request_received">%1$ssizi%2$s-ə təqdim etmək istədi. %2$s-i kontakt siyahınıza əlavə etmək istəyirsiniz?</string>
<string name="introduction_request_exists_received">%1$ssizi %2$s-ə tanıtmaq istədi, ancaq %2$s sizin kontaklarinizda var. %1$sbilənə qədər cavab verə bilərsiniz:</string>
<string name="introduction_request_answered_received">%1$ssizi %2$s-ə təqdim etmək istədi.</string>
<string name="introduction_response_accepted_sent">%1$s-ə qəbul olundunuz</string>
<string name="introduction_response_declined_sent">%1$s-ə girişdən imtina etdiniz</string>
<plurals name="introduction_notification_text">
<item quantity="one">yeni kontaktlar əlavə edildi.</item>
<item quantity="other">%dyeni kontaktlar əlavə edildi.</item>
</plurals>
<!--Private Groups-->
<string name="groups_list_empty">Göstərmək üçün heç bir qrup</string>
<string name="groups_list_empty_action">Bir qrup yaratmaq üçün + simvoluna toxunun və ya kontaktlarınızı sizinlə bölüşmək üçün əlaqə saxlayın</string>
<string name="groups_created_by">%s yaratdı</string>
<plurals name="messages">
<item quantity="one">%dmesaj</item>
<item quantity="other">%dmesaj</item>
</plurals>
<string name="groups_group_is_empty">Bu qrup boşdur</string>
<string name="groups_group_is_dissolved">Bu qrup ləğv edildi</string>
<string name="groups_remove">Sil</string>
<string name="groups_create_group_title">Şəxsi qrup yaratmaq</string>
<string name="groups_create_group_button">Qrup yaratmaq</string>
<string name="groups_create_group_invitation_button">Dəvət göndər</string>
<string name="groups_create_group_hint">Şəxsi qrupunuz üçün ad seçin</string>
<string name="groups_invitation_sent">Qrup dəvəti göndərildi</string>
<string name="groups_member_list">Üzv siyahısı</string>
<string name="groups_invite_members">Üzvləri dəvət et</string>
<string name="groups_member_created_you">Siz qrup yaratdınız</string>
<string name="groups_member_created">%sqrup yaratdı</string>
<string name="groups_member_joined_you">Siz qrupa qoşuldunuz</string>
<string name="groups_member_joined">%sqrupa qatıldı</string>
<string name="groups_leave">Qrupu tərk etmək</string>
<string name="groups_leave_dialog_title">Qrupu tərk et</string>
<string name="groups_leave_dialog_message">Bu qrupu tərk etmək istədiyinizə əminsinizmi?</string>
<string name="groups_dissolve">Qrupu braxın</string>
<string name="groups_dissolve_dialog_title">Qrupun braxmasını təsdiqləyin</string>
<string name="groups_dissolve_dialog_message">Bu qrupu ləğv etmək istədiyinizə əminsinizmi? Bütün üzvlər söhbətlərinə davam edə bilməyəcək və ən son mesajı ala bilməyəcəklər.</string>
<string name="groups_dissolve_button">Braxın</string>
<string name="groups_dissolved_dialog_title">Qrup braxıldı</string>
<string name="groups_dissolved_dialog_message">Bu qrupun yaradıcısı onu ləğv etdi. Siz qrupa mesaj yaza bilməyəcəksiniz və yazılmış bütün yazıları ala bilməyəcəksiniz.</string>
<!--Private Group Invitations-->
<string name="groups_invitations_title">Qrup dəvətləri</string>
<string name="groups_invitations_joined">Qrupa qoşuldu</string>
<string name="groups_invitations_declined">Qrup dəvətləri azaldı</string>
<plurals name="groups_invitations_open">
<item quantity="one">%daçıq qrup dəvətləri</item>
<item quantity="other">%daçıq qrup dəvətləri</item>
</plurals>
<string name="sharing_status_groups">Yalnız yaradıcı qrupa yeni üzvləri dəvət edə bilər. Aşağıda qrupun bütün üzvləri iştirak edir.</string>
<!--Private Groups Revealing Contacts-->
<string name="groups_reveal_contacts">Kontaktları aşkar edin</string>
<string name="groups_reveal_dialog_message">Bu qrupun bütün mövcud və gələcək üzvlərinə kontaktların aşkarlanıb veriləcəyini seçə bilərsiniz. \n\n Kontaktları geri götürmək, qrupun yaradıcısı olsa da, aşkar əlaqələrlə ünsiyyət qura biləcəyiniz üçün qrupla əlaqənizi daha sürətli və daha etibarlı edir.</string>
<string name="groups_reveal_visible">Kontakt qrupda görünə bilər</string>
<string name="groups_reveal_visible_revealed_by_us">Kontakt əlaqəsi qrupda görür</string>
<string name="groups_reveal_invisible">Kontakt əlaqəsi qrup üçün görünmür</string>
<!--Forums-->
<string name="no_forums">Göstərmək üçün forum yoxdur</string>
<string name="no_forums_action">Bir forum yaratmaq üçün + simgesinə toxunun və ya kontaktlarinizi forumları sizinlə bölüşmək üçün xahiş edin</string>
<string name="create_forum_title">Forum yarat</string>
<string name="choose_forum_hint">Forum üçün ad seçin</string>
<string name="create_forum_button">Forum yarat</string>
<string name="forum_created_toast">Forum yaradıldı</string>
<string name="no_forum_posts">Göstərilməyən post yoxdur</string>
<string name="no_posts">Post yoxdur</string>
<plurals name="posts">
<item quantity="one">%dpost</item>
<item quantity="other">%dpost</item>
</plurals>
<string name="forum_new_message_hint">Yeni post</string>
<string name="forum_message_reply_hint">yeni cavab</string>
<string name="btn_reply">Cavab ver</string>
<string name="forum_leave">Forumdan çıxın</string>
<string name="dialog_title_leave_forum">Forumdan çıxışı təsdiqləyin</string>
<string name="dialog_message_leave_forum">Bu forumu tərk etmək istədiyinizə əminsinizmi? \n\n Bu forumu paylaşdığınız hər hansı əlaqələr yenilikləri almağa davam edə bilər.</string>
<string name="dialog_button_leave">Buraxın</string>
<string name="forum_left_toast">Sol forum</string>
<!--Forum Sharing-->
<string name="forum_share_button">Forumu paylaş</string>
<string name="contacts_selected">Kontaktlar seçildi</string>
<string name="activity_share_toolbar_header">Kontaktlar seçin</string>
<string name="no_contacts_selector">Göstərmək üçün əlaqə yoxdur</string>
<string name="no_contacts_selector_action">Kontakt əlavə etdikdən sonra bura qayıdın</string>
<string name="forum_shared_snackbar">Forum seçilmiş kontaktlarla paylaşıldı</string>
<string name="forum_share_message">Mesaj əlavə et (istəyə bağlı)</string>
<string name="forum_share_error">Bu forumu paylaşan zaman bir səhv oldu. </string>
<string name="forum_invitations_title">Forum dəvətləri</string>
<string name="forum_invitation_exists">Bu foruma artıq bir dəvət qəbul etdiniz. \n\nDaha dəvətnamələr qəbul edərək foruma daha sürətli və daha etibarlı bir əlaqə yaradacaqsınız.</string>
<string name="forum_joined_toast">Foruma qoşul</string>
<string name="forum_declined_toast">Dəvət azalıb</string>
<string name="shared_by_format">Paylaşdı %silə</string>
<string name="forum_invitation_already_sharing">Artıq paylaşırıq</string>
<string name="sharing_status">Paylaşma statusu</string>
<string name="sharing_status_forum">Bir forumun hər hansı bir üzvü onu əlaqə ilə paylaşa bilər. Bu forumu aşağıdakı əlaqələrlə bölüşürsünüz. Görməyən digər üzvlər də ola bilər.</string>
<string name="nobody">Heçkəs</string>
<!--Blogs-->
<string name="blogs_other_blog_empty_state">Göstərilməyən post yoxdur</string>
<string name="read_more">daha çox oxu</string>
<string name="blogs_write_blog_post">Blog postu yaz</string>
<string name="blogs_write_blog_post_body_hint">Blog yazınızı yazın</string>
<string name="blogs_publish_blog_post">Yayımlamaq</string>
<string name="blogs_blog_post_created">Blog yazı yaradılıb</string>
<string name="blogs_blog_post_received">Yeni blog mesajı qlındı</string>
<string name="blogs_blog_post_scroll_to">Gedin</string>
<string name="blogs_feed_empty_state">Göstərilməyən post yoxdur</string>
<string name="blogs_feed_empty_state_action">Abunə olduğunuz əlaqələrinizdən və bloglarınızdan gələn mesajlar burada görünəcək \n\n bir yazı yazmaq üçün qələm simgesinə toxunun</string>
<string name="blogs_remove_blog">Bloqu sil</string>
<string name="blogs_remove_blog_dialog_message">Bu blogu silmək istədiyinizə əminsinizmi? \n\n Onalarınız cihazınızdan silinəcək, lakin digər cihazların cihazlarından silinəcəkdir. \n\n Bu blogu paylaşdığınız hər hansı əlaqələr yenilikləri almağa davam edə bilər.</string>
<string name="blogs_remove_blog_ok">Sil</string>
<string name="blogs_blog_removed">Bloq silindi</string>
<string name="blogs_reblog_comment_hint">Şərh əlavə et (istəyə bağlı)</string>
<string name="blogs_reblog_button">Rebloq</string>
<!--Blog Sharing-->
<string name="blogs_sharing_share">Blogu paylaş</string>
<string name="blogs_sharing_error">Bu blogu paylaşan zaman bir səhv oldu.</string>
<string name="blogs_sharing_button">Blogu paylaş</string>
<string name="blogs_sharing_snackbar">Blog seçilmiş kontaktlarla paylaşdı</string>
<string name="blogs_sharing_invitations_title">Blog dəvətləri</string>
<string name="blogs_sharing_joined_toast">Bloga abunə olundu</string>
<string name="blogs_sharing_declined_toast">Dəvət azalıb</string>
<!--RSS Feeds-->
<string name="blogs_rss_feeds_import">RSS Feed idxalı</string>
<string name="blogs_rss_feeds_import_button">İdxal</string>
<string name="blogs_rss_feeds_import_error">Üzr istəyirik! Feed-inizdə idxal bir xəta baş verdi.</string>
<string name="blogs_rss_feeds_manage">RSS Feeds idarəetmə</string>
<string name="blogs_rss_feeds_manage_imported">İdxal olundu:</string>
<string name="blogs_rss_feeds_manage_author">Müəllif:</string>
<string name="blogs_rss_feeds_manage_updated">Son yeniləmə:</string>
<string name="blogs_rss_remove_feed">Feed\'i sil</string>
<string name="blogs_rss_remove_feed_ok">Sil</string>
<string name="blogs_rss_feeds_manage_delete_error">Feed silinmədi</string>
<string name="blogs_rss_feeds_manage_empty_state">Xeyr RSS əks etdirmir\n\nİdxal etmək üçün + düyməsinə toxunun</string>
<string name="blogs_rss_feeds_manage_error">Kanal yükləmədə bir problem var. Zəhmət olmasa bir az sonra yenə cəhd edin.</string>
<!--Settings Display-->
<string name="pref_language_title">Dil və region</string>
<string name="pref_language_changed">Briar-ı yenidən başlatdığınızda bu parametr qüvvəyə minir. Lütfən çıxın və Briar-ı yenidən başladın.</string>
<string name="pref_language_default">System default</string>
<string name="display_settings_title">Görüntü</string>
<string name="pref_theme_title">Tema</string>
<string name="pref_theme_light"></string>
<string name="pref_theme_dark">Tünd</string>
<string name="pref_theme_auto">Avtomatik (Gündüz)</string>
<string name="pref_theme_system">Sistem Olduğu kimi</string>
<!--Settings Network-->
<string name="network_settings_title">Şəbəkələr</string>
<string name="bluetooth_setting">Bluetooth-la bağlantı</string>
<string name="bluetooth_setting_enabled">Kontaktlar yaxın olduqda</string>
<string name="bluetooth_setting_disabled">Yalnız kontakt əlavə edərkən</string>
<string name="tor_network_setting">İnternet (Tor)-la qoşulma</string>
<string name="tor_network_setting_automatic">Yerə görə avtomatik olaraq</string>
<string name="tor_network_setting_without_bridges">Köprü olmadan Tor-u istifadə edin</string>
<string name="tor_network_setting_with_bridges">Tor ilə körpülərdən istifadə edin</string>
<string name="tor_network_setting_never">Qoşulmamaq</string>
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_mobile_data_title">Mobil interneti istifadə etmək</string>
<string name="tor_only_when_charging_title">Yalnız şarj edərkən İnternet (Tor) vasitəsilə qoşun</string>
<string name="tor_only_when_charging_summary">Cihaz batareyadan işləyərkən internet bağlantısını kəsir</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Təhlükəsizlik</string>
<string name="pref_lock_title">Tətbiq kilidi</string>
<string name="pref_lock_timeout_title">Tətbiq kilidinin hərəkətsizlik müddəti</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<!--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 dəqiqə</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_5">5 dəqiqə</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_15">15 dəqiqə</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_30">30 dəqiqə</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_60">1 saat</string>
<string name="pref_lock_timeout_never">Heç vaxt</string>
<string name="pref_lock_timeout_never_summary">Briar-ı avtomatik olaraq kilidləməyin</string>
<string name="change_password">Şifrəni dəyiş</string>
<string name="current_password">Hazırkı şifrə</string>
<string name="choose_new_password">Yeni parol</string>
<string name="confirm_new_password">Yeni şifrəni təsdiq et</string>
<string name="password_changed">Şifrə dəyişdi.</string>
<string name="panic_setting">Təhlükə düyməsini quraşdırılması </string>
<string name="panic_setting_title">Təhlükə düyməsi</string>
<string name="panic_setting_hint">Təhlükə düyməsini işə salarkən Briarın necə reaksiya verəcəyini konfiqurasiya edin</string>
<string name="panic_app_setting_title">Təhlükə tətgiq düyməsi</string>
<string name="unknown_app">Naməlum bir tətbiq</string>
<string name="panic_app_setting_summary">Heç bir tətbiq quraşdırılmadı</string>
<string name="panic_app_setting_none">Heç biri</string>
<string name="dialog_title_connect_panic_app">Təhlükəli tətbiqi təsdiq edin</string>
<string name="panic_setting_destructive_action">Təhlükəli hərəkətlər</string>
<string name="panic_setting_signout_title">Çıxış</string>
<string name="purge_setting_title">Hesabı sil</string>
<string name="uninstall_setting_title">Briar-i sil</string>
<!--Settings Notifications-->
<string name="notification_settings_title">Bildirişler</string>
<string name="notify_private_messages_setting_title">Şəxsi ismarışlar</string>
<string name="notify_group_messages_setting_title">Qrup mesajlar</string>
<string name="notify_forum_posts_setting_title">Forumun postları </string>
<string name="notify_blog_posts_setting_title">Bloq postları</string>
<string name="notify_blog_posts_setting_summary">Blog yazıları üçün siqnallar göstərin</string>
<string name="notify_blog_posts_setting_summary_26">Blog yazıları üçün siqnallar düzəldin</string>
<string name="notify_vibration_setting">Vibrasiya</string>
<string name="notify_sound_setting">Səs</string>
<string name="notify_sound_setting_default">Standart zəng melodiyası</string>
<string name="notify_sound_setting_disabled">Heç biri</string>
<string name="choose_ringtone_title">Zəng tonunu seçin</string>
<string name="cannot_load_ringtone">Zəng tonu yüklənmir</string>
<!--Settings Feedback-->
<string name="feedback_settings_title">Şərh</string>
<string name="send_feedback">Rəy göndər</string>
<!--Link Warning-->
<string name="link_warning_title">Bağlantı xəbərdarlığı</string>
<string name="link_warning_intro">Xarici tətbiq ilə aşağıdakı linki açmaq istəyirsən.</string>
<string name="link_warning_text">Bu sizi tanımaq üçün istifadə edilə bilər. Sizə bu link göndərən adama etibar edirsinizmi? Bu linki Tor Browserda açmaq məsləhət görülür. </string>
<string name="link_warning_open_link">Link-i aç</string>
<!--Crash Reporter-->
<string name="crash_report_title">Briar qəza göndərişi</string>
<string name="briar_crashed">Bağışlayın, Briar qəzaya uğrayıb.</string>
<string name="not_your_fault">Bu sizin günahınız deyil.</string>
<string name="please_send_report">Xahiş edirik bizə bir qəza hesabatı göndərərək daha yaxşı bir Briar qurmamıza kömək edin.</string>
<string name="report_is_encrypted">Hesabatın şifrələndiyini və təhlükəsiz olaraq göndərildiyinə əmin edirik.</string>
<string name="feedback_title">Şərh</string>
<string name="describe_crash">Nə baş verdiyini təsvir edin (istəyə bağlıdır)</string>
<string name="enter_feedback">Rəyinizi yazın</string>
<string name="optional_contact_email">Sizim elektron ünvanınız (istəyinizə bağlıdır)</string>
<string name="include_debug_report_crash">Cədvəl haqqında anonim məlumatları əlavə edin</string>
<string name="include_debug_report_feedback">Bu cihaz haqqında anonim məlumatları əlavə edin</string>
<string name="could_not_load_report_data">Hesabat yüklənə bilmədi.</string>
<string name="send_report">Hesabat göndər</string>
<string name="close">Bağla</string>
<string name="dev_report_saved">Hesabat saxlandı. Briar-a növbəti dəfə daxil olduqda göndəriləcək.</string>
<!--Sign Out-->
<!--Screen Filters & Tapjacking-->
<string name="screen_filter_title">Ekran örtüyü aşkarlandı</string>
<string name="screen_filter_allow">Bu tətbiqlərin yuxarı çəkilməsinə icazə verin</string>
<!--Permission Requests-->
<string name="permission_camera_title">Camera izni</string>
<string name="permission_location_title">Mövqe icazəsi</string>
<string name="permission_camera_location_title">Kamera və mövqe</string>
<string name="qr_code">QR kodu</string>
<string name="show_qr_code_fullscreen">QR kodu tam ekranda göstər</string>
<!--App Locking-->
<string name="lock_unlock">Briar kilidini aç</string>
<string name="lock_unlock_verbose">Briar kilidini açmaq üçün cihazınızın PİN, naxış və ya parolunuzu daxil edin</string>
<string name="lock_unlock_fingerprint_description">Davam etmək üçün qeyd olunan barmaq ilə barmaq izinizi sensorunuza toxunun</string>
<string name="lock_unlock_password">Şifrəni istifadə edin</string>
<string name="lock_is_locked">Briar kilidləndi</string>
<string name="lock_tap_to_unlock">Kilidi açmaq üçün toxunun</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alisa</string>
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_bob">Bob</string>
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_carol">Kerol</string>
<!--This is a message to be used in screenshots. Please use the same translation for Bob!-->
<string name="screenshot_message_1">Salam Bob!</string>
<!--This is a message to be used in screenshots. Please use the same translation for Alice!-->
<string name="screenshot_message_2">Salam Alice! Briar haqqında danışdığınız üçün təşəkkür edirik!</string>
<!--This is a message to be used in screenshots.-->
<string name="screenshot_message_3">Problem yoxdur, bunu ümüd edirəm 😀</string>
</resources>

View File

@@ -116,9 +116,6 @@
<string name="date_no_private_messages">Sense missatges.</string>
<string name="no_private_messages">No hi ha cap missatge</string>
<string name="message_hint">Escriviu un missatge</string>
<string name="image_caption_hint">Afegeix una captura (opcional)</string>
<string name="image_attach">Afegeix una imatge</string>
<string name="image_attach_error">La imatge no s\'ha pogut afegir </string>
<string name="set_contact_alias">Canvia el nom del contacte</string>
<string name="set_contact_alias_hint">Nom del contacte</string>
<string name="set_alias_button">Canvia</string>
@@ -127,17 +124,6 @@
<string name="dialog_message_delete_contact">Segur que voleu suprimir aquest contacte i tots els missatges que us heu intercanviat?</string>
<string name="contact_deleted_toast">S\'ha suprimit el contacte</string>
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
<string name="you">Vos</string>
<string name="save_image">Desa imatge</string>
<string name="dialog_title_save_image">Voleu desar la imatge?</string>
<string name="dialog_message_save_image">Desant aquesta imatge es permetrà a altres aplicacions accedir-hi.\n\nConfirmeu que la voleu desar?</string>
<string name="save_image_success">La imatge s\'ha desat</string>
<string name="save_image_error">La imatge no s\'ha pogut desar </string>
<string name="dialog_title_no_image_support">Cap imatge disponible</string>
<string name="dialog_message_no_image_support">El vostre contacte de Briar encara no admet afegir imatges.
Un cop s\'actualitzi ja li veureu una icona diferent </string>
<string name="dialog_title_image_support">Ara podeu enviar imatges a aquest contacte</string>
<string name="dialog_message_image_support">Premeu aquesta icona per afegir imatges.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Afegiu un contacte</string>
<string name="face_to_face">Heu de coincidir en el mateix lloc amb la persona que voleu afegir com a contacte.\n\nD\'aquesta manera evitareu que algú suplanti les vostres identitats o pugui llegir els vostres missatges en el futur.</string>
@@ -198,6 +184,7 @@ Un cop s\'actualitzi ja li veureu una icona diferent </string>
<string name="groups_create_group_invitation_button">Envia una invitació</string>
<string name="groups_create_group_hint">Trieu un nom per al vostre grup privat</string>
<string name="groups_invitation_sent">S\'ha enviat la invitació del grup</string>
<string name="groups_message_sent">Missatge enviat</string>
<string name="groups_member_list">Llista de membres</string>
<string name="groups_invite_members">Convida a nous membres</string>
<string name="groups_member_created_you">Heu creat el grup</string>
@@ -248,6 +235,7 @@ Un cop s\'actualitzi ja li veureu una icona diferent </string>
<item quantity="one">%d publicacio</item>
<item quantity="other">%d apunts</item>
</plurals>
<string name="forum_new_entry_posted">S\'ha publicat l\'apunt al fòrum</string>
<string name="forum_new_message_hint">Apunt nou</string>
<string name="forum_message_reply_hint">Resposta nova</string>
<string name="btn_reply">Respon</string>
@@ -355,8 +343,6 @@ Un cop s\'actualitzi ja li veureu una icona diferent </string>
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automàtic: %1$s (en %2$s)</string>
<string name="tor_mobile_data_title">Usa dades mòbils</string>
<string name="tor_only_when_charging_title">Connecta a través d\'Internet (Tor) només quan s\'estigui carregant</string>
<string name="tor_only_when_charging_summary">Desactiva la connexió a Internet quan el dispositiu estigui funcionant amb la bateria</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Seguretat</string>
<string name="pref_lock_title">Bloqueig de l\'aplicació</string>
@@ -426,7 +412,7 @@ Un cop s\'actualitzi ja li veureu una icona diferent </string>
<!--Link Warning-->
<string name="link_warning_title">Avís d\'enllaç</string>
<string name="link_warning_intro">L\'enllaç s\'obrirà amb una aplicació externa.</string>
<string name="link_warning_text">Això es podria utilitzar-se per identificar-vos. Penseu si confieu en la persona que us ha enviat aquest enllaç i considereu obrir-lo amb el navegador Tor.</string>
<string name="link_warning_text">Això podria usar-se per a identificar-vos. Penseu si us en refieu prou de la persona que us ha enviat l\'enllaç. Avalueu si us convindria obrir-lo amb un navegador que faciliti l\'anonimat com Orfox.</string>
<string name="link_warning_open_link">Obre l\'enllaç</string>
<!--Crash Reporter-->
<string name="crash_report_title">Informe de fallida de Briar</string>

View File

@@ -8,7 +8,7 @@
<string name="setup_password_explanation">Dein Briar-Konto wird verschlüsselt auf deinem Gerät und nicht in der Cloud gespeichert. Wenn du dein Passwort vergisst oder Briar deinstallierst, gibt es keine Möglichkeit, dein Konto wiederherzustellen.\n\nWähle ein langes Passwort, das schwer zu erraten ist, z.B. vier zufällige Wörter oder zehn zufällige Buchstaben, Zahlen und Symbole.</string>
<string name="setup_doze_title">Hintergrundverbindungen</string>
<string name="setup_doze_intro">Um Nachrichten zu empfangen, muss Briar im Hintergrund verbunden bleiben.</string>
<string name="setup_doze_explanation">Um Nachrichten zu empfangen, muss Briar im Hintergrund verbunden bleiben. Bitte deaktiviere die Akkuoptimierungen, damit Briar in Verbindung bleiben kann.</string>
<string name="setup_doze_explanation">Um Nachrichten zu empfangen, muss Briar im Hintergrund verbunden bleiben. Bitte deaktiviere die Batterieoptimierungen, damit Briar in Verbindung bleiben kann.</string>
<string name="setup_doze_button">Erlaube Verbindungen</string>
<string name="choose_nickname">Wähle deinen Benutzernamen</string>
<string name="choose_password">Wähle dein Passwort</string>
@@ -66,7 +66,7 @@
<string name="transport_lan">WLAN</string>
<!--Notifications-->
<string name="reminder_notification_title">Von Briar abgemeldet</string>
<string name="reminder_notification_text">Tippe, um dich wieder anzumelden.</string>
<string name="reminder_notification_text">Tippe, um dich wieder anzumelden</string>
<string name="reminder_notification_channel_title">Briar Anmeldeerinnerung</string>
<string name="reminder_notification_dismiss">Verwerfen</string>
<string name="ongoing_notification_title">In Briar angemeldet</string>
@@ -93,7 +93,7 @@
<string name="hide">Ausblenden</string>
<string name="ok">OK</string>
<string name="cancel">Abbrechen</string>
<string name="got_it">Verstanden</string>
<string name="got_it">Okay, verstanden.</string>
<string name="delete">Löschen</string>
<string name="accept">Annehmen</string>
<string name="decline">Ablehnen</string>
@@ -105,7 +105,7 @@
<string name="open">Öffnen</string>
<string name="no_data">Keine Daten</string>
<string name="ellipsis"></string>
<string name="text_too_long">Der eingegebene Text ist zu lang</string>
<string name="text_too_long">Der eingegebene Text ist leider zu lang</string>
<string name="show_onboarding">Hilfe anzeigen</string>
<string name="fix">Behoben</string>
<string name="help">Hilfe</string>
@@ -130,13 +130,9 @@
<string name="you">Sie</string>
<string name="save_image">Bild speichern</string>
<string name="dialog_title_save_image">Bild speichern?</string>
<string name="dialog_message_save_image">Gespeicherte Bilder können von vielen anderen Apps eingesehen werden.\n\nBist du sicher, dass du das Bild speichern möchtest?</string>
<string name="dialog_message_save_image">Gespeicherte Bilder können von vielen anderen Apps eingesehen werden.\n\nBist Du sicher, dass Du das Bild speichern möchtest?</string>
<string name="save_image_success">Bild wurde gespeichert.</string>
<string name="save_image_error">Konnte Bild nicht speichern.</string>
<string name="dialog_title_no_image_support">Bilder nicht verfügbar</string>
<string name="dialog_message_no_image_support">Der Briar deines Kontakts unterstützt noch keine Bildanhänge. Sobald die Aktualisierung abgeschlossen ist, siehst du ein anderes Symbol.</string>
<string name="dialog_title_image_support">Du kannst nun Bilder an diesen Kontakt senden</string>
<string name="dialog_message_image_support">Tippe auf das Symbol, um Bilder anzuhängen.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Kontakt hinzufügen</string>
<string name="face_to_face">Um einen neuen Kontakt hinzuzufügen, ist es notwendig, dass sich beide Kontakte an einem Ort treffen.\n\nDadurch wird betrügerische Identitätsvortäuschung und unautorisierter Kommunikationszugriff verhindert.</string>
@@ -147,8 +143,8 @@
<string name="contact_added_toast">Kontakt hinzugefügt: %s</string>
<string name="contact_already_exists">Kontakt %s existiert bereits</string>
<string name="qr_code_invalid">Der QR-Code ist ungültig</string>
<string name="qr_code_too_old">Der QR-Code, den du eingescannt hast, kommt von einer älteren Version von %s.\n\nBitte deinen Kontakt, zur neuesten Version upzudaten, und probiere es erneut.</string>
<string name="qr_code_too_new">Der QR-Code, den du gescannt hast, kommt von einer neueren Version von .\n\nBitte update %s auf die neueste Version und versuche es erneut.</string>
<string name="qr_code_too_old">Der QR-Code, den Du eingescannt hast, kommt von einer älteren Version von %s.\n\nBitte deinen Kontakt, zur neuesten Version upzudaten, und probiere es erneut.</string>
<string name="qr_code_too_new">Der QR-Code, den Du gescannt hast, kommt von einer neueren Version von .\n\nBitte update %s auf die neueste Version und versuche es erneut.</string>
<string name="camera_error">Kamerafehler</string>
<string name="connecting_to_device">Verbinde mit Gerät\u2026</string>
<string name="authenticating_with_device">Authentifiziere Gerät\u2026</string>
@@ -194,9 +190,10 @@
<string name="groups_remove">Entfernen</string>
<string name="groups_create_group_title">Private Gruppe erstellen</string>
<string name="groups_create_group_button">Gruppe erstellen</string>
<string name="groups_create_group_invitation_button">Einladung senden</string>
<string name="groups_create_group_invitation_button">Einladung schicken</string>
<string name="groups_create_group_hint">Wähle einen Namen für deine private Gruppe</string>
<string name="groups_invitation_sent">Gruppeneinladung wurde versendet</string>
<string name="groups_invitation_sent">Gruppeneinladung versendet</string>
<string name="groups_message_sent">Nachricht gesendet</string>
<string name="groups_member_list">Mitgliederliste</string>
<string name="groups_invite_members">Mitglieder einladen</string>
<string name="groups_member_created_you">Du hast diese Gruppe erstellt</string>
@@ -211,7 +208,7 @@
<string name="groups_dissolve_dialog_message">Willst du wirklich diese Gruppe auflösen?\n\nAlle anderen Mitglieder können ihre Unterhaltung nicht fortsetzen und erhalten möglicherweise nicht die neuesten Nachrichten.</string>
<string name="groups_dissolve_button">Auflösen</string>
<string name="groups_dissolved_dialog_title">Gruppe wurde aufgelöst</string>
<string name="groups_dissolved_dialog_message">Der Ersteller dieser Gruppe hat diese aufgelöst.\n\nEs können keine weiteren Nachrichten mehr in dieser Gruppe geschrieben werden und möglicherweise wurden noch nicht alle Nachrichten empfangen.</string>
<string name="groups_dissolved_dialog_message">Der Ersteller dieser Gruppe hat dieselbe aufgelöst.\n\nEs können keine weiteren Nachrichten mehr in dieser Gruppe geschrieben werden und möglicherweise wurden noch nicht alle Nachrichten empfangen.</string>
<!--Private Group Invitations-->
<string name="groups_invitations_title">Gruppeneinladungen</string>
<string name="groups_invitations_invitation_sent">%1$s wurde in die Gruppe \"%2$s\" eingeladen.</string>
@@ -223,9 +220,9 @@
<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_declined_sent">Du hast die Gruppeneinladung abgelehnt von %s abgelehnt.</string>
<string name="groups_invitations_response_declined_sent">Gruppeneinladung von %s abgelehnt.</string>
<string name="groups_invitations_response_accepted_received">%s hat die Einladung zur Gruppe angenommen.</string>
<string name="groups_invitations_response_declined_received">%s hat die Gruppeneinladung abgelehnt.</string>
<string name="groups_invitations_response_declined_received">%s hat die Einladung zur Gruppe abgelehnt.</string>
<string name="sharing_status_groups">Nur der Ersteller kann neue Mitglieder zu einer Gruppe einladen. Hier werden alle aktuellen Mitglieder dieser Gruppe angezeigt.</string>
<!--Private Groups Revealing Contacts-->
<string name="groups_reveal_contacts">Kontakte teilen</string>
@@ -247,6 +244,7 @@
<item quantity="one">%d Beitrag</item>
<item quantity="other">%d Beiträge</item>
</plurals>
<string name="forum_new_entry_posted">Beitrag im Forum veröffentlicht</string>
<string name="forum_new_message_hint">Neuer Beitrag</string>
<string name="forum_message_reply_hint">Neue Antwort</string>
<string name="btn_reply">Antworten</string>
@@ -272,10 +270,10 @@
<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 Forumseinladung von %s akzeptiert.</string>
<string name="forum_invitation_response_declined_sent">Du hast die Forumeinladung von %s abgelehnt.</string>
<string name="forum_invitation_response_accepted_received">%s hat die Forumeinladung angenommen.</string>
<string name="forum_invitation_response_declined_received">%s hat die Forumeinladung abgelehnt.</string>
<string name="forum_invitation_response_accepted_received">%s hat die Forumeinladung akzeptiert.</string>
<string name="forum_invitation_response_declined_received">%s hat die Forumseinladung abgelehnt.</string>
<string name="sharing_status">Freigabestatus</string>
<string name="sharing_status_forum">Jedes Mitglied eines Forums kann dieses mit seinen Kontakten teilen. Du teilst dieses Forum mit den folgenden Kontakten. Möglicherweise gibt es Mitglieder die nicht sichtbar sind.</string>
<string name="shared_with">Geteilt mit %1$d (%2$d online)</string>
@@ -306,9 +304,9 @@
<string name="blogs_sharing_error">Es gab einen Fehler beim Versuch, diesen Blog zu teilen.</string>
<string name="blogs_sharing_button">Blog teilen</string>
<string name="blogs_sharing_snackbar">Blog wurde mit ausgewählten Kontakten geteilt</string>
<string name="blogs_sharing_response_accepted_sent">Du hast die Blogeinladung von %s angenommen.</string>
<string name="blogs_sharing_response_accepted_sent">Du hast die Blogeinladung von %s akzeptiert.</string>
<string name="blogs_sharing_response_declined_sent">Du hast die Blogeinladung von %s abgelehnt.</string>
<string name="blogs_sharing_response_accepted_received">%s hat die Blogeinladung angenommen.</string>
<string name="blogs_sharing_response_accepted_received">%s hat die Blogeinladung akzeptiert.</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>
@@ -354,14 +352,10 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automatisch: %1$s (in %2$s)</string>
<string name="tor_mobile_data_title">Mobile Daten benutzen</string>
<string name="tor_only_when_charging_title">Verbindung über Internet (Tor) nur während des Ladevorgangs herstellen</string>
<string name="tor_only_when_charging_summary">Deaktiviert die Internetverbindung, wenn das Gerät mit Akku betrieben wird</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Sicherheit</string>
<string name="pref_lock_title">App-Sperre</string>
<string name="pref_lock_summary">Systemsperrbildschirm benutzen um Briar zu schützen, während angemeldet</string>
<string name="pref_lock_disabled_summary">Um dieses Feature zu benutzen, aktiviere den Systemsperrbildschirm</string>
<string name="pref_lock_timeout_title">Zeitlimit der Inaktivität für die App-Sperr-Funktion</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Briar automatisch nach %s sperren, wenn unbenutzt.</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -425,7 +419,7 @@
<!--Link Warning-->
<string name="link_warning_title">Link-Warnung</string>
<string name="link_warning_intro">Du willst folgenden Link mit einer externen App öffnen.</string>
<string name="link_warning_text">Dies kann zu deiner Identifizierung benutzt werden. Überlege, ob die Person, die dir diesen Link geschickt hat, vertrauenswürdig ist und ob du ihn nicht besser mit dem Tor Browser öffnest.</string>
<string name="link_warning_text">Dies kann zu deiner Identifzierung benutzt werden. Überlege, ob die Person, die dir diesen Link geschickt hat, vertrauenswürdig ist und ob du ihn nicht besser mit Orfox öffnest.</string>
<string name="link_warning_open_link">Link öffnen</string>
<!--Crash Reporter-->
<string name="crash_report_title">Briar-Absturzbericht</string>
@@ -453,9 +447,9 @@
<string name="permission_camera_title">Berechtigung Kamera</string>
<string name="permission_camera_request_body">Um den QR-Code zu scannen, benötigt Briar Zugriff auf die Kamera.</string>
<string name="permission_location_title">Berechtigung Standort</string>
<string name="permission_location_request_body">Um Bluetooth-Geräte zu finden, braucht Briar Zugriff auf deinen Standort.\n\nBriar speichert weder deinen Standort noch gibt es ihn an andere weiter.</string>
<string name="permission_location_request_body">Um Bluetooth-Geräte zu finden, braucht Briar Zugriff auf Deinen Standort.\n\nBriar speichert weder Deinen Standort noch gibt es ihn an andere weiter.</string>
<string name="permission_camera_location_title">Kamera und Standort</string>
<string name="permission_camera_location_request_body">Um den QR-Code zu scannen, brauch Briar Zugriff auf die Kamera.\n\nUm Bluetooth-Geräte zu finden, braucht Briar Zugriff auf deinen Standort.\n\nBriar speichert weder deinen Standort noch gibt es ihn an andere weiter.</string>
<string name="permission_camera_location_request_body">Um den QR-Code zu scannen, brauch Briar Zugriff auf die Kamera.\n\nUm Bluetooth-Geräte zu finden, braucht Briar Zugriff auf Deinen Standort.\n\nBriar speichert weder Deinen Standort noch gibt es ihn an andere weiter.</string>
<string name="permission_camera_denied_body">Du hast den Zugriff auf die Kamera verweigert, aber das Hinzufügen von Kontakten erfordert die Verwendung der Kamera.\n\nBitte gewähre den Zugriff.</string>
<string name="qr_code">QR-Code</string>
<string name="show_qr_code_fullscreen">QR-Code im Vollbildmodus anzeigen</string>

View File

@@ -133,10 +133,6 @@
<string name="dialog_message_save_image">Guardando esta imagen le permitirá a otras aplicaciones accederla.\n\n¿Estás seguro que quieres guardarla?</string>
<string name="save_image_success">La imagen fue guardada</string>
<string name="save_image_error">No se pudo guardar imagen</string>
<string name="dialog_title_no_image_support">Imágenes no disponibles</string>
<string name="dialog_message_no_image_support">El Briar de tu contacto todavía no soporta imágenes. Una vez que lo actualice verás un ícono diferente.</string>
<string name="dialog_title_image_support">Ahora puedes enviar imágenes a este contacto.</string>
<string name="dialog_message_image_support">Pulsa este ícono para adjuntar imágenes.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Añadir un contacto</string>
<string name="face_to_face">Debes reunirte con la persona a la que quieras añadir como contacto.\n\nHaciéndolo así prevendrás que nadie te suplante o pueda leer tus mensajes en el futuro.</string>
@@ -197,6 +193,7 @@
<string name="groups_create_group_invitation_button">Enviar invitación</string>
<string name="groups_create_group_hint">Elige un nombre para tu grupo privado</string>
<string name="groups_invitation_sent">Se ha mandado la invitación de grupo</string>
<string name="groups_message_sent">Mensaje enviado</string>
<string name="groups_member_list">Integrantes</string>
<string name="groups_invite_members">Invitar miembros</string>
<string name="groups_member_created_you">Tú creaste el grupo</string>
@@ -247,6 +244,7 @@
<item quantity="one">%d publicación</item>
<item quantity="other">%d publicaciones</item>
</plurals>
<string name="forum_new_entry_posted">Publicación en foro ingresada</string>
<string name="forum_new_message_hint">Nueva publicación</string>
<string name="forum_message_reply_hint">Nueva respuesta</string>
<string name="btn_reply">Responder</string>
@@ -354,8 +352,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automática: %1$s (en %2$s)</string>
<string name="tor_mobile_data_title">Usar datos móviles</string>
<string name="tor_only_when_charging_title">Conectar vía Internet (Tor) solamente cuando está cargando</string>
<string name="tor_only_when_charging_summary">Deshabilita la conexión a Internet cuando el dispositivo está corriendo con batería.</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Seguridad</string>
<string name="pref_lock_title">Bloqueo de apli</string>
@@ -425,6 +421,7 @@
<!--Link Warning-->
<string name="link_warning_title">Advertencia sobre el enlace</string>
<string name="link_warning_intro">Estás a punto de abrir el siguiente enlace con otra aplicación</string>
<string name="link_warning_text">Esto puede usarse para identificarte. Piensa si confías en la persona que te envió el enlace y considera la opción de abrirlo con Orfox.</string>
<string name="link_warning_open_link">Abrir enlace</string>
<!--Crash Reporter-->
<string name="crash_report_title">Informe de falla de Briar</string>

View File

@@ -133,10 +133,6 @@
<string name="dialog_message_save_image">Irudi hau gordetzeak beste aplikazioei berau atzitea ahalbietuko lieke.\n\nZiur gorde nahi duzula?</string>
<string name="save_image_success">Irudia gorde da</string>
<string name="save_image_error">Ezin izan da irudia gorde</string>
<string name="dialog_title_no_image_support">Irudiak ez daude eskuragarri</string>
<string name="dialog_message_no_image_support">Zure kontaktuaren Briar bertsioak ez ditu oraindik irudiak eranskin gisa onartzen. Eguneratzen duenean zuk ikono desberdin bat ikusiko duzu.</string>
<string name="dialog_title_image_support">Orain irudiak bidali ahal dizkiozu eranskin gisa kontaktu honei</string>
<string name="dialog_message_image_support">Sakatu ikono hau irudiak eransteko.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Gehitu kontaktu bat</string>
<string name="face_to_face">Kontaktu gisa gehitu nahi duzun pertsonarekin aurrez aurre egon behar duzu.\n\nHonek etorkizunean inork zure itxurak egitea edo zure mezuak irakurtzea eragotziko du.</string>
@@ -197,6 +193,7 @@
<string name="groups_create_group_invitation_button">Bidali gonbidapena</string>
<string name="groups_create_group_hint">Aukeratu zure talde pribatuaren izena</string>
<string name="groups_invitation_sent">Talderako gonbidapena bidali da</string>
<string name="groups_message_sent">Mezua bidalita</string>
<string name="groups_member_list">Kideen zerrenda</string>
<string name="groups_invite_members">Gonbidatu kideak</string>
<string name="groups_member_created_you">Zuk sortu duzu taldea</string>
@@ -247,6 +244,7 @@
<item quantity="one">Sarrera %d</item>
<item quantity="other">%d sarrera</item>
</plurals>
<string name="forum_new_entry_posted">Foroko sarrera argitaratu da</string>
<string name="forum_new_message_hint">Sarrera berria</string>
<string name="forum_message_reply_hint">Erantzun berria</string>
<string name="btn_reply">Erantzun</string>
@@ -354,8 +352,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automatikoa: %1$s (%2$s(e)n)</string>
<string name="tor_mobile_data_title">Erabili datu mugikorrak</string>
<string name="tor_only_when_charging_title">Konektatu Internet bidez (Tor) kargatu bitartean besterik ez</string>
<string name="tor_only_when_charging_summary">Internet konexio desgaitzen du gailuak bateria darabilenean</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Segurtasuna</string>
<string name="pref_lock_title">Aplikazioaren blokeoa</string>
@@ -425,7 +421,7 @@
<!--Link Warning-->
<string name="link_warning_title">Estekari buruzko abisua</string>
<string name="link_warning_intro">Honako esteka hau kanpo aplikazio batekin irekitzear zaude.</string>
<string name="link_warning_text">Hau zu identifikatzeko erabili daiteke. Pentsatu esteka hau bidali dizun pertsonarengan konfiantza duzun eta baloratu Tor nabigatzailearekin irekitzea.</string>
<string name="link_warning_text">Hau zu identifikatzeko erabili daiteke. Pentsatu esteka hau bidali dizun pertsonarengan konfiantza duzun eta baloratu Orfox bidez irekitzea.</string>
<string name="link_warning_open_link">Ireki esteka</string>
<!--Crash Reporter-->
<string name="crash_report_title">Briar kraskatze txostena</string>

View File

@@ -196,6 +196,7 @@
<string name="groups_create_group_invitation_button">ارسال دعوت نامه</string>
<string name="groups_create_group_hint">یک نام برای گروه شخصی خود انتخاب کنید</string>
<string name="groups_invitation_sent">دعوت نامه گروه فرستاده شد</string>
<string name="groups_message_sent">پیام فرستاده شد</string>
<string name="groups_member_list">لیست اعضا</string>
<string name="groups_invite_members">دعوت اعضا</string>
<string name="groups_member_created_you">شما گروه را ایجاد کردید</string>
@@ -252,6 +253,7 @@
<item quantity="one">%d پست</item>
<item quantity="other">%d پست</item>
</plurals>
<string name="forum_new_entry_posted">پست فروم انتشار یافت</string>
<string name="forum_new_message_hint">پست جدید</string>
<string name="forum_message_reply_hint">پاسخ جدید</string>
<string name="btn_reply">پاسخ</string>
@@ -444,6 +446,7 @@
<!--Link Warning-->
<string name="link_warning_title">هشدار لینک</string>
<string name="link_warning_intro">با باز کردن لینک زیر شما یک برنامه بیرونی را باز خواهید کرد.</string>
<string name="link_warning_text">این می تواند برای شناسایی شما مورد استفاده قرار بگیرد. قبل از باز کردن آن به قابل اطمینان بودن شخصی که آن را برای شما ارسال کرده فکر کنید و بعد برای احتیاط آن را با Orfox باز کنید.</string>
<string name="link_warning_open_link">باز کردن لینک</string>
<!--Crash Reporter-->
<string name="crash_report_title">گزارش خطای Briar (برایر)</string>

View File

@@ -181,6 +181,7 @@
<string name="groups_create_group_invitation_button">Lähetä kutsu</string>
<string name="groups_create_group_hint">Valitse nimi yksityiselle ryhmällesi</string>
<string name="groups_invitation_sent">Ryhmäkutsu on lähetetty</string>
<string name="groups_message_sent">Viesti lähetetty</string>
<string name="groups_member_list">Jäsenluettelo</string>
<string name="groups_invite_members">Kutsu jäseniä</string>
<string name="groups_member_created_you">Sinä loit ryhmän</string>
@@ -231,6 +232,7 @@
<item quantity="one">%d viesti</item>
<item quantity="other">%d viestiä</item>
</plurals>
<string name="forum_new_entry_posted">Foorumikirjoitus julkaistu</string>
<string name="forum_new_message_hint">Uusi julkaisu</string>
<string name="forum_message_reply_hint">Uusi vastaus</string>
<string name="btn_reply">Vastaa</string>
@@ -404,6 +406,7 @@
<!--Link Warning-->
<string name="link_warning_title">Linkkivaroitus</string>
<string name="link_warning_intro">Olet aikomassa avata seuraavan linkin toisessa sovelluksessa.</string>
<string name="link_warning_text">Tätä voidaan käyttää sinun tunnistamiseen. Mieti luotatko käyttäjään, joka lähetti sinulle kyseisen linkin, ja harkitse sen avaamista Orfoxilla.</string>
<string name="link_warning_open_link">Avaa linkki</string>
<!--Crash Reporter-->
<string name="crash_report_title">Briar kaatumisilmoitus</string>

View File

@@ -133,10 +133,6 @@
<string name="dialog_message_save_image">Lenregistrement de cette image permettra aux autres applis dy accéder.\n\n Souhaitez-vous vraiment lenregistrer?</string>
<string name="save_image_success">Limage a été enregistrée</string>
<string name="save_image_error">Impossible denregistrer limage</string>
<string name="dialog_title_no_image_support">Les images ne sont pas disponibles</string>
<string name="dialog_message_no_image_support">Le Briar de votre contact ne prend pas encore en charge les images jointes. Une fois que son appli aura été mise à niveau, vous verrez une icône différente.</string>
<string name="dialog_title_image_support">Vous pouvez désormais envoyer des images à ce contact</string>
<string name="dialog_message_image_support">Touchez cette icône pour joindre des images.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Ajouter un contact</string>
<string name="face_to_face">Vous devez rencontrer la personne que vous voulez ajouter comme contact, afin déviter que quelquun se fasse passer pour vous et puisse lire vos messages à lavenir.</string>
@@ -197,6 +193,7 @@
<string name="groups_create_group_invitation_button">Envoyer une invitation</string>
<string name="groups_create_group_hint">Choisir un nom pour votre groupe privé</string>
<string name="groups_invitation_sent">Linvitation de groupe a été envoyée</string>
<string name="groups_message_sent">Le message a été envoyé</string>
<string name="groups_member_list">Liste des participants</string>
<string name="groups_invite_members">Inviter des participants</string>
<string name="groups_member_created_you">Vous avez créé le groupe</string>
@@ -247,6 +244,7 @@
<item quantity="one">%d article</item>
<item quantity="other">%d articles</item>
</plurals>
<string name="forum_new_entry_posted">Un article de forum a été publié</string>
<string name="forum_new_message_hint">Nouvelle article</string>
<string name="forum_message_reply_hint">Nouvelle réponse</string>
<string name="btn_reply">Répondre</string>
@@ -354,8 +352,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automatique : %1$s (en %2$s)</string>
<string name="tor_mobile_data_title">Utiliser les données cellulaires</string>
<string name="tor_only_when_charging_title">Ne se connecter par Internet (Tor) quen charge seulement</string>
<string name="tor_only_when_charging_summary">Désactive la connexion Internet quand lappareil est sur la pile</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Sécurité</string>
<string name="pref_lock_title">Verrou de lappli</string>
@@ -425,7 +421,7 @@
<!--Link Warning-->
<string name="link_warning_title">Avertissement de lien</string>
<string name="link_warning_intro">Vous êtes sur le point douvrir le lien suivant avec une appli externe.</string>
<string name="link_warning_text">Cela pourrait être utilisé pour vous identifier. Décidez si vous faites confiance à la personne qui vous a envoyé ce lien et envisagez de louvrir avec le Navigateur Tor.</string>
<string name="link_warning_text">Cela pourrait être utilisé pour vous identifier. Décidez si vous faites confiance à la personne qui vous a envoyé ce lien et envisagez de louvrir avec Orfox.</string>
<string name="link_warning_open_link">Ouvrir le lien</string>
<!--Crash Reporter-->
<string name="crash_report_title">Rapport de plantage de Briar</string>

View File

@@ -133,10 +133,6 @@
<string name="dialog_message_save_image">Ao gardar esta imaxe permitirá que outras apps teñan acceso a ela.\n\nSeguro que a quere gardar?</string>
<string name="save_image_success">Gardouse a imaxe</string>
<string name="save_image_error">Non se gardou a imaxe</string>
<string name="dialog_title_no_image_support">Imaxes non dispoñibles</string>
<string name="dialog_message_no_image_support">O cliente do seu contacto Briar non admite anexos de imaxes. Unha vez actualice verá unha icona diferente.</string>
<string name="dialog_title_image_support">Xa pode enviar imaxes a este contacto</string>
<string name="dialog_message_image_support">Toque en esta icona para anexar imaxes.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Engada un contacto</string>
<string name="face_to_face">Debe atoparse coa persoa que quere engadir como contacto.\n\Isto evitará que calquera poida suplantala ou ler as súas mensaxes no futuro.</string>
@@ -197,6 +193,7 @@
<string name="groups_create_group_invitation_button">Enviar Convite</string>
<string name="groups_create_group_hint">Escolla un nome para o seu grupo privado</string>
<string name="groups_invitation_sent">Enviouse o convite de grupo</string>
<string name="groups_message_sent">Mensaxe enviada</string>
<string name="groups_member_list">Lista de Membros</string>
<string name="groups_invite_members">Convidar a Membros</string>
<string name="groups_member_created_you">Vostede creou o grupo</string>
@@ -247,6 +244,7 @@
<item quantity="one">%d publicación</item>
<item quantity="other">%d publicacións</item>
</plurals>
<string name="forum_new_entry_posted">Foro público publicado</string>
<string name="forum_new_message_hint">Nova publicación</string>
<string name="forum_message_reply_hint">Nova Resposta</string>
<string name="btn_reply">Respostar</string>
@@ -354,8 +352,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automático: %1$s (en %2$s)</string>
<string name="tor_mobile_data_title">Utilizar datos móbiles</string>
<string name="tor_only_when_charging_title">Conectar a internet (Tor) só mentras carga</string>
<string name="tor_only_when_charging_summary">Desactiva a conexión a internet cando o dispositivo utiliza a batería</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Seguridade</string>
<string name="pref_lock_title">Bloquear app</string>
@@ -425,6 +421,7 @@
<!--Link Warning-->
<string name="link_warning_title">Aviso de ligazón</string>
<string name="link_warning_intro">Vai abrir a seguinte ligazón nunha aplicación externa.</string>
<string name="link_warning_text">Esto pode utilizarse para identificala. Pense si confía na persoa que lle enviou a ligazón e considere abrila con Orfox.</string>
<string name="link_warning_open_link">Abrir ligazón</string>
<!--Crash Reporter-->
<string name="crash_report_title">Informe de fallo de Briar</string>

View File

@@ -146,10 +146,6 @@
<string name="dialog_message_save_image">שמירת תמונה זו תאפשר ליישומים להשיג גישה אל התמונה.\n\nהאם אתה בטוח שאתה רוצה לשמור?</string>
<string name="save_image_success">תמונה נשמרה</string>
<string name="save_image_error">לא היה ניתן לשמור תמונה</string>
<string name="dialog_title_no_image_support">תמונות בלתי זמינות</string>
<string name="dialog_message_no_image_support">Briar של איש הקשר שלך אינו תומך בצרופות תמונה. ברגע שהוא ישדרג, תראה צלמית שונה.</string>
<string name="dialog_title_image_support">אתה יכול כעת לשלוח תמונות אל איש קשר זה</string>
<string name="dialog_message_image_support">הקש על צלמית זו כדי לצרף תמונות.</string>
<!--Adding Contacts-->
<string name="add_contact_title">הוסף איש קשר</string>
<string name="face_to_face">אתם חייבים להפגש עם האדם שאותו תרצו להוסיף כאיש קשר.
@@ -216,6 +212,7 @@
<string name="groups_create_group_invitation_button">שלח הזמנה</string>
<string name="groups_create_group_hint">בחרו שם לקבוצה הפרטית שלכם</string>
<string name="groups_invitation_sent">הזמנה קבוצתית נשלחה</string>
<string name="groups_message_sent">הודעה נשלחה</string>
<string name="groups_member_list">רשימת חברי קבוצה</string>
<string name="groups_invite_members">הזמן חברי קבוצה</string>
<string name="groups_member_created_you">יצרת את הקבוצה</string>
@@ -276,6 +273,7 @@
<item quantity="many">%d רשומות</item>
<item quantity="other">%d רשומות</item>
</plurals>
<string name="forum_new_entry_posted">רשומת פורום פורסמה</string>
<string name="forum_new_message_hint">רשומה חדשה</string>
<string name="forum_message_reply_hint">תשובה חדשה</string>
<string name="btn_reply">השב</string>
@@ -387,8 +385,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">אוטומטי: %1$s (תוך %2$s)</string>
<string name="tor_mobile_data_title">השתמש בנתונים סלולריים</string>
<string name="tor_only_when_charging_title">התחבר דרך אינטרנט (Tor) רק בעת טעינה</string>
<string name="tor_only_when_charging_summary">משבית חיבור אינטרנט כשהמכשיר עובד על סוללה</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">אבטחה</string>
<string name="pref_lock_title">נעילת יישום</string>
@@ -458,7 +454,7 @@
<!--Link Warning-->
<string name="link_warning_title">אזהרת קישור</string>
<string name="link_warning_intro">אתה עומד לפתוח את הקישור הבא עם יישום חיצוני.</string>
<string name="link_warning_text">זה יכול לשמש כדי לזהות אותך. חשוב על האם אתה בוטח באיש ששלח לך קישור זה ושקול לפתוח את הקישור עם דפדפן Tor.</string>
<string name="link_warning_text">זה יכול לשמש כדי לזהות אותך. חשוב על האם אתה בוטח באיש ששלח לך קישור זה ושקול לפתוח את הקישור עם Orfox.</string>
<string name="link_warning_open_link">פתח קישור</string>
<!--Crash Reporter-->
<string name="crash_report_title">דיווח על קריסת Briar</string>

View File

@@ -193,6 +193,7 @@
<string name="groups_create_group_invitation_button">निमंत्रण भेजना</string>
<string name="groups_create_group_hint">अपने निजी समूह के लिए एक नाम चुनें</string>
<string name="groups_invitation_sent">समूह आमंत्रण भेजा गया है</string>
<string name="groups_message_sent">मैसेज बेजा गया</string>
<string name="groups_member_list">सदस्य सूची</string>
<string name="groups_invite_members">सदस्यों को आमंत्रित करो</string>
<string name="groups_member_created_you">आपने समूह बनाया है</string>
@@ -243,6 +244,7 @@
<item quantity="one">%dपदों</item>
<item quantity="other">%dपदों</item>
</plurals>
<string name="forum_new_entry_posted">फोरम पोस्ट प्रकाशित</string>
<string name="forum_new_message_hint">नई पोस्ट</string>
<string name="forum_message_reply_hint">नया उत्तर</string>
<string name="btn_reply">जवाब दें</string>
@@ -419,6 +421,7 @@
<!--Link Warning-->
<string name="link_warning_title">लिंक चेतावनी</string>
<string name="link_warning_intro">आप बाहरी एप्लिकेशन के साथ निम्न लिंक खोलने वाले हैं</string>
<string name="link_warning_text">इसका इस्तेमाल आपको पहचानने के लिए किया जा सकता है इस बारे में सोचें कि क्या आपको उस व्यक्ति पर भरोसा है जिसने आपको यह लिंक भेजा है और इसे ऑर्फ़ॉक्स के साथ खोलने पर विचार किया है।</string>
<string name="link_warning_open_link">खुली लिंक</string>
<!--Crash Reporter-->
<string name="crash_report_title">Briar क्रैश रिपोर्ट</string>

View File

@@ -183,6 +183,7 @@
<string name="groups_create_group_invitation_button">Meghívó küldése</string>
<string name="groups_create_group_hint">Válasszon egy nevet a privát csoportjához</string>
<string name="groups_invitation_sent">A csoportmeghívó elküldésre került</string>
<string name="groups_message_sent">Üzenet elküldve</string>
<string name="groups_member_list">Tag lista</string>
<string name="groups_invite_members">Tagok meghíívása</string>
<string name="groups_member_created_you">Ön hozta létre a csoportot</string>
@@ -233,6 +234,7 @@
<item quantity="one">%d bejegyzés</item>
<item quantity="other">%d bejegyzés</item>
</plurals>
<string name="forum_new_entry_posted">Fórum bejegyzés közzétéve</string>
<string name="forum_new_message_hint">Új bejegyzés</string>
<string name="forum_message_reply_hint">Új válasz</string>
<string name="btn_reply">Válasz</string>
@@ -412,6 +414,7 @@ Vigyázat: Ez végleg törli az identitásait, kapcsolatait és üzeneteit</stri
<!--Link Warning-->
<string name="link_warning_title">Link figyelmeztetés</string>
<string name="link_warning_intro">Épp megnyit egy linket egy külső alkalmazással.</string>
<string name="link_warning_text">Ez lehetővé teheti az azonosítását. Gondolja át megbízik-e a személyben aki ezt küldte és szükség esetén használjon Orfox-ot.</string>
<string name="link_warning_open_link">Link megnyitása</string>
<!--Crash Reporter-->
<string name="crash_report_title">Briar összeomlási jelentés</string>

View File

@@ -133,10 +133,6 @@
<string name="dialog_message_save_image">Salvare questa immagine permetterà ad altre app di accedere ad essa.\n\nSei sicuro di volerla salvare?</string>
<string name="save_image_success">L\'immagine è stata salvata</string>
<string name="save_image_error">Non è stato possibile salvare l\'immagine</string>
<string name="dialog_title_no_image_support">Immagini non disponibili</string>
<string name="dialog_message_no_image_support">Il Briar del tuo contatto non supporta ancora le immagini in allegato. Quando avrà aggiornato vedrai un\'icona diversa.</string>
<string name="dialog_title_image_support">Ora puoi inviare immagini a questo contatto</string>
<string name="dialog_message_image_support">Tocca questa icona per allegare immagini.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Aggiungi un Contatto</string>
<string name="face_to_face">Devi incontrarti con la persona che vuoi aggiungere come contatto.\n\nQuesto evita che qualcuno ti impersoni o legga i tuoi messaggi in futuro.</string>
@@ -197,6 +193,7 @@
<string name="groups_create_group_invitation_button">Invia invito</string>
<string name="groups_create_group_hint">Scegli un nome per il tuo gruppi privato</string>
<string name="groups_invitation_sent">Invito a partecipare al gruppo spedito</string>
<string name="groups_message_sent">Messaggio inviato</string>
<string name="groups_member_list">Lista membri</string>
<string name="groups_invite_members">Invita Membri</string>
<string name="groups_member_created_you">Hai creato un nuovo gruppo</string>
@@ -247,6 +244,7 @@
<item quantity="one">%d post</item>
<item quantity="other">%d post</item>
</plurals>
<string name="forum_new_entry_posted">Post pubblicato sul forum</string>
<string name="forum_new_message_hint">Nuovo post</string>
<string name="forum_message_reply_hint">Nuova Risposta</string>
<string name="btn_reply">Rispondi</string>
@@ -354,8 +352,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automatico: %1$s (in %2$s)</string>
<string name="tor_mobile_data_title">Usa dati mobili</string>
<string name="tor_only_when_charging_title">Connetti via internet (Tor) solo durante la ricarica</string>
<string name="tor_only_when_charging_summary">Disattiva la connessione internet quando il dispositivo funziona a batteria</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Sicurezza</string>
<string name="pref_lock_title">Blocco dell\'app</string>
@@ -425,7 +421,7 @@
<!--Link Warning-->
<string name="link_warning_title">Attenzione Link</string>
<string name="link_warning_intro">Stai per aprire il seguente link con un\' app esterna</string>
<string name="link_warning_text">Ciò può essere usato per identificarti. Pensa se ti fidi della persona che ti ha inviato questo link e considera se aprirlo con Tor Browser.</string>
<string name="link_warning_text">Ciò può essere usato per identificarti. Pensa se ti fidi della persona che ti ha inviato questo link e considera se aprirlo con Orfox.</string>
<string name="link_warning_open_link">Apri Link</string>
<!--Crash Reporter-->
<string name="crash_report_title">Rapporto Crash Briar</string>

View File

@@ -133,10 +133,6 @@
<string name="dialog_message_save_image">Зачувувањето на сликата ќе им дозволи на други апликации да пристапат до неа.\n\nДали сте сигурни дека сакате да ја зачувате?</string>
<string name="save_image_success">Сликата беше зачувана</string>
<string name="save_image_error">Сликата не може да се зачува</string>
<string name="dialog_title_no_image_support">Недостапни слики</string>
<string name="dialog_message_no_image_support">Верзијата на Briar на контактот се уште не поддржува прикачувања на слики. Во моментот кога тој ќе го ажурира Briar, ќе видите различна икона.</string>
<string name="dialog_title_image_support">Сега можете да му испраќате слики на овој контакт</string>
<string name="dialog_message_image_support">Допрете ја оваа икона за да прикачите слики.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Додади контакт</string>
<string name="face_to_face">Морате да се сретнете со лицето кое сакате да го додадете за контакт.\n\nОва спречува во иднина било кој да се преставува како вас или да ги чита вашите пораки во иднина.</string>
@@ -197,6 +193,7 @@
<string name="groups_create_group_invitation_button">Испрати покана</string>
<string name="groups_create_group_hint">Избери има за твојата приватна група</string>
<string name="groups_invitation_sent">Групна покана беше испратена</string>
<string name="groups_message_sent">Пораката е испратена</string>
<string name="groups_member_list">Листа на членови</string>
<string name="groups_invite_members">Покани членови</string>
<string name="groups_member_created_you">Вие ја создадовте групата</string>
@@ -247,6 +244,7 @@
<item quantity="one">%dпост</item>
<item quantity="other">%dобјави</item>
</plurals>
<string name="forum_new_entry_posted">Објавата на форумот е објавена</string>
<string name="forum_new_message_hint">Нова објава</string>
<string name="forum_message_reply_hint">Нов одговор</string>
<string name="btn_reply">Одговор</string>
@@ -354,8 +352,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Автоматски: %1$s (во %2$s)</string>
<string name="tor_mobile_data_title">Користи мобилни податоци</string>
<string name="tor_only_when_charging_title">Поврзи преку Интернет (Tor) само за време на полнење</string>
<string name="tor_only_when_charging_summary">Оневозможи го Интернет поврзувањето кога уредот не е приклучен на полнач</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Безбедност</string>
<string name="pref_lock_title">Апликацијата е заклучена</string>
@@ -425,7 +421,7 @@
<!--Link Warning-->
<string name="link_warning_title">Линк предупредување</string>
<string name="link_warning_intro">Ќе го отворите следниот линк во надворешна апликација.</string>
<string name="link_warning_text">Ова може да биде искористено за ваше идентификување. Размислете дали и верувате на оваа личност која ви го испраќа овој линк и размислете истиот да го отворите со Tor прелистувачот.</string>
<string name="link_warning_text">Ова може да биде искористено за да ве идентификуваат. Размислте дали и верувате на личноста која ви го испратила овој линк и дали да го отворите со Orfox.</string>
<string name="link_warning_open_link">Отвори линк</string>
<!--Crash Reporter-->
<string name="crash_report_title">Briar извештај за срушување</string>

View File

@@ -133,10 +133,6 @@
<string name="dialog_message_save_image">Opslaan van deze afbeelding staat andere apps toe deze te gebruiken.\n\n Weet je zeker dat het wil opslaan?</string>
<string name="save_image_success">Afbeelding was opgeslagen</string>
<string name="save_image_error">Kon afbeelding niet opslaan</string>
<string name="dialog_title_no_image_support">Afbeeldingen niet beschikbaar</string>
<string name="dialog_message_no_image_support">Briar van jouw contact ondersteunt nog geen afbeeldingen als bijlagen. Zodat zij upgraden zul je een ander icoon zien.</string>
<string name="dialog_title_image_support">Je kan nu afbeeldingen naar dit contact sturen</string>
<string name="dialog_message_image_support">Tik op dit icoon om afbeelding bij te sluiten.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Voeg contact toe</string>
<string name="face_to_face">Je moet een persoon in levenden lijve ontmoeten om die als contact toe te voegen.\n\nDit voortkomt dat anderen zich als jou voor kunnen doen of in de toekomst je berichten kunnen lezen.</string>
@@ -197,6 +193,7 @@
<string name="groups_create_group_invitation_button">Verstuur uitnodiging</string>
<string name="groups_create_group_hint">Voer een naam in voor je privégroep</string>
<string name="groups_invitation_sent">Groepsuitnodiging is verstuurd</string>
<string name="groups_message_sent">Bericht is verstuurd</string>
<string name="groups_member_list">Ledenlijst</string>
<string name="groups_invite_members">Nodig leden uit</string>
<string name="groups_member_created_you">Je hebt de groep aangemaakt</string>
@@ -247,6 +244,7 @@
<item quantity="one">%d post</item>
<item quantity="other">%d posts</item>
</plurals>
<string name="forum_new_entry_posted">Forumbericht gepubliceerd</string>
<string name="forum_new_message_hint">Nieuw bericht</string>
<string name="forum_message_reply_hint">Nieuwe reactie</string>
<string name="btn_reply">Antwoord</string>
@@ -354,8 +352,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automatisch: %1$s (in %2$s)</string>
<string name="tor_mobile_data_title">Gebruik mobiele data</string>
<string name="tor_only_when_charging_title">Verbind met internet (Tor) alleen tijdens opladen</string>
<string name="tor_only_when_charging_summary">Schakel internetverbinding uit als apparaat op batterij loopt</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Beveiliging</string>
<string name="pref_lock_title">App-vergrendeling</string>
@@ -425,6 +421,7 @@
<!--Link Warning-->
<string name="link_warning_title">Linkwaarschuwing</string>
<string name="link_warning_intro">Je staat op het punt om de volgende link te open met een externe app.</string>
<string name="link_warning_text">Dit kan gebruikt worden om te achterhalen wie jij bent. Denk na of je de persoon vertrouwd die je deze link heeft gestuurd en overweeg deze link te openen met Orfox.</string>
<string name="link_warning_open_link">Open link</string>
<!--Crash Reporter-->
<string name="crash_report_title">Briar Crashrapport</string>

View File

@@ -135,10 +135,6 @@ Volètz suprimir vòstre compte e ne crear un nòu?\n
<string name="dialog_message_save_image">Lenregistrament de limatge permetrà a dautras aplicacions di accedir.\n\nVolètz vertadièrament lenregistrar?</string>
<string name="save_image_success">Limatge es enregistrada</string>
<string name="save_image_error">Enregistrament de limatge impossible</string>
<string name="dialog_title_no_image_support">Imatges pas disponibles</string>
<string name="dialog_message_no_image_support">Vòstre contacte Briar pòt pas encara recebre dimatges junts. Un còp quaurà mes a jorn sa version veiretz una icòna diferenta.</string>
<string name="dialog_title_image_support">Ara podètz enviar dimatges a aqueste contacte</string>
<string name="dialog_message_image_support">Tocatz aquesta icòna per juntar dimatges.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Ajustar un contacte</string>
<string name="face_to_face">Vos cal vos amassar amb la persona que volètz apondre als contactes.\n\n Aquò es fach per evitar quòm vos raube lidentitat e que vòstres messatges sián legits per dautres.</string>
@@ -199,6 +195,7 @@ Volètz suprimir vòstre compte e ne crear un nòu?\n
<string name="groups_create_group_invitation_button">Enviar de convidacions</string>
<string name="groups_create_group_hint">Donatz un nom al grop privat</string>
<string name="groups_invitation_sent">Convidacion enviada al grop</string>
<string name="groups_message_sent">Messatge mandat</string>
<string name="groups_member_list">Tièra de membres</string>
<string name="groups_invite_members">Convidar mai de monde</string>
<string name="groups_member_created_you">Avètz creat lo grop</string>
@@ -249,6 +246,7 @@ Volètz suprimir vòstre compte e ne crear un nòu?\n
<item quantity="one">%d publicacion</item>
<item quantity="other">%d publicacions</item>
</plurals>
<string name="forum_new_entry_posted">Publicacion de forum publicada</string>
<string name="forum_new_message_hint">Nòva responsa</string>
<string name="forum_message_reply_hint">Nòva responsa</string>
<string name="btn_reply">Respondre</string>
@@ -359,8 +357,6 @@ contactes quavètz partejat aqueste flux quitaràn benlèu de recebre las mes
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automatic : %1$s (en %2$s)</string>
<string name="tor_mobile_data_title">Utilizar la connexion del mobil</string>
<string name="tor_only_when_charging_title">Se connectar via Internet (Tor) pas quen cargament bateriá</string>
<string name="tor_only_when_charging_summary">Desactiva la connexion Internet quand laparelh manca de bateriá</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Seguretat</string>
<string name="pref_lock_title">Verrolatge de laplicacion</string>
@@ -430,7 +426,7 @@ contactes quavètz partejat aqueste flux quitaràn benlèu de recebre las mes
<!--Link Warning-->
<string name="link_warning_title">Avertiment de ligam</string>
<string name="link_warning_intro">Sètz a man de dobrir lo ligam seguent amb una aplicacion extèrna.</string>
<string name="link_warning_text">Aquò pòt servir a vos identificar. Soscatz se vos fisatz de la persona que vos a enviat aqueste ligam e pensatz de lo dobrir amb Tor Browser. </string>
<string name="link_warning_text">Aquò poiriá èsser utilizat per vos identificar. Estimatz la fisança quavètz de la persona que vos a enviat lo ligam e pensatz lo dobrir amb Orfox.</string>
<string name="link_warning_open_link">Dobrir lo ligam</string>
<!--Crash Reporter-->
<string name="crash_report_title">Senhalar lo fracàs de Briar</string>

View File

@@ -196,6 +196,7 @@
<string name="groups_create_group_invitation_button">Wyślij Zaproszenie</string>
<string name="groups_create_group_hint">Wybierz nazwę dla twojej prywatnej grupy</string>
<string name="groups_invitation_sent">Zaproszenie do grupy zostało wysłane</string>
<string name="groups_message_sent">Wiadomość wysłana</string>
<string name="groups_member_list">Lista Użytkowników</string>
<string name="groups_invite_members">Zaproś Użytkowników</string>
<string name="groups_member_created_you">Stworzyłeś grupę</string>
@@ -250,6 +251,7 @@
<item quantity="many">%d postów</item>
<item quantity="other">%d postów</item>
</plurals>
<string name="forum_new_entry_posted">Post na forum opublikowany</string>
<string name="forum_new_message_hint">Nowy Post</string>
<string name="forum_message_reply_hint">Nowa Odpowiedź</string>
<string name="btn_reply">Odpowiedz</string>
@@ -425,6 +427,7 @@
<!--Link Warning-->
<string name="link_warning_title">Uważaj na link</string>
<string name="link_warning_intro">Otwierasz link w zewnętrznej aplikacji.</string>
<string name="link_warning_text">Może to posłużyć aby Cię zidentyfikować. Zastanów się czy ufasz osobie która wysłała Ci ten link i rozważ otwarcie go za pomocą przeglądarki Orfox.</string>
<string name="link_warning_open_link">Otwórz Link</string>
<!--Crash Reporter-->
<string name="crash_report_title">Zgłoś błąd w Briar</string>

View File

@@ -184,6 +184,7 @@
<string name="groups_create_group_invitation_button">Enviar Convite</string>
<string name="groups_create_group_hint">Escolha um nome para o seu grupo privado</string>
<string name="groups_invitation_sent">Convite do Grupo enviado </string>
<string name="groups_message_sent">Mensagem enviada</string>
<string name="groups_member_list">Lista de membros</string>
<string name="groups_invite_members">Convidar membros</string>
<string name="groups_member_created_you">Você criou o grupo</string>
@@ -234,6 +235,7 @@
<item quantity="one">%d Post</item>
<item quantity="other">%d Posts</item>
</plurals>
<string name="forum_new_entry_posted">Post do forum publicado</string>
<string name="forum_new_message_hint">Nova postagem</string>
<string name="forum_message_reply_hint">Nova resposta</string>
<string name="btn_reply">Responder</string>
@@ -410,6 +412,7 @@
<!--Link Warning-->
<string name="link_warning_title">Aviso sobre Link</string>
<string name="link_warning_intro">Você está prestes a abrir esse link em um Aplicativo Externo.</string>
<string name="link_warning_text">Isso pode ser usado para identificar você. Pense se você confia a pessoa que enviou esse link ou considere abrindo o no Orfox.</string>
<string name="link_warning_open_link">Abrir Link</string>
<!--Crash Reporter-->
<string name="crash_report_title">Relatório de falhas do Briar</string>

View File

@@ -138,10 +138,6 @@
<string name="dialog_message_save_image">Salvând imaginea veți permite altor aplicații să o acceseze.\n\nSigur doriți să o salvați?</string>
<string name="save_image_success">Imaginea a fost salvată</string>
<string name="save_image_error">Nu s-a putut șterge imaginea</string>
<string name="dialog_title_no_image_support">Imagini indisponibile</string>
<string name="dialog_message_no_image_support">Versiunea aplicației Briar a contactului dumneavoastră nu suportă încă atașamente imagini. Odată ce au actualizat veți vedea o iconiță diferită.</string>
<string name="dialog_title_image_support">Acum puteți trimite imagini către acest contact</string>
<string name="dialog_message_image_support">Atingeți această iconiță pentru a atașa imagini</string>
<!--Adding Contacts-->
<string name="add_contact_title">Adaugă un contact</string>
<string name="face_to_face">Trebuie să vă întâlniți cu persoana pe care doriți să o adăugați la contacte.\n\nAcest pas împiedică alte persoane să vă fure identitatea sau să vă citească mesajele în viitor.</string>
@@ -204,6 +200,7 @@
<string name="groups_create_group_invitation_button">Trimite invitație</string>
<string name="groups_create_group_hint">Alegeți un nume pentru grupul dumneavoastră privat</string>
<string name="groups_invitation_sent">Invitația in grup a fost trimisă</string>
<string name="groups_message_sent">Mesaj trimis</string>
<string name="groups_member_list">Lista de membrii</string>
<string name="groups_invite_members">Invită membrii</string>
<string name="groups_member_created_you">Ați creat grupul</string>
@@ -256,6 +253,7 @@
<item quantity="few">%d mesaje</item>
<item quantity="other">%d de mesaje</item>
</plurals>
<string name="forum_new_entry_posted">Mesajul a fost scris pe forum</string>
<string name="forum_new_message_hint">Mesaj nou</string>
<string name="forum_message_reply_hint">Răspuns nou</string>
<string name="btn_reply">Răspunde</string>
@@ -364,8 +362,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automat: %1$s (în %2$s)</string>
<string name="tor_mobile_data_title">Utilizează date mobile</string>
<string name="tor_only_when_charging_title">Conectare prin Internet (rețeaua Tor) doar atunci când dispozitivul se încarcă</string>
<string name="tor_only_when_charging_summary">Se dezactivează conexiunea la Internet atunci când dispozitivul funcționează pe baterie</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Securitate</string>
<string name="pref_lock_title">Blocare aplicație</string>
@@ -435,7 +431,7 @@
<!--Link Warning-->
<string name="link_warning_title">Avertizare adresă</string>
<string name="link_warning_intro">Urmează să deschideți adresa următoare cu o aplicație externă</string>
<string name="link_warning_text">Acest lucru poate fi folosit pentru a vă identifica. Gândiți-vă dacă aveți încredere în persoana care v-a trimis acest link și luați în considerare deschiderea acestuia cu Tor Browser.</string>
<string name="link_warning_text">Acest lucru poate fi folosit pentru a vă identifica. Gândiți-vă dacă aveți încredere în persoana care v-a trimis acest link și luați în considerare deschiderea acestuia cu Orfox.</string>
<string name="link_warning_open_link">Deschide adresă</string>
<!--Crash Reporter-->
<string name="crash_report_title">Raport de erori Briar</string>

View File

@@ -2,7 +2,7 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Setup-->
<string name="setup_title">Добро пожаловать в Briar</string>
<string name="setup_name_explanation">Ваш псевдоним будет отображаться рядом с любым размещаемым вами контентом. Его нельзя изменить после создания аккаунта.</string>
<string name="setup_name_explanation">Ваш псевдоним будет показан рядом с любым публикуемым вами контентом. Его нельзя изменить после создания аккаунта.</string>
<string name="setup_next">Вперед</string>
<string name="setup_password_intro">Придумайте пароль</string>
<string name="setup_password_explanation">Ваш аккаунт Briar хранится в зашифрованном виде только на устройстве. Если вы забудете свой пароль или удалите Briar, то не сможете восстановить свою учетную запись.\n\nПридумайте длинный пароль, который трудно угадать, например четыре случайных слова или десять случайных букв, цифр и символов.</string>
@@ -14,14 +14,14 @@
<string name="choose_password">Придумайте пароль</string>
<string name="confirm_password">Подтвердите пароль</string>
<string name="name_too_long">Слишком длинное имя</string>
<string name="password_too_weak">Пароль слишком слабый.</string>
<string name="password_too_weak">Cлишком слабый пароль</string>
<string name="passwords_do_not_match">Пароли не совпадают</string>
<string name="create_account_button">Создать учетную запись</string>
<string name="more_info">Дополнительная информация</string>
<string name="don_t_ask_again">Больше не спрашивать</string>
<string name="setup_huawei_text">Нажмите кнопку ниже и убедитесь, что Briar отображается на экране защищенных приложений.</string>
<string name="setup_huawei_button">Защитить Briar</string>
<string name="setup_huawei_help">Если Briar не будет добавлен в список защищенных приложений, он не сможет работать в фоновом режиме.</string>
<string name="setup_huawei_help">Если Briar не добавлен в список защищенных приложений, он не сможет работать в фоновом режиме.</string>
<string name="warning_dozed">%s не удалось выполнить в фоновом режиме</string>
<!--Login-->
<string name="enter_password">Пароль</string>
@@ -31,7 +31,7 @@
<string name="dialog_title_lost_password">Пароль утерян</string>
<string name="dialog_message_lost_password">Ваш аккаунт Briar хранится в зашифрованном виде только на устройстве, поэтому мы не можем сбросить пароль. Удалить учетную запись и начать заново?\n\nВнимание: ваши идентификаторы, контакты и сообщения будут потеряны навсегда.</string>
<string name="startup_failed_notification_title">Не удалось запустить Briar</string>
<string name="startup_failed_notification_text">Нажмите для получения дополнительной информации.</string>
<string name="startup_failed_notification_text">Коснитесь для получения дополнительных сведений.</string>
<string name="startup_failed_activity_title">Сбой при запуске Briar</string>
<string name="startup_failed_db_error">По неясным причинам, база данных Briar повреждена без возможности восстановления. Ваша учетная запись, ваши данные и все ваши контакты потеряны. К сожалению, вам придется переустановить Briar или создать новый аккаунт, выбрав \'я забыл свой пароль\' на этапе входа в аккаунт.</string>
<string name="startup_failed_data_too_old_error">Ваша учетная запись была создана в старой версии Briar, поэтому открыть ее в этой версии приложения не удастся. Вам необходимо либо установить старую версию, либо создать новый аккаунт, выбрав \'я забыл свой пароль\' на этапе авторизации в приложении.</string>
@@ -145,10 +145,6 @@
<string name="dialog_message_save_image">После сохранения изображения другие приложения получат к нему доступ.\n\nВы уверены, что хотите сохранить?</string>
<string name="save_image_success">Изображение было сохранено</string>
<string name="save_image_error">Не удалось сохранить изображение</string>
<string name="dialog_title_no_image_support">Изображения недоступны</string>
<string name="dialog_message_no_image_support">Briar вашего собеседника не поддерживает вложение изображений. Как только он обновится, вы увидите другую иконку.</string>
<string name="dialog_title_image_support">Теперь вы можете отправлять изображения этому контакту</string>
<string name="dialog_message_image_support">Нажмите на этот значок, чтобы прикрепить изображения.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Добавить контакт</string>
<string name="face_to_face">Вы должны встретиться с человеком, которого хотите добавить в контакты.\n\nЭто не позволит кому-либо выдать себя за вас или читать ваши сообщения.</string>
@@ -212,7 +208,8 @@
<string name="groups_create_group_button">Создать группу</string>
<string name="groups_create_group_invitation_button">Отправить приглашение</string>
<string name="groups_create_group_hint">Придумайте название вашей приватной группы</string>
<string name="groups_invitation_sent">Приглашение в группу отправлено</string>
<string name="groups_invitation_sent">Групповое приглашение отправлено</string>
<string name="groups_message_sent">Сообщение отправлено</string>
<string name="groups_member_list">Список участников</string>
<string name="groups_invite_members">Пригласить участников</string>
<string name="groups_member_created_you">Вы создали группу</string>
@@ -267,6 +264,7 @@
<item quantity="many">%d постов</item>
<item quantity="other">%d постов</item>
</plurals>
<string name="forum_new_entry_posted">Запись форума опубликована</string>
<string name="forum_new_message_hint">Новый пост</string>
<string name="forum_message_reply_hint">Новый ответ</string>
<string name="btn_reply">Ответ</string>
@@ -362,7 +360,7 @@
<string name="pref_theme_light">Светлая</string>
<string name="pref_theme_dark">Темная</string>
<string name="pref_theme_auto">Авто (День)</string>
<string name="pref_theme_system">Системные настройки</string>
<string name="pref_theme_system">По-умолчанию</string>
<!--Settings Network-->
<string name="network_settings_title">Сети</string>
<string name="bluetooth_setting">Подключение через Bluetooth</string>
@@ -376,8 +374,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Автоматически: %1$s (%2$s)</string>
<string name="tor_mobile_data_title">Использовать мобильные данные</string>
<string name="tor_only_when_charging_title">Подключаться через интернет (Tor) только при зарядке</string>
<string name="tor_only_when_charging_summary">Отключение интернет-соединения, при работе устройства от батареи</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Безопасность</string>
<string name="pref_lock_title">Блокировка приложения</string>
@@ -447,7 +443,7 @@
<!--Link Warning-->
<string name="link_warning_title">Предупреждение о ссылке</string>
<string name="link_warning_intro">Вы собираетесь открыть следующую ссылку в стороннем приложении.</string>
<string name="link_warning_text">Это может быть использовано для вашей идентификации. Подумайте, доверяете ли вы тому, кто отправил вам эту ссылку и рассмотрите возможность ее открытия в Tor Browser.</string>
<string name="link_warning_text">Возможно вас хотят идентифицировать. Подумайте, доверяете ли вы человеку, который отправил вам эту ссылку и рассмотрите возможность открытия ее в Orfox.</string>
<string name="link_warning_open_link">Открыть ссылку</string>
<!--Crash Reporter-->
<string name="crash_report_title">Отчет о сбое Briar</string>
@@ -474,11 +470,11 @@
<!--Permission Requests-->
<string name="permission_camera_title">Доступ к камере</string>
<string name="permission_camera_request_body">Для сканирования QR-кода Briar необходим доступ к камере.</string>
<string name="permission_location_title">Доступ к местоположению</string>
<string name="permission_location_title">Разрешение местоположения</string>
<string name="permission_location_request_body">Для обнаружения Bluetooth-устройств, Briar требуется разрешение на доступ к вашему местоположению.\n\nBriar не хранит ваше местоположение и не делится им кем-либо еще.</string>
<string name="permission_camera_location_title">Камера и местоположение</string>
<string name="permission_camera_location_request_body">Для сканирования QR-кода Briar необходим доступ к камере.\n\nДля обнаружения Bluetooth-устройств, Briar требуется разрешение на доступ к вашему местоположению.\n\nBriar не хранит ваше местоположение и не делится им кем-либо еще.</string>
<string name="permission_camera_denied_body">Доступ к камере запрещен, но для добавления контактов необходимо использовать камеру.\n\nРассмотрите возможность предоставления доступа.</string>
<string name="permission_camera_denied_body">Вы отказали в доступе к камере. Для добавления контактов необходимо использовать камеру.\n\nРассмотрите возможность предоставления доступа.</string>
<string name="qr_code">QR-код</string>
<string name="show_qr_code_fullscreen">Показать QR-код во весь экран</string>
<!--App Locking-->

View File

@@ -133,10 +133,6 @@
<string name="dialog_message_save_image">Ruajta e kësaj figure do tu lejojë aplikacioneve të tjera ta përdorin.\n\nJeni i sigurt se doni të ruhet?</string>
<string name="save_image_success">Figura u ruajt</string>
<string name="save_image_error">Figura su ruajt dot</string>
<string name="dialog_title_no_image_support">Figura të Pakapshme</string>
<string name="dialog_message_no_image_support">Briar-i i kontaktit tuaj nuk i mbulon ende bashkëngjitjet figura. Sapo ta përditësojë, do të shihni tjetër ikonë.</string>
<string name="dialog_title_image_support">Tani mund ti dërgoni figura këtij kontakti</string>
<string name="dialog_message_image_support">Prekeni këtë ikonë që të bashkëngjitni figura.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Shtoni një Kontakt</string>
<string name="face_to_face">Duhet të takoheni me personin që doni ta shtoni si kontakt.\n\nKjo do të pengojë cilindo të hiqet si ju ose të lexojë në të ardhmen mesazhet tuaj.</string>
@@ -197,6 +193,7 @@
<string name="groups_create_group_invitation_button">Dërgoje Ftesën</string>
<string name="groups_create_group_hint">Zgjidhni një emër për grupin tuaj privat</string>
<string name="groups_invitation_sent">Ftesa e grupit u dërgua</string>
<string name="groups_message_sent">Mesazhi u dërgua</string>
<string name="groups_member_list">Listë Anëtarësh</string>
<string name="groups_invite_members">Ftoni Anëtarë</string>
<string name="groups_member_created_you">E krijuat grupin</string>
@@ -247,6 +244,7 @@
<item quantity="one">%d postim</item>
<item quantity="other">%d postime</item>
</plurals>
<string name="forum_new_entry_posted">U botua postim forumi</string>
<string name="forum_new_message_hint">Postim i Ri</string>
<string name="forum_message_reply_hint">Përgjigje e Re</string>
<string name="btn_reply">Përgjigju</string>
@@ -354,8 +352,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Automatike: %1$s (në %2$s)</string>
<string name="tor_mobile_data_title">Përdor të dhëna celulare</string>
<string name="tor_only_when_charging_title">Lidhu përmes Internetit (Tor) vetëm kur bëhet ngarkim</string>
<string name="tor_only_when_charging_summary">Çaktivizon lidhjen në Internet, kur pajisja ushqehet nga bateria</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Siguri</string>
<string name="pref_lock_title">Kyçje aplikacioni</string>
@@ -425,7 +421,7 @@
<!--Link Warning-->
<string name="link_warning_title">Sinjalizim Lidhjeje</string>
<string name="link_warning_intro">Ju ndan një hap nga hapja e lidhjes vijuese me një aplikacion të jashtëm.</string>
<string name="link_warning_text">Kjo mund të përdoret për tju identifikuar. Sillni në mend nëse i zini besë personit që ju dërgoi lidhjen dhe shihni mundësinë e hapjes së saj me Shfletuesin Tor.</string>
<string name="link_warning_text">Kjo mund të përdoret për t\ju identifikuar. Mendohuni nëse e besoni apo jo personin që ju dërgoi këtë lidhje dhe shihni mundësinë e hapjes së saj me Orfox</string>
<string name="link_warning_open_link">Hape Lidhjen</string>
<!--Crash Reporter-->
<string name="crash_report_title">Njoftim Vithisjesh Briar-i</string>

View File

@@ -187,6 +187,7 @@ Izaberite dugačku lozinku koju je teško pogoditi, kao četiri nasumične rije
<string name="groups_create_group_invitation_button">Pošalji poziv</string>
<string name="groups_create_group_hint">Izaberite ime za vašu privatnu grupu</string>
<string name="groups_invitation_sent">Grupna pozivnica je poslata</string>
<string name="groups_message_sent">Poruka poslata</string>
<string name="groups_member_list">Lista članova</string>
<string name="groups_invite_members">Pošaljite poziv članovima</string>
<string name="groups_member_created_you">Vi ste kreirali grupu</string>
@@ -239,6 +240,7 @@ Izaberite dugačku lozinku koju je teško pogoditi, kao četiri nasumične rije
<item quantity="few">%d posta</item>
<item quantity="other">%d postova</item>
</plurals>
<string name="forum_new_entry_posted">Forum post objavljen</string>
<string name="forum_new_message_hint">Novi post</string>
<string name="forum_message_reply_hint">Novi odgovor</string>
<string name="btn_reply">Odgovor</string>
@@ -431,6 +433,7 @@ Dotaknite + ikonu da uvezete kanal</string>
<!--Link Warning-->
<string name="link_warning_title">Link upozorenje</string>
<string name="link_warning_intro">Upravo ćete otvoriti slijedeći link sa eksternom aplikacijom</string>
<string name="link_warning_text">Ovo može biti upotrijebljeno da vas identifikuju. Razmislite da li vjerujete osobi koja vam je poslala ovaj link i razmotrite da ga možda otvorite u Orfox-u.</string>
<string name="link_warning_open_link">Otvori link</string>
<!--Crash Reporter-->
<string name="crash_report_title">Briar izvještaj po krahu</string>

View File

@@ -19,7 +19,7 @@
<string name="create_account_button">Створити обліковий запис</string>
<string name="more_info">Детальніше</string>
<string name="don_t_ask_again">Не запитувати знову</string>
<string name="setup_huawei_text">Будь ласка, натисніть кнопку, що знаходиться нижче і впевніться у тому, що Briar захищено на екрані \"Захищені додатки\".</string>
<string name="setup_huawei_text">Будь ласка, натисніть кнопку, що знаходиться нижче і впевніться у тому, що Briar захищено на екрані \"Захищені додадтки\".</string>
<string name="setup_huawei_button">Захистити Briar</string>
<string name="setup_huawei_help">Якщо Briar немає у списку захищених додатків, він не зможе працювати у фоновому режимі.</string>
<string name="warning_dozed">%s не вдалося запустити у фоновому режимі</string>
@@ -33,7 +33,7 @@
<string name="startup_failed_notification_title">Briar не може запуститися</string>
<string name="startup_failed_notification_text">Натисніть для детальнішої інформації.</string>
<string name="startup_failed_activity_title">Помилка при запуску Briar</string>
<string name="startup_failed_db_error">З якоїсь причини база даних вашого Briar пошкоджена і не підлягає відновленню. Ваш обліковий запис, дані та усі контакти втрачені. На жаль, вам потрібно перевстановити Briar або створити новий обліковий запис, натиснувши \"Я забув(-ла) свій пароль\".</string>
<string name="startup_failed_db_error">З якоїсь причини база даних вашого Briar пошкоджена і не підлягає відновленню. Ваш обліковий запис, дані та усі контакти втрачені. На жаль, вам потрібно перевстановити Briar або створити новий обліковий запис, натиснувши \"Я забув свій пароль\".</string>
<string name="startup_failed_data_too_old_error">Ваш обліковий запис було створено за допомогою старішої версії цього застосунку і його неможливо відкрити за допомогою поточної версії. Вам необхідно знову встановити старішу версію або створити новий обліковий запис, обравши рядок \"Я забув(-ла) свій пароль\" у спливному вікні паролів.</string>
<string name="startup_failed_data_too_new_error">Ця версія програми застаріла. Будь ласка, оновіться до останньої версії та спробуйте знову.</string>
<string name="startup_failed_service_error">Briar не зміг запустити потрібну втулку. Перевстановлення Briar зазвичай вирішує цю проблему. Однак, будь ласка, зазначте, що у цьому випадку ви втратите свій обліковий запис та усю пов\'язану з ним інформацію, оскільки Briar не використовує центральні сервери для зберігання інформації.</string>
@@ -104,7 +104,7 @@
<string name="ok">Гаразд</string>
<string name="cancel">Скасувати</string>
<string name="got_it">Зрозуміло</string>
<string name="delete">Видалити</string>
<string name="delete">Delete</string>
<string name="accept">Прийняти</string>
<string name="decline">Відхилити</string>
<string name="options">Параметри</string>
@@ -116,9 +116,9 @@
<string name="no_data">Немає даних</string>
<string name="ellipsis"></string>
<string name="text_too_long">Цей текст занадто довгий</string>
<string name="show_onboarding">Показати вікно довідки</string>
<string name="show_onboarding">Показати вікно допомоги</string>
<string name="fix">Виправити</string>
<string name="help">Довідка</string>
<string name="help">Довідкк</string>
<string name="sorry">Вибачте</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Немає контактів для відображення</string>
@@ -129,7 +129,7 @@
<string name="image_caption_hint">Додати заголовок (за бажанням)</string>
<string name="image_attach">Прикріпити зображення</string>
<string name="image_attach_error">Не вдалося прикріпити зображення</string>
<string name="set_contact_alias">Змінити ім\'я контакту</string>
<string name="set_contact_alias">Змінити назву контакту</string>
<string name="set_contact_alias_hint">Назва контакту</string>
<string name="set_alias_button">Змінити</string>
<string name="delete_contact">Вилучити контакт</string>
@@ -143,10 +143,6 @@
<string name="dialog_message_save_image">Зберігаючи це зображення, ви надаєте доступ до нього іншим програмам.\n\nВи впевнені, що хочете його зберегти?</string>
<string name="save_image_success">Зображення було збережено</string>
<string name="save_image_error">Не вдалося зберегти зображення</string>
<string name="dialog_title_no_image_support">Зображення недоступні</string>
<string name="dialog_message_no_image_support">Briar вашого контакту ще не підтримує прикріплення зображень. Щойно користувач(-ка) оновиться, ви бачитиме іншу піктограму.</string>
<string name="dialog_title_image_support">Тепер ви можете надсилати зображення цьому контакту</string>
<string name="dialog_message_image_support">Натисніть на цю піктограму, щоб прикріпити зображення.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Додати контакт</string>
<string name="face_to_face">Ви маєте зустрітися з особою, яку ви бажаєте додати до списку контактів.\n\nЦе виключить можливість у майбутньому будь-кому видавати себе за вас або читати ваші повідомлення.</string>
@@ -157,13 +153,13 @@
<string name="contact_added_toast">Додали контакт: %s</string>
<string name="contact_already_exists">Контакт %s вже існує</string>
<string name="qr_code_invalid">QR-код неправильний</string>
<string name="qr_code_too_old">QR-код, який ви просканували, надійшов зі старішої версії від %s.\n\nБудь ласка, попросіть у свого контакту оновитися до останньої версії, а тоді спробуйте знову.</string>
<string name="qr_code_too_new">QR-код, який ви просканували, надійшов з новішої версії від %s.\n\nБудь ласка, оновіться до останньої версії, а тоді спробуйте знову.</string>
<string name="qr_code_too_old">QR-код, який ви відсканували, надійшов зі старішої версії від %s.\n\nБудь ласка, попросіть у свого контакта оновитися до останньої версіїї, а тоді спробуйте знову.</string>
<string name="qr_code_too_new">QR-код, який ви відсканували, надійшов з більш нової версії від %s.\n\nБудь ласка, оновіться до останньої версіїї, а тоді спробуйте знову.</string>
<string name="camera_error">Помилка камери</string>
<string name="connecting_to_device">З\'єднання з пристроєм\u2026</string>
<string name="authenticating_with_device">Автентифікація з пристроєм\u2026</string>
<string name="authenticating_with_device">Аутентифікація з пристроєм\u2026</string>
<string name="connection_error_title">Неможливо з\'єднатися з вашим контактом</string>
<string name="connection_error_explanation">Будь ласка, впевніться, що ви обоє під\'єднані до однієї Wi-Fi-мережі.</string>
<string name="connection_error_explanation">Будь ласка, впевніться, що ви обидва під\'єднані до однієї Wi-Fi-мережі.</string>
<string name="connection_error_feedback">Якщо ця проблема збережеться, будь ласка, <a href="feedback">надішліть відгук</a>, щоб допомогти нам вдосконалити цей додаток.</string>
<!--Introductions-->
<string name="introduction_onboarding_title">Поділитися своїми контактами</string>
@@ -182,11 +178,11 @@
<string name="introduction_request_exists_received">%1$sпопросив вас представити %2$s, однак %2$sвже є у вашому списку контактів. Оскільки %1$sпро це може бути невідомо, ви все ще можете відповісти:</string>
<string name="introduction_request_answered_received">%1$sпопросив представити вас %2$s.</string>
<string name="introduction_response_accepted_sent">Ви прийняли запит на знайомство від %1$s.</string>
<string name="introduction_response_accepted_sent_info">Перед тим, як ви додасте %1$s до списку своїх контактів, він/вона також має підтвердити цей запит. Це може зайняти якийсь час.</string>
<string name="introduction_response_accepted_sent_info">Перед тим, як ви додасте %1$s до списку своїх контактів, вони також мають підтвердити цей запит. Це може зайняти якийсь час.</string>
<string name="introduction_response_declined_sent">Ви відхилили запит на знайомство з %1$s.</string>
<string name="introduction_response_accepted_received">%1$sприйняв(-ла) запит на знайомство із %2$s.</string>
<string name="introduction_response_declined_received">%1$sвідхилив(-ла) запит на знайомство з %2$s.</string>
<string name="introduction_response_declined_received_by_introducee">%1$s повідомляє, що %2$s відхилив(-ла) запит на знайомство.</string>
<string name="introduction_response_accepted_received">%1$sприйняв запит на знайомство із %2$s.</string>
<string name="introduction_response_declined_received">%1$sвідхилив запит на знайомство з %2$s.</string>
<string name="introduction_response_declined_received_by_introducee">%1$s повідомляє, що %2$s відхилив запит на знайомство.</string>
<plurals name="introduction_notification_text">
<item quantity="one">Новий контакт додано.</item>
<item quantity="few">%d нові контакти додано.</item>
@@ -205,18 +201,19 @@
</plurals>
<string name="groups_group_is_empty">Ця група порожня</string>
<string name="groups_group_is_dissolved">Цю групу було розформовано</string>
<string name="groups_remove">Прибрати</string>
<string name="groups_remove">Забрати</string>
<string name="groups_create_group_title">Створити приватну групу</string>
<string name="groups_create_group_button">Створити групу</string>
<string name="groups_create_group_invitation_button">Надіслати запрошення</string>
<string name="groups_create_group_hint">Оберіть назву своїй приватній групі</string>
<string name="groups_invitation_sent">Відправлено запрошення до групи</string>
<string name="groups_message_sent">Повідомлення надіслано</string>
<string name="groups_member_list">Список учасників</string>
<string name="groups_invite_members">Запросити учасників</string>
<string name="groups_member_created_you">Ви створили групу</string>
<string name="groups_member_created">%s створив(-ла) групу</string>
<string name="groups_member_created">%s створив групу</string>
<string name="groups_member_joined_you">Ви приєдналися до групи</string>
<string name="groups_member_joined">%s приєднався(-лась) до групи</string>
<string name="groups_member_joined">%s приєднався до групи</string>
<string name="groups_leave">Вийти з групи</string>
<string name="groups_leave_dialog_title">Підтвердити свій вихід з групи</string>
<string name="groups_leave_dialog_message">Ви впевнені, що хочете вийти з цієї групи?</string>
@@ -240,8 +237,8 @@
</plurals>
<string name="groups_invitations_response_accepted_sent">Ви прийняли запрошення до групи від %s.</string>
<string name="groups_invitations_response_declined_sent">Ви відхилили запрошення до групи від %s.</string>
<string name="groups_invitations_response_accepted_received">%s прийняв(-ла) запрошення до групи.</string>
<string name="groups_invitations_response_declined_received">%sвідхилив(-ла) запрошення до групи.</string>
<string name="groups_invitations_response_accepted_received">%s прийняв запрошення до групи.</string>
<string name="groups_invitations_response_declined_received">%sвідхилив запрошення до групи.</string>
<string name="sharing_status_groups">Лише засновник групи може запрошувати нових учасників до групи. Нижче зазначено усх актуальних учасників групи.</string>
<!--Private Groups Revealing Contacts-->
<string name="groups_reveal_contacts">Відкрити контакти</string>
@@ -254,7 +251,7 @@
<string name="no_forums">Немає форумів до показу</string>
<string name="no_forums_action">Натисніть на символ \"+\", щоб створити форум або попросіть у своїх контактів поділитися з вами форумами.</string>
<string name="create_forum_title">Створити форум</string>
<string name="choose_forum_hint">Оберіть назву для свого форуму</string>
<string name="choose_forum_hint">Оберіть ім\'я для свого форуму</string>
<string name="create_forum_button">Створити форум</string>
<string name="forum_created_toast">Форум було створено</string>
<string name="no_forum_posts">Немає дописів для показу</string>
@@ -265,6 +262,7 @@
<item quantity="many">%d дописів</item>
<item quantity="other">%d допису</item>
</plurals>
<string name="forum_new_entry_posted">На форумі було опубліковано допис</string>
<string name="forum_new_message_hint">Новий допис</string>
<string name="forum_message_reply_hint">Нова відповідь</string>
<string name="btn_reply">Відповісти</string>
@@ -314,7 +312,7 @@
<string name="blogs_blog_post_received">Отримано новий допис блогу</string>
<string name="blogs_blog_post_scroll_to">Прокрутити до</string>
<string name="blogs_feed_empty_state">Немає дописів для відображення</string>
<string name="blogs_feed_empty_state_action">Тут будуть з\'являтися дописи від ваших контактів та блоги, на які ви підписані.\n\nНатисніть на піктограму \"Ручка\", щоб створити допис</string>
<string name="blogs_feed_empty_state_action">Тут будуть з\'являтися дописи від ваших контактів та блоги, на які ви підписані.\n\nНатисніть на позначку \"Ручка\", щоб створити допис</string>
<string name="blogs_remove_blog">Видалити блог</string>
<string name="blogs_remove_blog_dialog_message">Ви впевнені, що хочете видалити цей блог?\n\nДописи буде видалено з вашого пристрою, але не з пристроїв інших осіб.\n\nБудь-які контакти, поміж яких ви поширили цей блог, можуть припинити отримувати оновлення.</string>
<string name="blogs_remove_blog_ok">Видалити</string>
@@ -374,8 +372,6 @@
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
<string name="tor_network_setting_summary">Автоматично: %1$s (через %2$s)</string>
<string name="tor_mobile_data_title">Використовувати мобільну мережу</string>
<string name="tor_only_when_charging_title">З’єднуватись через інтернет (Tor) тільки під час заряджання</string>
<string name="tor_only_when_charging_summary">Вимикає з’єднання з інтернетом коли пристрій працює від батареї</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Безпека</string>
<string name="pref_lock_title">Блокування програми</string>
@@ -445,7 +441,7 @@
<!--Link Warning-->
<string name="link_warning_title">Попередження про посилання</string>
<string name="link_warning_intro">Ви збираєтеся відкрити наступне посилання за допомогою зовнішньої програми.</string>
<string name="link_warning_text">Це може бути використання для визначення вашої особи. Подумайте про те, чи довіряєте ви людині, яка надіслала вам це посилання, і подумайте про його відкриття за допомогою Tor Browser.</string>
<string name="link_warning_text">Це може бути використано для вашої ідентифікації. Подумайте, чи довіряєте ви особі, яка надіслала вам це посилання та розгляньте варіант відкрити його за допомогою Orfox.</string>
<string name="link_warning_open_link">Відкрити посилання</string>
<!--Crash Reporter-->
<string name="crash_report_title">Аварійний звіт Briar</string>

View File

@@ -111,8 +111,6 @@
<string name="date_no_private_messages">没有消息。</string>
<string name="no_private_messages">尚无消息可供显示</string>
<string name="message_hint">输入信息</string>
<string name="image_attach">附加图片</string>
<string name="image_attach_error">无法附加图片</string>
<string name="set_contact_alias">更改联系人姓名</string>
<string name="set_contact_alias_hint">联系人姓名</string>
<string name="set_alias_button">更改</string>
@@ -121,15 +119,6 @@
<string name="dialog_message_delete_contact">确认要删除该联系人和与之交流的所有消息吗?</string>
<string name="contact_deleted_toast">联系人已删除</string>
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
<string name="save_image">保存图片</string>
<string name="dialog_title_save_image">确定保存图片吗?</string>
<string name="dialog_message_save_image">保存这张图片将会使其他应用可以访问到它。\n\n你确定要保存吗</string>
<string name="save_image_success">图片已保存</string>
<string name="save_image_error">无法保存图片</string>
<string name="dialog_title_no_image_support">图片无法访问</string>
<string name="dialog_message_no_image_support">你的联系人的 Briar 尚未支持图片附件。一旦他们升级你就会看到不同图标。</string>
<string name="dialog_title_image_support">你现在可以向此联系人发送图片。</string>
<string name="dialog_message_image_support">轻按此图标即可附加图片。</string>
<!--Adding Contacts-->
<string name="add_contact_title">添加联系人</string>
<string name="face_to_face">您必须面对面添加联系人。\n\n这样将防止未来他人冒充您的身份并查看您的信息。</string>
@@ -188,6 +177,7 @@
<string name="groups_create_group_invitation_button">发送邀请</string>
<string name="groups_create_group_hint">为私密群聊命名</string>
<string name="groups_invitation_sent">群聊邀请已发送</string>
<string name="groups_message_sent">消息已发送</string>
<string name="groups_member_list">成员列表</string>
<string name="groups_invite_members">邀请成员</string>
<string name="groups_member_created_you">您创建了群聊</string>
@@ -236,6 +226,7 @@
<plurals name="posts">
<item quantity="other">%d 条帖子</item>
</plurals>
<string name="forum_new_entry_posted">论坛帖子已发布</string>
<string name="forum_new_message_hint">新帖子</string>
<string name="forum_message_reply_hint">新回复</string>
<string name="btn_reply">回复</string>
@@ -410,6 +401,7 @@
<!--Link Warning-->
<string name="link_warning_title">链接警告</string>
<string name="link_warning_intro">您将要在另一个应用中打开以下链接</string>
<string name="link_warning_text">这可能被用来辨认您的真实身份。请考虑您是否信任发送该链接给您的人,并考虑使用 Orfox 打开该链接。</string>
<string name="link_warning_open_link">打开链接</string>
<!--Crash Reporter-->
<string name="crash_report_title">Briar 崩溃报告</string>

View File

@@ -27,7 +27,6 @@
<item>en-US</item>
<item>ar</item>
<item>ast</item>
<item>az</item>
<item>bg</item>
<item>br</item>
<item>ca</item>

View File

@@ -211,6 +211,7 @@
<string name="groups_create_group_invitation_button">Send Invitation</string>
<string name="groups_create_group_hint">Choose a name for your private group</string>
<string name="groups_invitation_sent">Group invitation has been sent</string>
<string name="groups_message_sent">Message sent</string>
<string name="groups_member_list">Member List</string>
<string name="groups_invite_members">Invite Members</string>
<string name="groups_member_created_you">You created the group</string>
@@ -264,6 +265,7 @@
<item quantity="one">%d post</item>
<item quantity="other">%d posts</item>
</plurals>
<string name="forum_new_entry_posted">Forum post published</string>
<string name="forum_new_message_hint">New Post</string>
<string name="forum_message_reply_hint">New Reply</string>
<string name="btn_reply">Reply</string>
@@ -454,7 +456,7 @@
<!-- Link Warning -->
<string name="link_warning_title">Link Warning</string>
<string name="link_warning_intro">You are about to open the following link with an external app.</string>
<string name="link_warning_text">This can be used to identify you. Think about whether you trust the person that sent you this link and consider opening it with Tor Browser.</string>
<string name="link_warning_text">This can be used to identify you. Think about whether you trust the person that sent you this link and consider opening it with Orfox.</string>
<string name="link_warning_open_link">Open Link</string>
<!-- Crash Reporter -->

View File

@@ -29,7 +29,7 @@
<item name="android:activityCloseExitAnimation">@anim/screen_new_out</item>
</style>
<style name="BriarDialogTheme" parent="Theme.AppCompat.DayNight.Dialog.MinWidth">
<style name="BriarDialogTheme" parent="Theme.AppCompat.DayNight.Dialog">
<item name="colorPrimary">@color/briar_primary</item>
<item name="colorPrimaryDark">@color/briar_primary_dark</item>
<item name="colorAccent">@color/briar_accent</item>

View File

@@ -57,32 +57,34 @@ dependencyVerification {
'com.android.support:transition:28.0.0:transition-28.0.0.aar:45d09fc51284c17bbab300f5122512ac7d7348a6d23bda2051648bbe76cc9aa5',
'com.android.support:versionedparcelable:28.0.0:versionedparcelable-28.0.0.aar:60eb1cb08f71b65c3f6123135e03ebeb5930b5e126e1e5b2ac91b386908c9d02',
'com.android.support:viewpager:28.0.0:viewpager-28.0.0.aar:013c4c53058758ec104dbae970be58159f75dfe342ba8b937d15ff5282e35ffc',
'com.android.tools.analytics-library:protos:26.3.2:protos-26.3.2.jar:50238fb4298b297217b184b9cd93c14f83536fcee829eb0ca850bdb5b53251f0',
'com.android.tools.analytics-library:shared:26.3.2:shared-26.3.2.jar:ddd80dcf21905018b7c0583ba72b7282f446084d4952422609a09fbf8237ef71',
'com.android.tools.analytics-library:tracker:26.3.2:tracker-26.3.2.jar:28c575d2d1af003e96d7b375a668ee10b2673a2dd0f6438750aa8c3b42e7d0ad',
'com.android.tools.build:apksig:3.3.2:apksig-3.3.2.jar:84c4aaa20127c6c1fe6bdd334b3f5df71f54ad080be9029c8a10f43b6a908acd',
'com.android.tools.build:apkzlib:3.3.2:apkzlib-3.3.2.jar:d34e523278e5dff565eba3ef3c089d515b2b5cc7b47dc77e2f3465e5e47176ac',
'com.android.tools.build:builder-model:3.3.2:builder-model-3.3.2.jar:055e3db0ecee9e06b9f024034999a29cd92cb1885207b37542126bd8bcc57f46',
'com.android.tools.build:builder-test-api:3.3.2:builder-test-api-3.3.2.jar:0b2e4cd7615bbcad14a3c91fe45ae26693508d06e40ba06c5968b8bc24416618',
'com.android.tools.build:builder:3.3.2:builder-3.3.2.jar:65649704da7aef0487235fd326f0f2e99ed5cf958e80f204496e6e08a42bd9f5',
'com.android.tools.build:gradle-api:3.3.2:gradle-api-3.3.2.jar:3cbd47e41bb70330dd72ec2c9fe51e6173554b484a03829b5a2de9e00841e040',
'com.android.tools.build:manifest-merger:26.3.2:manifest-merger-26.3.2.jar:05c4a6d8b02fb9f08744876477d0a68547c03a8a9069b1f086684fa04af97c33',
'com.android.tools.ddms:ddmlib:26.3.2:ddmlib-26.3.2.jar:d248da8a563d6e46d2c7ebbf371a4877e00510f4ca763c0bb272d5a281bf8b85',
'com.android.tools.external.com-intellij:intellij-core:26.3.2:intellij-core-26.3.2.jar:6c5ecc968230e9f4dcd0fef28885379feace1f0cd8130de6f61d649c86139bf3',
'com.android.tools.external.com-intellij:kotlin-compiler:26.3.2:kotlin-compiler-26.3.2.jar:1007d9b07ccb49cd8eaf30fda10ed4681d4714f2f9ab2ecda39b4e539cc51bbe',
'com.android.tools.external.org-jetbrains:uast:26.3.2:uast-26.3.2.jar:5d1833e562ea4f38a89708dfde695f0a162cbd39d003d3dde818c3fdc2b05317',
'com.android.tools.layoutlib:layoutlib-api:26.3.2:layoutlib-api-26.3.2.jar:d7e61e874ab95f5c350dd38b6a95b5c9dbe0083a02001884264cdb390cb255b8',
'com.android.tools.lint:lint-api:26.3.2:lint-api-26.3.2.jar:5867dfd7fb4a4e161a816a5d29d045f9b542d34594c00a1efec46fb4cd0e1033',
'com.android.tools.lint:lint-checks:26.3.2:lint-checks-26.3.2.jar:4b163b9c93790d2771e92ba8de58a0d9e0671ffcf2ccef3cf496efd442e27517',
'com.android.tools.lint:lint-gradle-api:26.3.2:lint-gradle-api-26.3.2.jar:54cb282e0c054f9bed3f51302ce08b003c8ab7961dfd5a4f6de26c23cc23062f',
'com.android.tools.lint:lint-gradle:26.3.2:lint-gradle-26.3.2.jar:bb139615f4ce97d42cc394b9389b49b76a6eb85be6785a5d272991543b519013',
'com.android.tools.lint:lint:26.3.2:lint-26.3.2.jar:ef7b369f8a56a92ccb0f4c1c357666b9339e4a711a9d84747d446441746cfe4e',
'com.android.tools:annotations:26.3.2:annotations-26.3.2.jar:5bcce8e98b6a2f5ccf13ebcefd8f734e0b35f8b19e456575665631442ce1f7a1',
'com.android.tools:common:26.3.2:common-26.3.2.jar:d9f8e7f0669e9a701568e3db6a87c89cf12d8fa6811c9991e969f950215ecfac',
'com.android.tools:dvlib:26.3.2:dvlib-26.3.2.jar:d84aad56161c7773579303d69714ded6897c64c6ddfd7d456e453231e4dfe811',
'com.android.tools:repository:26.3.2:repository-26.3.2.jar:da611eeb06e9ab8750d25b9e2901e10db8e5ec6304eb4c8b7103d39e0921ea40',
'com.android.tools:sdk-common:26.3.2:sdk-common-26.3.2.jar:82823a3bf25e64fac33a286490f0cf5ac50c2cdb3c540149b030896bb44bf96c',
'com.android.tools:sdklib:26.3.2:sdklib-26.3.2.jar:424d15492af67321900963238646d27495ab60de2a5b19e6a416963bc5d6932b',
'com.android.tools.analytics-library:protos:26.2.1:protos-26.2.1.jar:2f371f5b1f551e85ab08be4d6a2873471b3d44afd1ebf6aa3298f3b796bf691f',
'com.android.tools.analytics-library:shared:26.2.1:shared-26.2.1.jar:4c1e4e705fa4d45f23aaea230557f6508155012d9c296337787c1d7b26a97f5a',
'com.android.tools.analytics-library:tracker:26.2.1:tracker-26.2.1.jar:4a624ecc976539f755ddb0bb8dfc2dd3d08326cfec59a098dbd70f701ca7fb75',
'com.android.tools.build:aapt2:3.2.1-4818971:aapt2-3.2.1-4818971-linux.jar:f431b6f96c91a2c155144b091a9c97d9805c589fe8efc9c930b6cd346cb60a1e',
'com.android.tools.build:apksig:3.2.1:apksig-3.2.1.jar:2b46f2feffea66037aab29e4261b2433c190194a6ef97b958511eb157f2ccba5',
'com.android.tools.build:apkzlib:3.2.1:apkzlib-3.2.1.jar:c39ad0313905932431fe81c8899c2cf39a4d92ad6c4edcaa4b25432f461452aa',
'com.android.tools.build:builder-model:3.2.1:builder-model-3.2.1.jar:a9f68e6abcec122f9cb5ad352d3f05a3eb03acbcdca95e4d25c16310c2c965ff',
'com.android.tools.build:builder-test-api:3.2.1:builder-test-api-3.2.1.jar:533ac6c2b5884bb54967a33791f2628dfdfac7981af39417a333b43d4379b6be',
'com.android.tools.build:builder:3.2.1:builder-3.2.1.jar:aedcbfd115dbe91d09b4113e66ef50589b558d0aa3b2f133b1d867c9b87fae83',
'com.android.tools.build:gradle-api:3.2.1:gradle-api-3.2.1.jar:57cf0ac5ac1dca8afdb3f62b94265e776e7dcfa641cc3844fb53a05193de208d',
'com.android.tools.build:manifest-merger:26.2.1:manifest-merger-26.2.1.jar:8830573263361035d38cfdcb51e2db94029c93865b21334f5fbf8a27984281a6',
'com.android.tools.ddms:ddmlib:26.2.1:ddmlib-26.2.1.jar:a4bf0a29a19980bf27269465cc782064656750b77c26728f82f9e148b705218b',
'com.android.tools.external.com-intellij:intellij-core:26.2.1:intellij-core-26.2.1.jar:4925ad1892c2687cb1a63427d440ef519c8c59215fefe0dc5d541d5d411fcafe',
'com.android.tools.external.com-intellij:kotlin-compiler:26.2.1:kotlin-compiler-26.2.1.jar:daa064fd708f340ee25fb9823c4c74104ac77f1370b76d907eb9ae6daec0a2ae',
'com.android.tools.external.org-jetbrains:uast:26.2.1:uast-26.2.1.jar:f10f7258d2ab9189562cc0f9ad838c0378fdba439229173390a99de02ebac75b',
'com.android.tools.layoutlib:layoutlib-api:26.2.1:layoutlib-api-26.2.1.jar:ddbf4fca123733fa011595b1cc1f4ac2937ed327b60990711fafc33c775c2ade',
'com.android.tools.lint:lint-api:26.2.1:lint-api-26.2.1.jar:3b57e739de567b98bc9ab56c2c0ee66fc026b4adf5843e8f9804ca0666a6f66e',
'com.android.tools.lint:lint-checks:26.2.1:lint-checks-26.2.1.jar:c86f4cc9aaee722ee4ad70062f7b5af91e9b041914af27adc09f545ab0fb3bc6',
'com.android.tools.lint:lint-gradle-api:26.2.1:lint-gradle-api-26.2.1.jar:2283e7af32e301565f2a797e531f0fc8c648077d457afb3ffdddbee638976c2f',
'com.android.tools.lint:lint-gradle:26.2.1:lint-gradle-26.2.1.jar:8fd90b2f3ec788cbb9801c07ab3e1ea2255aa31a6093157d7ea0ff13d0315ecb',
'com.android.tools.lint:lint-kotlin:26.2.1:lint-kotlin-26.2.1.jar:7a6a5d2b18f69cf1b900d857c2632b4c683713c533295933b8b759f8cab4a877',
'com.android.tools.lint:lint:26.2.1:lint-26.2.1.jar:7848b82ae988b90dee259ae7c7e86e05cbf52db6cd21c8bbd38ce7df08f3f8c5',
'com.android.tools:annotations:26.2.1:annotations-26.2.1.jar:7391c6a1e080174b96e64ceb078dadd31ce4d8a2d2fee0ec65be202126f90f24',
'com.android.tools:common:26.2.1:common-26.2.1.jar:a50aab2d6411ff68f4004a87c7e93d87d8e980a0ec3b352246549897ea2d78e5',
'com.android.tools:dvlib:26.2.1:dvlib-26.2.1.jar:72a83bf2839b1df9b1fbf67ba45d1bfb9f966cd774da4320c762b2be8f1688aa',
'com.android.tools:repository:26.2.1:repository-26.2.1.jar:fa74dae09103faef703df38550ad8fa244c5b6d1bf90d6198be932292b3d9cc1',
'com.android.tools:sdk-common:26.2.1:sdk-common-26.2.1.jar:759d4b292ca69a35cf961fca377b54158fc6c88108978006999442e80a011cf4',
'com.android.tools:sdklib:26.2.1:sdklib-26.2.1.jar:248df7ad5eac4aeb6f96c394c76760de4b7b89ac056e54d0c21a739368b91b45',
'com.github.bumptech.glide:annotations:4.8.0:annotations-4.8.0.jar:4ea82e59874673105165820336c6ac268fc46149892486aad8e7a131a4449446',
'com.github.bumptech.glide:compiler:4.8.0:compiler-4.8.0.jar:1fa93dd0cf7ef0b8b98a59a67a1ee84915416c2d677d83a771ea3e32ad15e6bf',
'com.github.bumptech.glide:gifdecoder:4.8.0:gifdecoder-4.8.0.aar:b00c5454a023a9488ea49603930d9c25e09192e5ceaadf64977aa52946b3c1b4',
@@ -97,12 +99,13 @@ dependencyVerification {
'com.google.dagger:dagger-producers:2.19:dagger-producers-2.19.jar:a17663abe0fc38b676026950907d4c5f5e2bf338375415861eaff6e3bdb0b768',
'com.google.dagger:dagger-spi:2.19:dagger-spi-2.19.jar:e7a6379d82c841f6aac2866948ad1eed716528707814602842a8d844ce04e2e1',
'com.google.dagger:dagger:2.19:dagger-2.19.jar:514b6f1e0727c6572e1d65cb27e4ae668b7aeaeb93a29515182965265b609939',
'com.google.errorprone:error_prone_annotations:2.0.18:error_prone_annotations-2.0.18.jar:cb4cfad870bf563a07199f3ebea5763f0dec440fcda0b318640b1feaa788656b',
'com.google.errorprone:error_prone_annotations:2.1.3:error_prone_annotations-2.1.3.jar:03d0329547c13da9e17c634d1049ea2ead093925e290567e1a364fd6b1fc7ff8',
'com.google.errorprone:javac-shaded:9-dev-r4023-3:javac-shaded-9-dev-r4023-3.jar:65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30',
'com.google.googlejavaformat:google-java-format:1.5:google-java-format-1.5.jar:aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e',
'com.google.guava:guava:20.0:guava-20.0.jar:36a666e3b71ae7f0f0dca23654b67e086e6c93d192f60ba5dfd5519db6c288c8',
'com.google.guava:guava:23.0:guava-23.0.jar:7baa80df284117e5b945b19b98d367a85ea7b7801bd358ff657946c3bd1b6596',
'com.google.guava:guava:25.0-jre:guava-25.0-jre.jar:3fd4341776428c7e0e5c18a7c10de129475b69ab9d30aeafbb5c277bb6074fa9',
'com.google.guava:guava:26.0-jre:guava-26.0-jre.jar:a0e9cabad665bc20bcd2b01f108e5fc03f756e13aea80abaadb9f407033bea2c',
'com.google.j2objc:j2objc-annotations:1.1:j2objc-annotations-1.1.jar:40ceb7157feb263949e0f503fe5f71689333a621021aa20ce0d0acee3badaa0f',
'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',
@@ -160,8 +163,7 @@ dependencyVerification {
'org.bouncycastle:bcprov-jdk15on:1.52:bcprov-jdk15on-1.52.jar:0dc4d181e4d347893c2ddbd2e6cd5d7287fc651c03648fa64b2341c7366b1773',
'org.bouncycastle:bcprov-jdk15on:1.56:bcprov-jdk15on-1.56.jar:963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349',
'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.codehaus.groovy:groovy-all:2.4.15:groovy-all-2.4.15.jar:51d6c4e71782e85674239189499854359d380fb75e1a703756e3aaa5b98a5af0',
'org.codehaus.groovy:groovy-all:2.4.12:groovy-all-2.4.12.jar:6a56af4bd48903d56bec62821876cadefafd007360cc6bd0d8f7aa8d72b38be4',
'org.codehaus.mojo:animal-sniffer-annotations:1.14:animal-sniffer-annotations-1.14.jar:2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d',
'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',
@@ -172,11 +174,11 @@ dependencyVerification {
'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9',
'org.hamcrest:hamcrest-integration:1.3:hamcrest-integration-1.3.jar:70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2',
'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c',
'org.jetbrains.kotlin:kotlin-reflect:1.3.21:kotlin-reflect-1.3.21.jar:a3065c822633191e0a3e3ee12a29bec234fc4b2864a6bb87ef48cce3e9e0c26a',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.21:kotlin-stdlib-common-1.3.21.jar:cea61f7b611895e64f58569a9757fc0ab0d582f107211e1930e0ce2a0add52a7',
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21:kotlin-stdlib-jdk7-1.3.21.jar:a87875604fd42140da6938ae4d35ee61081f4482536efc6d2615b8b626a198af',
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.21:kotlin-stdlib-jdk8-1.3.21.jar:5823ed66ac122a1c55442ebca5a209a843ccd87f562edc31a787f3d2e47f74d4',
'org.jetbrains.kotlin:kotlin-stdlib:1.3.21:kotlin-stdlib-1.3.21.jar:38ba2370d9f06f50433e06b2ca775b94473c2e2785f410926079ab793c72b034',
'org.jetbrains.kotlin:kotlin-reflect:1.2.0:kotlin-reflect-1.2.0.jar:4f48a872bad6e4d9c053f4ad610d11e4012ad7e58dc19a03dd5eb811f36069dd',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.2.71:kotlin-stdlib-common-1.2.71.jar:63999687ff2fce8a592dd180ffbbf8f1d21c26b4044c55cdc74ff3cf3b3cf328',
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.71:kotlin-stdlib-jdk7-1.2.71.jar:b136bd61b240e07d4d92ce00d3bd1dbf584400a7bf5f220c2f3cd22446858082',
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.71:kotlin-stdlib-jdk8-1.2.71.jar:ac3c8abf47790b64b4f7e2509a53f0c145e061ac1612a597520535d199946ea9',
'org.jetbrains.kotlin:kotlin-stdlib:1.2.71:kotlin-stdlib-1.2.71.jar:4c895c270b87f5fec2a2796e1d89c15407ee821de961527c28588bb46afbc68b',
'org.jetbrains.trove4j:trove4j:20160824:trove4j-20160824.jar:1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7',
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c',

View File

@@ -12,12 +12,6 @@ import javax.annotation.Nullable;
@NotNullByDefault
public interface MessageTracker {
/**
* Initializes the group count with zero messages,
* but uses the current time as latest message time for sorting.
*/
void initializeGroupCount(Transaction txn, GroupId g) throws DbException;
/**
* Gets the number of visible and unread messages in the group
* as well as the timestamp of the latest message

View File

@@ -31,15 +31,6 @@ public abstract class ConversationClientImpl extends BdfIncomingMessageHook
this.messageTracker = messageTracker;
}
/**
* Initializes the group count with zero messages,
* but uses the current time as latest message time for sorting.
*/
protected void initializeGroupCount(Transaction txn, GroupId g)
throws DbException {
messageTracker.initializeGroupCount(txn, g);
}
@Override
public GroupCount getGroupCount(Transaction txn, ContactId contactId)
throws DbException {

View File

@@ -11,7 +11,6 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.briar.api.client.MessageTracker;
import javax.annotation.Nullable;
@@ -30,22 +29,11 @@ class MessageTrackerImpl implements MessageTracker {
private final DatabaseComponent db;
private final ClientHelper clientHelper;
private final Clock clock;
@Inject
MessageTrackerImpl(DatabaseComponent db, ClientHelper clientHelper,
Clock clock) {
MessageTrackerImpl(DatabaseComponent db, ClientHelper clientHelper) {
this.db = db;
this.clientHelper = clientHelper;
this.clock = clock;
}
@Override
public void initializeGroupCount(Transaction txn, GroupId g)
throws DbException {
long now = clock.currentTimeMillis();
GroupCount groupCount = new GroupCount(0, 0, now);
storeGroupCount(txn, g, groupCount);
}
@Override

View File

@@ -93,8 +93,6 @@ class MessagingManagerImpl extends ConversationClientImpl
} catch (FormatException e) {
throw new AssertionError(e);
}
// Initialize the group count with current time
initializeGroupCount(txn, g.getId());
}
@Override

View File

@@ -4,22 +4,16 @@ 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.Transaction;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.test.BrambleMockTestCase;
import org.briarproject.bramble.test.TestUtils;
import org.briarproject.briar.api.client.MessageTracker;
import org.jmock.Expectations;
import org.junit.Assert;
import org.junit.Test;
import static org.briarproject.briar.client.MessageTrackerConstants.GROUP_KEY_LATEST_MSG;
import static org.briarproject.briar.client.MessageTrackerConstants.GROUP_KEY_MSG_COUNT;
import static org.briarproject.briar.client.MessageTrackerConstants.GROUP_KEY_STORED_MESSAGE_ID;
import static org.briarproject.briar.client.MessageTrackerConstants.GROUP_KEY_UNREAD_COUNT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class MessageTrackerTest extends BrambleMockTestCase {
@@ -27,31 +21,13 @@ public class MessageTrackerTest extends BrambleMockTestCase {
protected final ClientHelper clientHelper =
context.mock(ClientHelper.class);
private final DatabaseComponent db = context.mock(DatabaseComponent.class);
private final Clock clock = context.mock(Clock.class);
private final MessageId messageId = new MessageId(TestUtils.getRandomId());
private final MessageTracker messageTracker =
new MessageTrackerImpl(db, clientHelper, clock);
new MessageTrackerImpl(db, clientHelper);
private final BdfDictionary dictionary = BdfDictionary.of(
new BdfEntry(GROUP_KEY_STORED_MESSAGE_ID, messageId)
);
@Test
public void testInitializeGroupCount() throws Exception {
Transaction txn = new Transaction(null, false);
long now = 42L;
BdfDictionary dictionary = BdfDictionary.of(
new BdfEntry(GROUP_KEY_MSG_COUNT, 0),
new BdfEntry(GROUP_KEY_UNREAD_COUNT, 0),
new BdfEntry(GROUP_KEY_LATEST_MSG, now)
);
context.checking(new Expectations() {{
oneOf(clock).currentTimeMillis();
will(returnValue(now));
oneOf(clientHelper).mergeGroupMetadata(txn, groupId, dictionary);
}});
messageTracker.initializeGroupCount(txn, groupId);
}
@Test
public void testMessageStore() throws Exception {
context.checking(new Expectations() {{
@@ -67,8 +43,8 @@ public class MessageTrackerTest extends BrambleMockTestCase {
will(returnValue(dictionary));
}});
MessageId loadedId = messageTracker.loadStoredMessageId(groupId);
assertNotNull(loadedId);
assertEquals(messageId, loadedId);
Assert.assertNotNull(loadedId);
Assert.assertTrue(messageId.equals(loadedId));
}
}

View File

@@ -11,10 +11,6 @@ The REST API peer comes as a `jar` file
and needs a Java Runtime Environment (JRE) that supports at least Java 8.
It currently works only on GNU/Linux operating systems.
To build the `jar` file, you can do this:
$ ./gradlew --configure-on-demand briar-headless:jar
You can start the peer (and its API server) like this:
$ java -jar briar-headless/build/libs/briar-headless.jar

View File

@@ -1,8 +1,8 @@
plugins {
id 'java'
id 'idea'
id 'org.jetbrains.kotlin.jvm' version '1.3.21'
id 'org.jetbrains.kotlin.kapt' version '1.3.21'
id 'org.jetbrains.kotlin.jvm' version '1.2.71'
id 'org.jetbrains.kotlin.kapt' version '1.2.71'
id 'witness'
}
apply from: 'witness.gradle'
@@ -14,10 +14,10 @@ dependencies {
implementation project(path: ':briar-core', configuration: 'default')
implementation project(path: ':bramble-java', configuration: 'default')
implementation 'io.javalin:javalin:2.7.0'
implementation 'io.javalin:javalin:2.4.0'
implementation 'org.slf4j:slf4j-simple:1.7.25'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
implementation 'com.github.ajalt:clikt:1.6.0'
implementation 'com.github.ajalt:clikt:1.5.0'
kapt 'com.google.dagger:dagger-compiler:2.19'
@@ -28,7 +28,7 @@ dependencies {
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
testRuntime "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
testImplementation "io.mockk:mockk:1.9.2"
testImplementation "io.mockk:mockk:1.8.12"
testImplementation "org.skyscreamer:jsonassert:1.5.0"
testImplementation 'khttp:khttp:0.1.0'

View File

@@ -3,7 +3,7 @@ dependencyVerification {
'com.fasterxml.jackson.core:jackson-annotations:2.9.0:jackson-annotations-2.9.0.jar:45d32ac61ef8a744b464c54c2b3414be571016dd46bfc2bec226761cf7ae457a',
'com.fasterxml.jackson.core:jackson-core:2.9.8:jackson-core-2.9.8.jar:d934dab0bd48994eeea2c1b493cb547158a338a80b58c4fbc8e85fb0905e105f',
'com.fasterxml.jackson.core:jackson-databind:2.9.8:jackson-databind-2.9.8.jar:2351c3eba73a545db9079f5d6d768347ad72666537362c8220fe3e950a55a864',
'com.github.ajalt:clikt:1.6.0:clikt-1.6.0.jar:ebab34d5a60817bb7d471a67cd1740b91a5d99e224660bddbcf32bac1651a575',
'com.github.ajalt:clikt:1.5.0:clikt-1.5.0.jar:f13ab614cb0372229f6bb1e19aa98ee6f4ac96f253d0e72d482ee4f5fd2a13a9',
'com.google.code.findbugs:jsr305:1.3.9:jsr305-1.3.9.jar:905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed',
'com.google.dagger:dagger-compiler:2.19:dagger-compiler-2.19.jar:27a4b202a2de908182edb261f8c0a264e08e5e4733d7514bc7fbf0d31da5c0fc',
'com.google.dagger:dagger-producers:2.19:dagger-producers-2.19.jar:a17663abe0fc38b676026950907d4c5f5e2bf338375415861eaff6e3bdb0b768',
@@ -16,58 +16,53 @@ dependencyVerification {
'com.google.j2objc:j2objc-annotations:1.1:j2objc-annotations-1.1.jar:40ceb7157feb263949e0f503fe5f71689333a621021aa20ce0d0acee3badaa0f',
'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90',
'com.vaadin.external.google:android-json:0.0.20131108.vaadin1:android-json-0.0.20131108.vaadin1.jar:dfb7bae2f404cfe0b72b4d23944698cb716b7665171812a0a4d0f5926c0fac79',
'io.javalin:javalin:2.7.0:javalin-2.7.0.jar:0f345ea86419813b2ba45a6d64d284f15099ced9a6ce51cae815e4caec724429',
'io.mockk:mockk-agent-api:1.9.2:mockk-agent-api-1.9.2.jar:396d56cdba086c1bf01d4402591bb7b8fe46de75110c627eb88d2cd3e58bf6f5',
'io.mockk:mockk-agent-common:1.9.2:mockk-agent-common-1.9.2.jar:ac8ab7a568df79ec80449b05c633458397acf40e8ae5db58cd3966d463509ebc',
'io.mockk:mockk-agent-jvm:1.9.2:mockk-agent-jvm-1.9.2.jar:acf0336dc1802cf70450b594adc8f61dce2a6942e8162789dab60f1b54256ae1',
'io.mockk:mockk-common:1.9.2:mockk-common-1.9.2.jar:0f936f82427b0c7822cae8e303cdbd8ceee6204bed80eab3f18cf00f4b9b82a3',
'io.mockk:mockk-dsl-jvm:1.9.2:mockk-dsl-jvm-1.9.2.jar:6f7a3093f05876b24b26db3b6d6a568e0c20253489a588dbc9c67b43eb838ad0',
'io.mockk:mockk-dsl:1.9.2:mockk-dsl-1.9.2.jar:d681ad3a7063a2c7fb8f0164b8eb2fd0085fd9fb77af1a4f189039e73f2ec3c4',
'io.mockk:mockk:1.9.2:mockk-1.9.2.jar:96ce20b64c6d05218fed0b99e93b9b49c2c3f40dd96273b53f2e448a598b1c57',
'io.javalin:javalin:2.4.0:javalin-2.4.0.jar:f23b5e2b63a501e369372fc08f06fc92ace0881f7e13bab17fb41f7c31b34bf1',
'io.mockk:mockk-agent-api:1.8.12:mockk-agent-api-1.8.12.jar:ab956f74d7b2f6926234edd2cc1ff89231056c47ede21b8cfaf405fd9650f502',
'io.mockk:mockk-agent-common:1.8.12:mockk-agent-common-1.8.12.jar:58c3cec1bea418d1995889345a06aca21d041914d3e70b81075cf2dbf6806815',
'io.mockk:mockk-agent-jvm:1.8.12:mockk-agent-jvm-1.8.12.jar:88f3376e1e5607a6f14ac7747ded8ce72c9ca6f3ee203c207e373566b2bea861',
'io.mockk:mockk-common:1.8.12:mockk-common-1.8.12.jar:317ac52976ed8bcebb218e3506b34b273a056b6c6840c1db30a05c9a6971e8ca',
'io.mockk:mockk-dsl-jvm:1.8.12:mockk-dsl-jvm-1.8.12.jar:44797b66dcc0a774084b4b444a1d61ebf7d81e480be2f24f184b186d790ce525',
'io.mockk:mockk-dsl:1.8.12:mockk-dsl-1.8.12.jar:ed72ba909ffb737bb972342df5eda73de72510e8fef9e20fc4dac7806e73a029',
'io.mockk:mockk:1.8.12:mockk-1.8.12.jar:3ad1a39322c2088d7803ff9840e8f9896623530b4cdb2e107957c2b8201fc789',
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'javax.servlet:javax.servlet-api:3.1.0:javax.servlet-api-3.1.0.jar:af456b2dd41c4e82cf54f3e743bc678973d9fe35bd4d3071fa05c7e5333b8482',
'khttp:khttp:0.1.0:khttp-0.1.0.jar:48ab3bd22e461f2c2e74e3446d8f9568e24aab157f61fdc85ded6c0bfbe9a926',
'net.bytebuddy:byte-buddy-agent:1.9.3:byte-buddy-agent-1.9.3.jar:547288e013a9d1f4a4ce2ab84c24e3edda6e433c7fa6b2c3c3613932671b05b1',
'net.bytebuddy:byte-buddy:1.9.3:byte-buddy-1.9.3.jar:a27350be602caea67a33d31281496c84c69b5ab34ddc228e9ff2253fc8f9cd31',
'net.bytebuddy:byte-buddy-agent:1.8.22:byte-buddy-agent-1.8.22.jar:ebc20e83fbb13e7911e4c704c9548a4166d7e83922f80de700ae5c5c983943d5',
'net.bytebuddy:byte-buddy:1.8.22:byte-buddy-1.8.22.jar:d330d2ef290a2852bbaf06eab03bc93d24501599c8a836da9d946f82c48e276c',
'org.apiguardian:apiguardian-api:1.0.0:apiguardian-api-1.0.0.jar:1f58b77470d8d147a0538d515347dd322f49a83b9e884b8970051160464b65b3',
'org.checkerframework:checker-compat-qual:2.5.3:checker-compat-qual-2.5.3.jar:d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d',
'org.codehaus.mojo:animal-sniffer-annotations:1.14:animal-sniffer-annotations-1.14.jar:2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d',
'org.eclipse.jetty.websocket:websocket-api:9.4.15.v20190215:websocket-api-9.4.15.v20190215.jar:dd02de2d37c6ab4f96a2dfe0a54890dbd43731a9a42ce6e1c27cbc173283de85',
'org.eclipse.jetty.websocket:websocket-client:9.4.15.v20190215:websocket-client-9.4.15.v20190215.jar:b1ebbd22278233db8536cf0a7743b31dd12d7ce31b01546895588ed8f6c132df',
'org.eclipse.jetty.websocket:websocket-common:9.4.15.v20190215:websocket-common-9.4.15.v20190215.jar:ccfafda2d235e5dd1a665f8010d8c022a7d1f959e0f3eb6ee4acb92bd0047450',
'org.eclipse.jetty.websocket:websocket-server:9.4.15.v20190215:websocket-server-9.4.15.v20190215.jar:d5a6bb7b228eb96b172f403f2b9418f13a5a91e028e56605d4a7223119b41a98',
'org.eclipse.jetty.websocket:websocket-servlet:9.4.15.v20190215:websocket-servlet-9.4.15.v20190215.jar:db5d0dca8593763c74dee2816e593b0c66ead64e6dce634794670f8aa47cf3e1',
'org.eclipse.jetty:jetty-client:9.4.15.v20190215:jetty-client-9.4.15.v20190215.jar:17f5912b2b90c3a1398cce1c76f2e99910c2c3444932dd9a2b941a8fecf484ef',
'org.eclipse.jetty:jetty-http:9.4.15.v20190215:jetty-http-9.4.15.v20190215.jar:c95711e9759a2bfa43ad5e7eadbbbf86152acba065e38121181bc41596647f9a',
'org.eclipse.jetty:jetty-io:9.4.15.v20190215:jetty-io-9.4.15.v20190215.jar:6f40f4162739ebf1c89a96165f31598bae4101b264098017af563853af8a662a',
'org.eclipse.jetty:jetty-security:9.4.15.v20190215:jetty-security-9.4.15.v20190215.jar:2ae35c6be04d3f47d82fc75e337f6c4cf43ae6e04046cc8b9d6b4b2bb679f507',
'org.eclipse.jetty:jetty-server:9.4.15.v20190215:jetty-server-9.4.15.v20190215.jar:7dda78de3ba23e0c9f7599fb295d5d861fe0ada615b856ce345cf2b8f4e5975f',
'org.eclipse.jetty:jetty-servlet:9.4.15.v20190215:jetty-servlet-9.4.15.v20190215.jar:f817eaeb1d65cc27decf3db3b18f9a8e7d67f4b4587e323bf0f6be9ed0515e96',
'org.eclipse.jetty:jetty-util:9.4.15.v20190215:jetty-util-9.4.15.v20190215.jar:f3deed4141b4595971f504f6b516e7302f307032bc45403a720213e46ca87464',
'org.eclipse.jetty:jetty-webapp:9.4.15.v20190215:jetty-webapp-9.4.15.v20190215.jar:81b56aa7c29513654827adc48e786f121b54183791c132255195b9a45d83a0f3',
'org.eclipse.jetty:jetty-xml:9.4.15.v20190215:jetty-xml-9.4.15.v20190215.jar:c6d97a70572d5400e9ff3b7e32d4a4fd1c61319cbf997655a608064a75466082',
'org.jetbrains.intellij.deps:trove4j:1.0.20181211:trove4j-1.0.20181211.jar:affb7c85a3c87bdcf69ff1dbb84de11f63dc931293934bc08cd7ab18de083601',
'org.jetbrains.kotlin:kotlin-android-extensions:1.3.21:kotlin-android-extensions-1.3.21.jar:2b0462ac3e4b36dffdb3bfa6173cb41b0e24e25a7d7eee1012471f1d27aea2dd',
'org.jetbrains.kotlin:kotlin-annotation-processing-gradle:1.3.21:kotlin-annotation-processing-gradle-1.3.21.jar:faf880315d4fd6a666cc17aa5e9608c7468c70a279b49ccca67dba2a54adf692',
'org.jetbrains.kotlin:kotlin-build-common:1.3.21:kotlin-build-common-1.3.21.jar:f4d8d08c6f5966d9d517ced60c5224c7edca2d811ea0a702bd7199a00dd4fa25',
'org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.21:kotlin-compiler-embeddable-1.3.21.jar:afaaedc324fbf6394d9f39544efcc93cfc59f8a5aa1a1a5c71d61e2483666c6a',
'org.jetbrains.kotlin:kotlin-compiler-runner:1.3.21:kotlin-compiler-runner-1.3.21.jar:73e7088a074f9c517cd4bb2a8611834168459661c832136cf3628ccd5994cc3b',
'org.jetbrains.kotlin:kotlin-daemon-client:1.3.21:kotlin-daemon-client-1.3.21.jar:b3ecce11ec7b311ee0d1ccc65e811f3748f328010765e86cbdb29b2b70f73f1c',
'org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.3.21:kotlin-gradle-plugin-api-1.3.21.jar:ed0ab11437310cd409657c5e5f8a6bf589af0a8348577cd600f54601fc97c369',
'org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.3.21:kotlin-gradle-plugin-model-1.3.21.jar:fbade67a2a3fb234e2d4c1b8f07b2af6c096993f34ed732fe6fadaf696bc208a',
'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21:kotlin-gradle-plugin-1.3.21.jar:7858c58f4c678a8416520f4c094282a481981cfe702d23121118c9c7e9ad2326',
'org.jetbrains.kotlin:kotlin-native-utils:1.3.21:kotlin-native-utils-1.3.21.jar:406010a39f4c8cdd2351cc1110b98ed804c0aa810cb6106e7b9f4f2bcc21cd47',
'org.jetbrains.kotlin:kotlin-reflect:1.3.0:kotlin-reflect-1.3.0.jar:f3231ac1c612fe72de6ffcc4f0b4c5d85ad1ad4c808fb01a1981eab1ee1202c3',
'org.jetbrains.kotlin:kotlin-reflect:1.3.21:kotlin-reflect-1.3.21.jar:a3065c822633191e0a3e3ee12a29bec234fc4b2864a6bb87ef48cce3e9e0c26a',
'org.jetbrains.kotlin:kotlin-script-runtime:1.3.21:kotlin-script-runtime-1.3.21.jar:2e25babc8dcd224b9c479e2c16ce7b4c50407d25f18d60d1fd262f78c2b474cb',
'org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.3.21:kotlin-scripting-compiler-embeddable-1.3.21.jar:f4e6f9fd384d42167e9b89f985ee4a48a0676bfe705b2e2f9d13e1591d4b7c0b',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.10:kotlin-stdlib-common-1.3.10.jar:7ebf12fdadc5fe80f7ed4dbeffb16618cee1c23cbff0b0489a254174500acc68',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.21:kotlin-stdlib-common-1.3.21.jar:cea61f7b611895e64f58569a9757fc0ab0d582f107211e1930e0ce2a0add52a7',
'org.eclipse.jetty.websocket:websocket-api:9.4.12.v20180830:websocket-api-9.4.12.v20180830.jar:6f7ecb42601058ffe4a6c19c5340cac3ebf0f83e2e252b457558f104238278e3',
'org.eclipse.jetty.websocket:websocket-client:9.4.12.v20180830:websocket-client-9.4.12.v20180830.jar:97c6882c858a75776773eaccc01739757c4e9f60a51613878c1f2b2ba03d91af',
'org.eclipse.jetty.websocket:websocket-common:9.4.12.v20180830:websocket-common-9.4.12.v20180830.jar:3c35aefa720c51e09532c16fdbfaaebd1af3e07dee699dacaba8e0ab0adf88e5',
'org.eclipse.jetty.websocket:websocket-server:9.4.12.v20180830:websocket-server-9.4.12.v20180830.jar:7b1bd39006be8c32d7426a119567d860b3e4a3dc3c01a5c91326450bb0213a03',
'org.eclipse.jetty.websocket:websocket-servlet:9.4.12.v20180830:websocket-servlet-9.4.12.v20180830.jar:8d43e0882759ecd093bd1a5a0ef2b4db38ac279212488a34edb8d7de7c45cc4d',
'org.eclipse.jetty:jetty-client:9.4.12.v20180830:jetty-client-9.4.12.v20180830.jar:62efbbfda88cd4f7644242c4b4df8f3b0a671bfeafea7682dabe00352ba07db7',
'org.eclipse.jetty:jetty-http:9.4.12.v20180830:jetty-http-9.4.12.v20180830.jar:20547da653be9942cc63f57e632a732608559aebde69753bc7312cfe16e8d9c0',
'org.eclipse.jetty:jetty-io:9.4.12.v20180830:jetty-io-9.4.12.v20180830.jar:ab1784abbb9e0ed0869ab6568fe46f1faa79fb5e948cf96450daecd9d27ba1db',
'org.eclipse.jetty:jetty-security:9.4.12.v20180830:jetty-security-9.4.12.v20180830.jar:513184970c785ac830424a9c62c2fadfa77a630f44aa0bdd792f00aaa092887e',
'org.eclipse.jetty:jetty-server:9.4.12.v20180830:jetty-server-9.4.12.v20180830.jar:4833644e5c5a09bbddc85f75c53e0c8ed750de120ba248fffd8508028528252d',
'org.eclipse.jetty:jetty-servlet:9.4.12.v20180830:jetty-servlet-9.4.12.v20180830.jar:7310d4cccf8abf27fde0c3f1a32e19c75fe33c6f1ab558f0704d915f0f01cb07',
'org.eclipse.jetty:jetty-util:9.4.12.v20180830:jetty-util-9.4.12.v20180830.jar:60ad53e118a3e7d10418b155b9944d90b2e4e4c732e53ef4f419473288d3f48c',
'org.eclipse.jetty:jetty-webapp:9.4.12.v20180830:jetty-webapp-9.4.12.v20180830.jar:5301e412a32bf7dddcfad458d952179597c61f8fd531c265873562725c3d4646',
'org.eclipse.jetty:jetty-xml:9.4.12.v20180830:jetty-xml-9.4.12.v20180830.jar:5b8298ab3d43ddaf0941d41f51b82c8ae23a247da055fa161b752ab9495155ed',
'org.jetbrains.kotlin:kotlin-android-extensions:1.2.71:kotlin-android-extensions-1.2.71.jar:6c3f52bbb7c25ddb102cfbe1e91e3f1ee45805f842310fb92496668dbf1366de',
'org.jetbrains.kotlin:kotlin-annotation-processing-gradle:1.2.71:kotlin-annotation-processing-gradle-1.2.71.jar:107070d5bc10530a6823907487609899ac4d8753f730b8abf1f158971d93802e',
'org.jetbrains.kotlin:kotlin-build-common:1.2.71:kotlin-build-common-1.2.71.jar:f3c6874442409c5fac7142dc5a4f7a0148147896a6d7f9e0c3cb140690090cb1',
'org.jetbrains.kotlin:kotlin-compiler-embeddable:1.2.71:kotlin-compiler-embeddable-1.2.71.jar:623e546310d3da89ed2bc0cf9f7fedd78fadd9cd65d2ff798fa894c14e527665',
'org.jetbrains.kotlin:kotlin-compiler-runner:1.2.71:kotlin-compiler-runner-1.2.71.jar:7259a24562ba880f821bc7c9ae51f724d66e8ea00f6e3143d4427a161ae6e998',
'org.jetbrains.kotlin:kotlin-daemon-client:1.2.71:kotlin-daemon-client-1.2.71.jar:2ad669e3c2cedd3a2406f3c2c4739dba537acf373d605c207ed5058630e66462',
'org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.2.71:kotlin-gradle-plugin-api-1.2.71.jar:a141e6b9740ebf88ce53d258e40cb59f54ee8e2fafdff4c4c10b0abdceb57cba',
'org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.2.71:kotlin-gradle-plugin-model-1.2.71.jar:7082e9858b3ead143bcb48383007751a776fd46e8ce4cec1a1d4a873db5e7ec1',
'org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.71:kotlin-gradle-plugin-1.2.71.jar:ab88dab9bd2a3c31c4e6aaa0eb4168d13f126e9076561bb42f5f3fe80c902a78',
'org.jetbrains.kotlin:kotlin-reflect:1.2.71:kotlin-reflect-1.2.71.jar:1f3e10abd68d0b0816bddab7314f61269e01d8aa2ca1cbd120c12d3b4dc94b0f',
'org.jetbrains.kotlin:kotlin-script-runtime:1.2.71:kotlin-script-runtime-1.2.71.jar:307d0a56734458a5e57e3ea788c15b22591912ba39f81b2cc8b0a090944012bb',
'org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.2.71:kotlin-scripting-compiler-embeddable-1.2.71.jar:97a5d94241d13719ea756a908262a10c638db7a8caaa23b28537b1687f894f0c',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.2.71:kotlin-stdlib-common-1.2.71.jar:63999687ff2fce8a592dd180ffbbf8f1d21c26b4044c55cdc74ff3cf3b3cf328',
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.71:kotlin-stdlib-jdk7-1.2.71.jar:b136bd61b240e07d4d92ce00d3bd1dbf584400a7bf5f220c2f3cd22446858082',
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.71:kotlin-stdlib-jdk8-1.2.71.jar:ac3c8abf47790b64b4f7e2509a53f0c145e061ac1612a597520535d199946ea9',
'org.jetbrains.kotlin:kotlin-stdlib:1.3.10:kotlin-stdlib-1.3.10.jar:9b9650550fac559f7db64d988123399ea3da7cb776bfb13b9a3ed818eef26969',
'org.jetbrains.kotlin:kotlin-stdlib:1.3.21:kotlin-stdlib-1.3.21.jar:38ba2370d9f06f50433e06b2ca775b94473c2e2785f410926079ab793c72b034',
'org.jetbrains.kotlin:kotlin-stdlib:1.2.71:kotlin-stdlib-1.2.71.jar:4c895c270b87f5fec2a2796e1d89c15407ee821de961527c28588bb46afbc68b',
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
'org.json:json:20150729:json-20150729.jar:38c21b9c3d6d24919cd15d027d20afab0a019ac9205f7ed9083b32bdd42a2353',
'org.junit.jupiter:junit-jupiter-api:5.3.1:junit-jupiter-api-5.3.1.jar:7923e21f030a9964d70a0e48007ca873280c66ddf0f0620b2d969852c23d5653',

View File

@@ -28,7 +28,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
classpath 'com.android.tools.build:gradle:3.2.1'
classpath 'ru.vyarus:gradle-animalsniffer-plugin:1.4.6'
classpath files('libs/gradle-witness.jar')
}

Some files were not shown because too many files have changed in this diff Show More