Compare commits

..

2 Commits

84 changed files with 744 additions and 2659 deletions

View File

@@ -28,20 +28,6 @@
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false" />
</JavaCodeStyleSettings>
<JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value />
</option>
<option name="PACKAGES_IMPORT_LAYOUT">
<value>
<package name="" alias="false" withSubpackages="true" />
<package name="java" alias="false" withSubpackages="true" />
<package name="javax" alias="false" withSubpackages="true" />
<package name="kotlin" alias="false" withSubpackages="true" />
<package name="" alias="true" withSubpackages="true" />
</value>
</option>
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<XML>

View File

@@ -3,4 +3,3 @@ gen
build
.settings
src/main/res/raw/*.zip
src/main/jniLibs

View File

@@ -5,14 +5,14 @@ apply plugin: 'witness'
apply from: 'witness.gradle'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
compileSdkVersion 29
buildToolsVersion '29.0.2'
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
minSdkVersion 16
targetSdkVersion 28
versionCode 10209
versionName "1.2.9"
consumerProguardFiles 'proguard-rules.txt'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -53,12 +53,10 @@ dependencies {
}
def torBinariesDir = 'src/main/res/raw'
def torLibsDir = 'src/main/jniLibs'
task cleanTorBinaries {
doLast {
delete fileTree(torBinariesDir) { include '*.zip' }
delete fileTree(torLibsDir) { include '**/*.so' }
}
}
@@ -69,36 +67,8 @@ task unpackTorBinaries {
copy {
from configurations.tor.collect { zipTree(it) }
into torBinariesDir
include 'geoip.zip'
}
configurations.tor.each { outer ->
zipTree(outer).each { inner ->
if (inner.name.endsWith('_arm_pie.zip')) {
copy {
from zipTree(inner)
into torLibsDir
rename '(.*)', 'armeabi-v7a/lib$1.so'
}
} else if (inner.name.endsWith('_arm64_pie.zip')) {
copy {
from zipTree(inner)
into torLibsDir
rename '(.*)', 'arm64-v8a/lib$1.so'
}
} else if (inner.name.endsWith('_x86_pie.zip')) {
copy {
from zipTree(inner)
into torLibsDir
rename '(.*)', 'x86/lib$1.so'
}
} else if (inner.name.endsWith('_x86_64_pie.zip')) {
copy {
from zipTree(inner)
into torLibsDir
rename '(.*)', 'x86_64/lib$1.so'
}
}
}
// TODO: Remove after next Tor upgrade, which won't include non-PIE binaries
include 'geoip.zip', '*_pie.zip'
}
}
dependsOn cleanTorBinaries
@@ -106,6 +76,5 @@ task unpackTorBinaries {
tasks.withType(MergeResources) {
inputs.dir torBinariesDir
inputs.dir torLibsDir
dependsOn unpackTorBinaries
}

View File

@@ -71,6 +71,7 @@ class AndroidBluetoothPlugin
private final Application app;
private final Clock clock;
private volatile boolean wasEnabledByUs = false;
private volatile BluetoothStateReceiver receiver = null;
// Non-null if the plugin started successfully
@@ -132,10 +133,41 @@ class AndroidBluetoothPlugin
return adapter != null && adapter.isEnabled();
}
@Override
void enableAdapter() {
if (adapter != null && !adapter.isEnabled()) {
if (adapter.enable()) {
LOG.info("Enabling Bluetooth");
wasEnabledByUs = true;
} else {
LOG.info("Could not enable Bluetooth");
}
}
}
@Override
void disableAdapterIfEnabledByUs() {
if (isAdapterEnabled() && wasEnabledByUs) {
if (adapter.disable()) LOG.info("Disabling Bluetooth");
else LOG.info("Could not disable Bluetooth");
wasEnabledByUs = false;
}
}
@Override
void setEnabledByUs() {
wasEnabledByUs = true;
}
@Override
void onAdapterDisabled() {
super.onAdapterDisabled();
wasEnabledByUs = false;
}
@Override
@Nullable
String getBluetoothAddress() {
if (adapter == null) return null;
String address = AndroidUtils.getBluetoothAddress(app, adapter);
return address.isEmpty() ? null : address;
}

View File

@@ -16,42 +16,19 @@ import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.system.LocationUtils;
import org.briarproject.bramble.api.system.ResourceProvider;
import org.briarproject.bramble.util.AndroidUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.net.SocketFactory;
import static android.os.Build.VERSION.SDK_INT;
import static java.util.Arrays.asList;
import static java.util.logging.Level.INFO;
import static java.util.logging.Logger.getLogger;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
class AndroidTorPlugin extends TorPlugin {
private static final List<String> LIBRARY_ARCHITECTURES =
asList("armeabi-v7a", "arm64-v8a", "x86", "x86_64");
private static final String TOR_LIB_NAME = "libtor.so";
private static final String OBFS4_LIB_NAME = "libobfs4proxy.so";
private static final Logger LOG =
getLogger(AndroidTorPlugin.class.getName());
private final Application app;
private final AndroidWakeLock wakeLock;
private final File torLib, obfs4Lib;
AndroidTorPlugin(Executor ioExecutor,
Executor wakefulIoExecutor,
@@ -78,9 +55,6 @@ class AndroidTorPlugin extends TorPlugin {
maxIdleTime, torDirectory);
this.app = app;
wakeLock = wakeLockManager.createWakeLock("TorPlugin");
String nativeLibDir = app.getApplicationInfo().nativeLibraryDir;
torLib = new File(nativeLibDir, TOR_LIB_NAME);
obfs4Lib = new File(nativeLibDir, OBFS4_LIB_NAME);
}
@Override
@@ -111,112 +85,4 @@ class AndroidTorPlugin extends TorPlugin {
super.stop();
wakeLock.release();
}
@Override
protected File getTorExecutableFile() {
return torLib.exists() ? torLib : super.getTorExecutableFile();
}
@Override
protected File getObfs4ExecutableFile() {
return obfs4Lib.exists() ? obfs4Lib : super.getObfs4ExecutableFile();
}
@Override
protected void installTorExecutable() throws IOException {
File extracted = super.getTorExecutableFile();
if (torLib.exists()) {
// If an older version left behind a Tor binary, delete it
if (extracted.exists()) {
if (extracted.delete()) LOG.info("Deleted Tor binary");
else LOG.info("Failed to delete Tor binary");
}
} else if (SDK_INT < 29) {
// The binary wasn't extracted at install time. Try to extract it
extractLibraryFromApk(TOR_LIB_NAME, extracted);
} else {
// No point extracting the binary, we won't be allowed to execute it
throw new FileNotFoundException(torLib.getAbsolutePath());
}
}
@Override
protected void installObfs4Executable() throws IOException {
File extracted = super.getObfs4ExecutableFile();
if (obfs4Lib.exists()) {
// If an older version left behind an obfs4 binary, delete it
if (extracted.exists()) {
if (extracted.delete()) LOG.info("Deleted obfs4 binary");
else LOG.info("Failed to delete obfs4 binary");
}
} else if (SDK_INT < 29) {
// The binary wasn't extracted at install time. Try to extract it
extractLibraryFromApk(OBFS4_LIB_NAME, extracted);
} else {
// No point extracting the binary, we won't be allowed to execute it
throw new FileNotFoundException(obfs4Lib.getAbsolutePath());
}
}
private void extractLibraryFromApk(String libName, File dest)
throws IOException {
File sourceDir = new File(app.getApplicationInfo().sourceDir);
if (sourceDir.isFile()) {
// Look for other APK files in the same directory, if we're allowed
File parent = sourceDir.getParentFile();
if (parent != null) sourceDir = parent;
}
List<String> libPaths = getSupportedLibraryPaths(libName);
for (File apk : findApkFiles(sourceDir)) {
ZipInputStream zin = new ZipInputStream(new FileInputStream(apk));
for (ZipEntry e = zin.getNextEntry(); e != null;
e = zin.getNextEntry()) {
if (libPaths.contains(e.getName())) {
if (LOG.isLoggable(INFO)) {
LOG.info("Extracting " + e.getName()
+ " from " + apk.getAbsolutePath());
}
extract(zin, dest); // Zip input stream will be closed
return;
}
}
zin.close();
}
throw new FileNotFoundException(libName);
}
/**
* Returns all files with the extension .apk or .APK under the given root.
*/
private List<File> findApkFiles(File root) {
List<File> files = new ArrayList<>();
findApkFiles(root, files);
return files;
}
private void findApkFiles(File f, List<File> files) {
if (f.isFile() && f.getName().toLowerCase().endsWith(".apk")) {
files.add(f);
} else if (f.isDirectory()) {
File[] children = f.listFiles();
if (children != null) {
for (File child : children) findApkFiles(child, files);
}
}
}
/**
* Returns the paths at which libraries with the given name would be found
* inside an APK file, for all architectures supported by the device, in
* order of preference.
*/
private List<String> getSupportedLibraryPaths(String libName) {
List<String> architectures = new ArrayList<>();
for (String abi : AndroidUtils.getSupportedArchitectures()) {
if (LIBRARY_ARCHITECTURES.contains(abi)) {
architectures.add("lib/" + abi + "/" + libName);
}
}
return architectures;
}
}

View File

@@ -5,6 +5,9 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
/**
* Interface for strengthening a password-based key, for example by using a
* key stored in a key management service or hardware security module.
*
* TODO: Remove after a reasonable migration period unless we can work around
* Android keymaster bugs. Added 2020-02-24
*/
@NotNullByDefault
public interface KeyStrengthener {

View File

@@ -0,0 +1,15 @@
package org.briarproject.bramble.api.plugin.event;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable;
/**
* An event that informs the Bluetooth plugin that we have enabled the
* Bluetooth adapter.
*/
@Immutable
@NotNullByDefault
public class BluetoothEnabledEvent extends Event {
}

View File

@@ -0,0 +1,15 @@
package org.briarproject.bramble.api.plugin.event;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable;
/**
* An event that asks the Bluetooth plugin to disable the Bluetooth adapter if
* we previously enabled it.
*/
@Immutable
@NotNullByDefault
public class DisableBluetoothEvent extends Event {
}

View File

@@ -0,0 +1,14 @@
package org.briarproject.bramble.api.plugin.event;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable;
/**
* An event that asks the Bluetooth plugin to enable the Bluetooth adapter.
*/
@Immutable
@NotNullByDefault
public class EnableBluetoothEvent extends Event {
}

View File

@@ -179,8 +179,9 @@ class AccountManagerImpl implements AccountManager {
@GuardedBy("stateChangeLock")
private boolean encryptAndStoreDatabaseKey(SecretKey key, String password) {
byte[] plaintext = key.getBytes();
byte[] ciphertext = crypto.encryptWithPassword(plaintext, password,
databaseConfig.getKeyStrengthener());
// Don't use a key strengthener as the Android keymaster isn't reliable
byte[] ciphertext =
crypto.encryptWithPassword(plaintext, password, null);
return storeEncryptedDatabaseKey(toHexString(ciphertext));
}
@@ -197,13 +198,13 @@ class AccountManagerImpl implements AccountManager {
@Override
public void signIn(String password) throws DecryptionException {
synchronized (stateChangeLock) {
databaseKey = loadAndDecryptDatabaseKey(password);
databaseKey = loadAndDecryptDatabaseKey(password, false);
}
}
@GuardedBy("stateChangeLock")
private SecretKey loadAndDecryptDatabaseKey(String password)
throws DecryptionException {
private SecretKey loadAndDecryptDatabaseKey(String password,
boolean changing) throws DecryptionException {
String hex = loadEncryptedDatabaseKey();
if (hex == null) {
LOG.warning("Failed to load encrypted database key");
@@ -214,11 +215,11 @@ class AccountManagerImpl implements AccountManager {
byte[] plaintext = crypto.decryptWithPassword(ciphertext, password,
keyStrengthener);
SecretKey key = new SecretKey(plaintext);
// If the DB key was encrypted with a weak key and a key strengthener
// is now available, re-encrypt the DB key with a strengthened key
if (keyStrengthener != null &&
!crypto.isEncryptedWithStrengthenedKey(ciphertext)) {
LOG.info("Re-encrypting database key with strengthened key");
// If the DB key was encrypted with a hardware-backed key, re-encrypt
// it without the hardware-backed key so keymaster bugs don't delete
// the user's account
if (!changing && crypto.isEncryptedWithStrengthenedKey(ciphertext)) {
LOG.info("Re-encrypting database key without strengthened key");
encryptAndStoreDatabaseKey(key, password);
}
return key;
@@ -228,7 +229,7 @@ class AccountManagerImpl implements AccountManager {
public void changePassword(String oldPassword, String newPassword)
throws DecryptionException {
synchronized (stateChangeLock) {
SecretKey key = loadAndDecryptDatabaseKey(oldPassword);
SecretKey key = loadAndDecryptDatabaseKey(oldPassword, true);
encryptAndStoreDatabaseKey(key, newPassword);
}
}

View File

@@ -53,7 +53,6 @@ import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE;
import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE;
import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED;
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
import static org.briarproject.bramble.util.LogUtils.logDuration;
import static org.briarproject.bramble.util.LogUtils.logException;
@@ -355,10 +354,6 @@ class PluginManagerImpl implements PluginManager, Service {
} else if (oldState == ACTIVE) {
eventBus.broadcast(new TransportInactiveEvent(id));
}
} else if (newState == DISABLED) {
// Broadcast an event even though the state hasn't changed, as
// the reasons for the plugin being disabled may have changed
eventBus.broadcast(new TransportStateEvent(id, newState));
}
}

View File

@@ -21,6 +21,9 @@ import org.briarproject.bramble.api.plugin.PluginException;
import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
import org.briarproject.bramble.api.plugin.event.BluetoothEnabledEvent;
import org.briarproject.bramble.api.plugin.event.DisableBluetoothEvent;
import org.briarproject.bramble.api.plugin.event.EnableBluetoothEvent;
import org.briarproject.bramble.api.properties.TransportProperties;
import org.briarproject.bramble.api.properties.event.RemoteTransportPropertiesUpdatedEvent;
import org.briarproject.bramble.api.rendezvous.KeyMaterialSource;
@@ -90,6 +93,12 @@ abstract class BluetoothPlugin<S, SS> implements DuplexPlugin, EventListener {
abstract boolean isAdapterEnabled();
abstract void enableAdapter();
abstract void disableAdapterIfEnabledByUs();
abstract void setEnabledByUs();
/**
* Returns the local Bluetooth address, or null if no valid address can
* be found.
@@ -180,7 +189,10 @@ abstract class BluetoothPlugin<S, SS> implements DuplexPlugin, EventListener {
throw new PluginException(e);
}
updateProperties();
if (enabledByUser && isAdapterEnabled()) bind();
if (enabledByUser) {
if (isAdapterEnabled()) bind();
else enableAdapter();
}
}
private void bind() {
@@ -307,6 +319,7 @@ abstract class BluetoothPlugin<S, SS> implements DuplexPlugin, EventListener {
public void stop() {
SS ss = state.setStopped();
tryToClose(ss);
disableAdapterIfEnabledByUs();
}
@Override
@@ -477,7 +490,13 @@ abstract class BluetoothPlugin<S, SS> implements DuplexPlugin, EventListener {
@Override
public void eventOccurred(Event e) {
if (e instanceof SettingsUpdatedEvent) {
if (e instanceof EnableBluetoothEvent) {
ioExecutor.execute(this::enableAdapter);
} else if (e instanceof DisableBluetoothEvent) {
ioExecutor.execute(this::disableAdapterIfEnabledByUs);
} else if (e instanceof BluetoothEnabledEvent) {
setEnabledByUs();
} else if (e instanceof SettingsUpdatedEvent) {
SettingsUpdatedEvent s = (SettingsUpdatedEvent) e;
if (s.getNamespace().equals(ID.getString()))
ioExecutor.execute(() -> onSettingsUpdated(s.getSettings()));
@@ -503,13 +522,11 @@ abstract class BluetoothPlugin<S, SS> implements DuplexPlugin, EventListener {
if (ss != null) {
LOG.info("Disabled by user, closing server socket");
tryToClose(ss);
disableAdapterIfEnabledByUs();
} else if (s == INACTIVE) {
if (isAdapterEnabled()) {
LOG.info("Enabled by user, opening server socket");
bind();
} else {
LOG.info("Enabled by user but adapter is disabled");
}
LOG.info("Enabled by user, opening server socket");
if (isAdapterEnabled()) bind();
else enableAdapter();
}
}

View File

@@ -132,7 +132,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
private final CircumventionProvider circumventionProvider;
private final ResourceProvider resourceProvider;
private final int maxLatency, maxIdleTime, socketTimeout;
private final File torDirectory, geoIpFile, configFile;
private final File torDirectory, torFile, geoIpFile, obfs4File, configFile;
private final File doneFile, cookieFile;
private final AtomicBoolean used = new AtomicBoolean(false);
@@ -181,7 +181,9 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
socketTimeout = Integer.MAX_VALUE;
else socketTimeout = maxIdleTime * 2;
this.torDirectory = torDirectory;
torFile = new File(torDirectory, "tor");
geoIpFile = new File(torDirectory, "geoip");
obfs4File = new File(torDirectory, "obfs4proxy");
configFile = new File(torDirectory, "torrc");
doneFile = new File(torDirectory, "done");
cookieFile = new File(torDirectory, ".tor/control_auth_cookie");
@@ -190,14 +192,6 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
new PoliteExecutor("TorPlugin", ioExecutor, 1);
}
protected File getTorExecutableFile() {
return new File(torDirectory, "tor");
}
protected File getObfs4ExecutableFile() {
return new File(torDirectory, "obfs4proxy");
}
@Override
public TransportId getId() {
return TorConstants.ID;
@@ -230,7 +224,6 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
LOG.warning("Old auth cookie not deleted");
// Start a new Tor process
LOG.info("Starting Tor");
File torFile = getTorExecutableFile();
String torPath = torFile.getAbsolutePath();
String configPath = configFile.getAbsolutePath();
String pid = String.valueOf(getProcessId());
@@ -329,43 +322,44 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
}
private void installAssets() throws PluginException {
InputStream in = null;
OutputStream out = null;
try {
// The done file may already exist from a previous installation
//noinspection ResultOfMethodCallIgnored
doneFile.delete();
installTorExecutable();
installObfs4Executable();
extract(getGeoIpInputStream(), geoIpFile);
extract(getConfigInputStream(), configFile);
// Unzip the Tor binary to the filesystem
in = getTorInputStream();
out = new FileOutputStream(torFile);
copyAndClose(in, out);
// Make the Tor binary executable
if (!torFile.setExecutable(true, true)) throw new IOException();
// Unzip the GeoIP database to the filesystem
in = getGeoIpInputStream();
out = new FileOutputStream(geoIpFile);
copyAndClose(in, out);
// Unzip the Obfs4 proxy to the filesystem
in = getObfs4InputStream();
out = new FileOutputStream(obfs4File);
copyAndClose(in, out);
// Make the Obfs4 proxy executable
if (!obfs4File.setExecutable(true, true)) throw new IOException();
// Copy the config file to the filesystem
in = getConfigInputStream();
out = new FileOutputStream(configFile);
copyAndClose(in, out);
if (!doneFile.createNewFile())
LOG.warning("Failed to create done file");
} catch (IOException e) {
tryToClose(in, LOG, WARNING);
tryToClose(out, LOG, WARNING);
throw new PluginException(e);
}
}
protected void extract(InputStream in, File dest) throws IOException {
OutputStream out = new FileOutputStream(dest);
copyAndClose(in, out);
}
protected void installTorExecutable() throws IOException {
private InputStream getTorInputStream() throws IOException {
if (LOG.isLoggable(INFO))
LOG.info("Installing Tor binary for " + architecture);
File torFile = getTorExecutableFile();
extract(getTorInputStream(), torFile);
if (!torFile.setExecutable(true, true)) throw new IOException();
}
protected void installObfs4Executable() throws IOException {
if (LOG.isLoggable(INFO))
LOG.info("Installing obfs4proxy binary for " + architecture);
File obfs4File = getObfs4ExecutableFile();
extract(getObfs4InputStream(), obfs4File);
if (!obfs4File.setExecutable(true, true)) throw new IOException();
}
private InputStream getTorInputStream() throws IOException {
InputStream in = resourceProvider
.getResourceInputStream("tor_" + architecture, ".zip");
ZipInputStream zin = new ZipInputStream(in);
@@ -382,6 +376,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
}
private InputStream getObfs4InputStream() throws IOException {
if (LOG.isLoggable(INFO))
LOG.info("Installing obfs4proxy binary for " + architecture);
InputStream in = resourceProvider
.getResourceInputStream("obfs4proxy_" + architecture, ".zip");
ZipInputStream zin = new ZipInputStream(in);
@@ -573,7 +569,6 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
if (enable) {
Collection<String> conf = new ArrayList<>();
conf.add("UseBridges 1");
File obfs4File = getObfs4ExecutableFile();
if (needsMeek) {
conf.add("ClientTransportPlugin meek_lite exec " +
obfs4File.getAbsolutePath());

View File

@@ -42,7 +42,6 @@ import org.briarproject.bramble.api.rendezvous.event.RendezvousConnectionOpenedE
import org.briarproject.bramble.api.rendezvous.event.RendezvousPollEvent;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.system.TaskScheduler;
import org.briarproject.bramble.api.system.TaskScheduler.Cancellable;
import org.briarproject.bramble.api.system.Wakeful;
import java.security.GeneralSecurityException;
@@ -69,7 +68,6 @@ import static org.briarproject.bramble.api.contact.PendingContactState.ADDING_CO
import static org.briarproject.bramble.api.contact.PendingContactState.FAILED;
import static org.briarproject.bramble.api.contact.PendingContactState.OFFLINE;
import static org.briarproject.bramble.api.contact.PendingContactState.WAITING_FOR_CONNECTION;
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNull;
import static org.briarproject.bramble.rendezvous.RendezvousConstants.POLLING_INTERVAL_MS;
import static org.briarproject.bramble.rendezvous.RendezvousConstants.RENDEZVOUS_TIMEOUT_MS;
@@ -104,8 +102,6 @@ class RendezvousPollerImpl implements RendezvousPoller, Service, EventListener {
new HashMap<>();
@Nullable
private KeyPair handshakeKeyPair = null;
@Nullable
private Cancellable pollTask = null;
@Inject
RendezvousPollerImpl(@IoExecutor Executor ioExecutor,
@@ -148,6 +144,8 @@ class RendezvousPollerImpl implements RendezvousPoller, Service, EventListener {
} catch (DbException e) {
throw new ServiceException(e);
}
scheduler.scheduleWithFixedDelay(this::poll, worker,
POLLING_INTERVAL_MS, POLLING_INTERVAL_MS, MILLISECONDS);
}
@EventExecutor
@@ -188,12 +186,6 @@ class RendezvousPollerImpl implements RendezvousPoller, Service, EventListener {
}
if (cs.numEndpoints == 0) broadcastState(p.getId(), OFFLINE);
else broadcastState(p.getId(), WAITING_FOR_CONNECTION);
if (cryptoStates.size() == 1) {
LOG.info("Starting poller");
requireNull(pollTask);
pollTask = scheduler.scheduleWithFixedDelay(this::poll, worker,
POLLING_INTERVAL_MS, POLLING_INTERVAL_MS, MILLISECONDS);
}
} catch (DbException | GeneralSecurityException e) {
logException(LOG, WARNING, e);
}
@@ -216,7 +208,6 @@ class RendezvousPollerImpl implements RendezvousPoller, Service, EventListener {
// Worker
@Wakeful
private void poll() {
LOG.info("Polling");
removeExpiredPendingContacts();
for (PluginState ps : pluginStates.values()) poll(ps);
}
@@ -243,11 +234,6 @@ class RendezvousPollerImpl implements RendezvousPoller, Service, EventListener {
RendezvousEndpoint endpoint = ps.endpoints.remove(p);
if (endpoint != null) tryToClose(endpoint, LOG, INFO);
}
if (cryptoStates.isEmpty()) {
LOG.info("Stopping poller");
requireNonNull(pollTask).cancel();
pollTask = null;
}
}
// Worker

View File

@@ -134,7 +134,7 @@ public class AccountManagerImplTest extends BrambleMockTestCase {
keyStrengthener);
will(returnValue(key.getBytes()));
oneOf(crypto).isEncryptedWithStrengthenedKey(encryptedKey);
will(returnValue(true));
will(returnValue(false));
}});
storeDatabaseKey(keyFile, encryptedKeyHex);
@@ -160,9 +160,8 @@ public class AccountManagerImplTest extends BrambleMockTestCase {
keyStrengthener);
will(returnValue(key.getBytes()));
oneOf(crypto).isEncryptedWithStrengthenedKey(encryptedKey);
will(returnValue(false));
oneOf(crypto).encryptWithPassword(key.getBytes(), password,
keyStrengthener);
will(returnValue(true));
oneOf(crypto).encryptWithPassword(key.getBytes(), password, null);
will(returnValue(newEncryptedKey));
}});
@@ -262,8 +261,7 @@ public class AccountManagerImplTest extends BrambleMockTestCase {
oneOf(identityManager).registerIdentity(identity);
oneOf(crypto).generateSecretKey();
will(returnValue(key));
oneOf(crypto).encryptWithPassword(key.getBytes(), password,
keyStrengthener);
oneOf(crypto).encryptWithPassword(key.getBytes(), password, null);
will(returnValue(encryptedKey));
}});
@@ -323,10 +321,8 @@ public class AccountManagerImplTest extends BrambleMockTestCase {
oneOf(crypto).decryptWithPassword(encryptedKey, password,
keyStrengthener);
will(returnValue(key.getBytes()));
oneOf(crypto).isEncryptedWithStrengthenedKey(encryptedKey);
will(returnValue(true));
oneOf(crypto).encryptWithPassword(key.getBytes(), newPassword,
keyStrengthener);
null);
will(returnValue(newEncryptedKey));
}});

View File

@@ -27,7 +27,6 @@ import org.briarproject.bramble.api.rendezvous.event.RendezvousConnectionOpenedE
import org.briarproject.bramble.api.rendezvous.event.RendezvousPollEvent;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.system.TaskScheduler;
import org.briarproject.bramble.api.system.TaskScheduler.Cancellable;
import org.briarproject.bramble.test.BrambleMockTestCase;
import org.briarproject.bramble.test.CaptureArgumentAction;
import org.briarproject.bramble.test.DbExpectations;
@@ -80,7 +79,6 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
context.mock(KeyMaterialSource.class);
private final RendezvousEndpoint rendezvousEndpoint =
context.mock(RendezvousEndpoint.class);
private final Cancellable cancellable = context.mock(Cancellable.class);
private final Executor ioExecutor = new ImmediateExecutor();
private final PendingContact pendingContact = getPendingContact();
@@ -109,7 +107,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
long beforeExpiry = pendingContact.getTimestamp()
+ RENDEZVOUS_TIMEOUT_MS - 1000;
long afterExpiry = beforeExpiry + POLLING_INTERVAL_MS;
AtomicReference<Runnable> capturePollTask;
AtomicReference<Runnable> capturePollTask = new AtomicReference<>();
// Start the service
context.checking(new DbExpectations() {{
@@ -123,17 +121,21 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
oneOf(eventBus).broadcast(with(new PredicateMatcher<>(
PendingContactStateChangedEvent.class, e ->
e.getPendingContactState() == OFFLINE)));
// Capture the poll task
oneOf(scheduler).scheduleWithFixedDelay(with(any(Runnable.class)),
with(any(Executor.class)), with(POLLING_INTERVAL_MS),
with(POLLING_INTERVAL_MS), with(MILLISECONDS));
will(new CaptureArgumentAction<>(capturePollTask, Runnable.class,
0));
}});
expectDeriveRendezvousKey();
capturePollTask = expectSchedulePolling();
rendezvousPoller.startService();
context.assertIsSatisfied();
// Run the poll task - pending contact expires, polling is cancelled
// Run the poll task - pending contact expires
expectPendingContactExpires(afterExpiry);
expectCancelPolling();
capturePollTask.get().run();
}
@@ -155,6 +157,10 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
oneOf(eventBus).broadcast(with(new PredicateMatcher<>(
PendingContactStateChangedEvent.class, e ->
e.getPendingContactState() == FAILED)));
// Schedule the poll task
oneOf(scheduler).scheduleWithFixedDelay(with(any(Runnable.class)),
with(any(Executor.class)), with(POLLING_INTERVAL_MS),
with(POLLING_INTERVAL_MS), with(MILLISECONDS));
}});
rendezvousPoller.startService();
@@ -177,8 +183,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
rendezvousPoller.eventOccurred(new TransportActiveEvent(transportId));
context.assertIsSatisfied();
// Add the pending contact - endpoint should be created and polled,
// polling should be scheduled
// Add the pending contact - endpoint should be created and polled
expectAddPendingContact(beforeExpiry, WAITING_FOR_CONNECTION);
expectDeriveRendezvousKey();
expectCreateEndpoint();
@@ -195,16 +200,12 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
any(ConnectionHandler.class)))));
}});
expectSchedulePolling();
rendezvousPoller.eventOccurred(
new PendingContactAddedEvent(pendingContact));
context.assertIsSatisfied();
// Remove the pending contact - endpoint should be closed,
// polling should be cancelled
// Remove the pending contact - endpoint should be closed
expectCloseEndpoint();
expectCancelPolling();
rendezvousPoller.eventOccurred(
new PendingContactRemovedEvent(pendingContact.getId()));
@@ -220,10 +221,10 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
long beforeExpiry = pendingContact.getTimestamp()
+ RENDEZVOUS_TIMEOUT_MS - 1000;
long afterExpiry = beforeExpiry + POLLING_INTERVAL_MS;
AtomicReference<Runnable> capturePollTask;
// Start the service
expectStartupWithNoPendingContacts();
// Start the service, capturing the poll task
AtomicReference<Runnable> capturePollTask =
expectStartupWithNoPendingContacts();
rendezvousPoller.startService();
context.assertIsSatisfied();
@@ -234,8 +235,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
rendezvousPoller.eventOccurred(new TransportActiveEvent(transportId));
context.assertIsSatisfied();
// Add the pending contact - endpoint should be created and polled,
// polling should be scheduled
// Add the pending contact - endpoint should be created and polled
expectAddPendingContact(beforeExpiry, WAITING_FOR_CONNECTION);
expectDeriveRendezvousKey();
expectCreateEndpoint();
@@ -252,17 +252,13 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
any(ConnectionHandler.class)))));
}});
capturePollTask = expectSchedulePolling();
rendezvousPoller.eventOccurred(
new PendingContactAddedEvent(pendingContact));
context.assertIsSatisfied();
// Run the poll task - pending contact expires, endpoint is closed,
// polling is cancelled
// Run the poll task - pending contact expires, endpoint is closed
expectPendingContactExpires(afterExpiry);
expectCloseEndpoint();
expectCancelPolling();
capturePollTask.get().run();
context.assertIsSatisfied();
@@ -290,7 +286,6 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
// Add the pending contact - no endpoints should be created yet
expectAddPendingContact(beforeExpiry, OFFLINE);
expectDeriveRendezvousKey();
expectSchedulePolling();
rendezvousPoller.eventOccurred(
new PendingContactAddedEvent(pendingContact));
@@ -312,8 +307,6 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
context.assertIsSatisfied();
// Remove the pending contact - endpoint is already closed
expectCancelPolling();
rendezvousPoller.eventOccurred(
new PendingContactRemovedEvent(pendingContact.getId()));
}
@@ -355,9 +348,8 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
rendezvousPoller.startService();
context.assertIsSatisfied();
// Run the poll task - pending contact expires, polling is cancelled
// Run the poll task - pending contact expires
expectPendingContactExpires(afterExpiry);
expectCancelPolling();
capturePollTask.get().run();
context.assertIsSatisfied();
@@ -393,9 +385,8 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
new RendezvousConnectionOpenedEvent(pendingContact.getId()));
context.assertIsSatisfied();
// Run the poll task - pending contact expires, polling is cancelled
// Run the poll task - pending contact expires
expectPendingContactExpires(afterExpiry);
expectCancelPolling();
capturePollTask.get().run();
context.assertIsSatisfied();
@@ -426,9 +417,8 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
new RendezvousConnectionOpenedEvent(pendingContact.getId()));
context.assertIsSatisfied();
// Run the poll task - pending contact expires, polling is cancelled
// Run the poll task - pending contact expires
expectPendingContactExpires(afterExpiry);
expectCancelPolling();
capturePollTask.get().run();
context.assertIsSatisfied();
@@ -457,8 +447,6 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
context.assertIsSatisfied();
// Pending contact is removed - no event should be broadcast
expectCancelPolling();
rendezvousPoller.eventOccurred(
new PendingContactRemovedEvent(pendingContact.getId()));
context.assertIsSatisfied();
@@ -468,35 +456,25 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
pendingContact.getId(), false));
}
private AtomicReference<Runnable> expectSchedulePolling() {
AtomicReference<Runnable> capturePollTask = new AtomicReference<>();
context.checking(new Expectations() {{
oneOf(scheduler).scheduleWithFixedDelay(with(any(Runnable.class)),
with(any(Executor.class)), with(POLLING_INTERVAL_MS),
with(POLLING_INTERVAL_MS), with(MILLISECONDS));
will(doAll(new CaptureArgumentAction<>(capturePollTask,
Runnable.class, 0), returnValue(cancellable)));
}});
return capturePollTask;
}
private void expectCancelPolling() {
context.checking(new Expectations() {{
oneOf(cancellable).cancel();
}});
}
private void expectStartupWithNoPendingContacts() throws Exception {
private AtomicReference<Runnable> expectStartupWithNoPendingContacts()
throws Exception {
Transaction txn = new Transaction(null, true);
AtomicReference<Runnable> capturePollTask = new AtomicReference<>();
context.checking(new DbExpectations() {{
// Load the pending contacts
oneOf(db).transaction(with(true), withDbRunnable(txn));
oneOf(db).getPendingContacts(txn);
will(returnValue(emptyList()));
// Capture the poll task
oneOf(scheduler).scheduleWithFixedDelay(with(any(Runnable.class)),
with(any(Executor.class)), with(POLLING_INTERVAL_MS),
with(POLLING_INTERVAL_MS), with(MILLISECONDS));
will(new CaptureArgumentAction<>(capturePollTask, Runnable.class,
0));
}});
return capturePollTask;
}
private void expectAddPendingContact(long now,
@@ -552,6 +530,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
private AtomicReference<Runnable> expectStartupWithPendingContact(long now)
throws Exception {
Transaction txn = new Transaction(null, true);
AtomicReference<Runnable> capturePollTask = new AtomicReference<>();
context.checking(new DbExpectations() {{
// Load the pending contacts
@@ -564,10 +543,17 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
oneOf(eventBus).broadcast(with(new PredicateMatcher<>(
PendingContactStateChangedEvent.class, e ->
e.getPendingContactState() == OFFLINE)));
// Capture the poll task
oneOf(scheduler).scheduleWithFixedDelay(with(any(Runnable.class)),
with(any(Executor.class)), with(POLLING_INTERVAL_MS),
with(POLLING_INTERVAL_MS), with(MILLISECONDS));
will(new CaptureArgumentAction<>(capturePollTask, Runnable.class,
0));
}});
expectDeriveRendezvousKey();
return expectSchedulePolling();
return capturePollTask;
}
private void expectPendingContactExpires(long now) {

View File

@@ -62,6 +62,22 @@ class JavaBluetoothPlugin
return localDevice != null && LocalDevice.isPowerOn();
}
@Override
void enableAdapter() {
// Nothing we can do on this platform
LOG.info("Could not enable Bluetooth");
}
@Override
void disableAdapterIfEnabledByUs() {
// We didn't enable it so we don't need to disable it
}
@Override
void setEnabledByUs() {
// Irrelevant on this platform
}
@Nullable
@Override
String getBluetoothAddress() {

View File

@@ -16,14 +16,14 @@ def getStdout = { command, defaultValue ->
}
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
compileSdkVersion 29
buildToolsVersion '29.0.2'
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
minSdkVersion 16
targetSdkVersion 28
versionCode 10209
versionName "1.2.9"
applicationId "org.briarproject.briar.android"
buildConfigField "String", "GitHash",
"\"${getStdout(['git', 'rev-parse', '--short=7', 'HEAD'], 'No commit hash')}\""

View File

@@ -1,46 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.briarproject.briar">
<manifest
package="org.briarproject.briar"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />
android:required="false"/>
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
android:required="false"/>
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.software.leanback"
android:required="false" />
android:required="false"/>
<uses-feature android:name="android.software.leanback"
android:required="false" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!--suppress DeprecatedClassUsageInspection -->
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_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" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_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"
android:allowBackup="false"
android:banner="@mipmap/tv_banner"
android:icon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:logo="@mipmap/ic_launcher_round"
android:banner="@mipmap/tv_banner"
android:supportsRtl="true"
android:theme="@style/BriarTheme"
tools:ignore="GoogleAppIndexingWarning,UnusedAttribute"
@@ -50,8 +50,8 @@
android:name="org.briarproject.briar.android.login.SignInReminderReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
</intent-filter>
</receiver>
@@ -59,13 +59,14 @@
android:name="org.briarproject.briar.android.BriarService"
android:exported="false">
<intent-filter>
<action android:name="org.briarproject.briar.android.BriarService" />
<action android:name="org.briarproject.briar.android.BriarService"/>
</intent-filter>
</service>
<service
android:name="org.briarproject.briar.android.NotificationCleanupService"
android:exported="false"></service>
android:exported="false">
</service>
<activity
android:name="org.briarproject.briar.android.reporting.DevReportActivity"
@@ -75,29 +76,32 @@
android:label="@string/crash_report_title"
android:launchMode="singleInstance"
android:theme="@style/BriarTheme.NoActionBar"
android:windowSoftInputMode="adjustResize|stateHidden"></activity>
android:windowSoftInputMode="adjustResize|stateHidden">
</activity>
<activity
android:name="org.briarproject.briar.android.splash.ExpiredActivity"
android:label="@string/app_name"></activity>
android:label="@string/app_name">
</activity>
<activity
android:name="org.briarproject.briar.android.login.StartupActivity"
android:label="@string/app_name"></activity>
android:label="@string/app_name">
</activity>
<activity
android:name="org.briarproject.briar.android.account.SetupActivity"
android:label="@string/setup_title"
android:windowSoftInputMode="adjustResize|stateAlwaysVisible"></activity>
android:windowSoftInputMode="adjustResize|stateAlwaysVisible">
</activity>
<activity
android:name="org.briarproject.briar.android.splash.SplashScreenActivity"
android:label="@string/app_name"
android:theme="@style/BriarTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
@@ -107,17 +111,17 @@
android:launchMode="singleTask"
android:theme="@style/BriarTheme.NoActionBar">
<intent-filter android:label="@string/add_contact_remotely_title_case">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="briar" />
<data android:scheme="briar"/>
</intent-filter>
<intent-filter android:label="@string/add_contact_remotely_title_case">
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
@@ -129,7 +133,7 @@
android:windowSoftInputMode="adjustResize|stateUnchanged">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -138,7 +142,7 @@
android:theme="@style/BriarTheme.ActionBarOverlay">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.conversation.ConversationActivity" />
android:value="org.briarproject.briar.android.conversation.ConversationActivity"/>
</activity>
<activity
@@ -148,7 +152,7 @@
android:windowSoftInputMode="adjustResize|stateAlwaysVisible">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -159,7 +163,7 @@
android:windowSoftInputMode="adjustResize|stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -168,7 +172,7 @@
android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -177,7 +181,7 @@
android:parentActivityName="org.briarproject.briar.android.privategroup.conversation.GroupActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity" />
android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity"/>
</activity>
<activity
@@ -186,7 +190,7 @@
android:parentActivityName="org.briarproject.briar.android.privategroup.conversation.GroupActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity" />
android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity"/>
</activity>
<activity
@@ -196,7 +200,7 @@
android:windowSoftInputMode="adjustResize|stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity" />
android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity"/>
</activity>
<activity
@@ -205,7 +209,7 @@
android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -214,7 +218,7 @@
android:parentActivityName="org.briarproject.briar.android.conversation.ConversationActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.conversation.ConversationActivity" />
android:value="org.briarproject.briar.android.conversation.ConversationActivity"/>
</activity>
<activity
@@ -224,7 +228,7 @@
android:windowSoftInputMode="adjustResize|stateAlwaysVisible">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -235,7 +239,7 @@
android:windowSoftInputMode="adjustResize|stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -245,7 +249,7 @@
android:windowSoftInputMode="adjustResize|stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.forum.ForumActivity" />
android:value="org.briarproject.briar.android.forum.ForumActivity"/>
</activity>
<activity
@@ -255,7 +259,7 @@
android:windowSoftInputMode="adjustResize|stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.blog.BlogActivity" />
android:value="org.briarproject.briar.android.blog.BlogActivity"/>
</activity>
<activity
@@ -264,7 +268,8 @@
android:parentActivityName="org.briarproject.briar.android.forum.ForumActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.forum.ForumActivity" />
android:value="org.briarproject.briar.android.forum.ForumActivity"
/>
</activity>
<activity
@@ -273,7 +278,7 @@
android:parentActivityName="org.briarproject.briar.android.blog.BlogActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.blog.BlogActivity" />
android:value="org.briarproject.briar.android.blog.BlogActivity"/>
</activity>
<activity
@@ -282,7 +287,7 @@
android:theme="@style/BriarTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -292,7 +297,7 @@
android:windowSoftInputMode="adjustResize|stateAlwaysVisible">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.blog.BlogActivity" />
android:value="org.briarproject.briar.android.blog.BlogActivity"/>
</activity>
<activity
@@ -302,7 +307,7 @@
android:windowSoftInputMode="adjustResize|stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.blog.BlogActivity" />
android:value="org.briarproject.briar.android.blog.BlogActivity"/>
</activity>
<activity
@@ -312,7 +317,7 @@
android:windowSoftInputMode="adjustResize|stateAlwaysVisible">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -321,7 +326,7 @@
android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -331,7 +336,7 @@
android:theme="@style/BriarTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
</activity>
<activity
@@ -341,12 +346,13 @@
android:windowSoftInputMode="adjustResize|stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.conversation.ConversationActivity" />
android:value="org.briarproject.briar.android.conversation.ConversationActivity"/>
</activity>
<activity
android:name="org.briarproject.briar.android.StartupFailureActivity"
android:label="@string/startup_failed_activity_title"></activity>
android:label="@string/startup_failed_activity_title">
</activity>
<activity
android:name="org.briarproject.briar.android.settings.SettingsActivity"
@@ -355,22 +361,13 @@
android:permission="android.permission.READ_NETWORK_USAGE_HISTORY">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/>
<intent-filter>
<action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MANAGE_NETWORK_USAGE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:name="org.briarproject.briar.android.navdrawer.TransportsActivity"
android:label="@string/network_settings_title"
android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
</activity>
<activity
android:name="org.briarproject.briar.android.login.ChangePasswordActivity"
android:label="@string/change_password"
@@ -378,7 +375,7 @@
android:windowSoftInputMode="adjustResize|stateAlwaysVisible">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.settings.SettingsActivity" />
android:value="org.briarproject.briar.android.settings.SettingsActivity"/>
</activity>
<activity
@@ -387,7 +384,7 @@
android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.settings.SettingsActivity" />
android:value="org.briarproject.briar.android.settings.SettingsActivity"/>
</activity>
<activity
@@ -396,7 +393,7 @@
android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.settings.SettingsActivity" />
android:value="org.briarproject.briar.android.settings.SettingsActivity"/>
</activity>
<activity
@@ -405,35 +402,37 @@
android:theme="@style/TranslucentTheme">
<!-- this can never have launchMode singleTask or singleInstance! -->
<intent-filter>
<action android:name="info.guardianproject.panic.action.TRIGGER" />
<category android:name="android.intent.category.DEFAULT" />
<action android:name="info.guardianproject.panic.action.TRIGGER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:name="org.briarproject.briar.android.logout.ExitActivity"
android:theme="@android:style/Theme.NoDisplay"></activity>
android:theme="@android:style/Theme.NoDisplay">
</activity>
<activity
android:name=".android.logout.HideUiActivity"
android:theme="@android:style/Theme.NoDisplay"></activity>
android:theme="@android:style/Theme.NoDisplay">
</activity>
<activity
android:name=".android.account.UnlockActivity"
android:label="@string/lock_unlock"
android:launchMode="singleTask"
android:theme="@style/BriarTheme.NoActionBar" />
android:theme="@style/BriarTheme.NoActionBar"/>
<activity
android:name=".android.contact.add.remote.AddContactActivity"
android:label="@string/add_contact_remotely_title_case"
android:theme="@style/BriarTheme"
android:windowSoftInputMode="adjustResize|stateHidden" />
android:windowSoftInputMode="adjustResize|stateHidden"/>
<activity
android:name=".android.contact.add.remote.PendingContactListActivity"
android:label="@string/pending_contact_requests"
android:theme="@style/BriarTheme" />
android:theme="@style/BriarTheme"/>
</application>
</manifest>

View File

@@ -0,0 +1,93 @@
package org.briarproject.briar.android.account;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.logging.Logger;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
import static android.os.Environment.DIRECTORY_DOWNLOADS;
import static android.os.Environment.getExternalStoragePublicDirectory;
import static android.widget.Toast.LENGTH_LONG;
import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.util.IoUtils.copyAndClose;
import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.briar.android.BriarApplication.ENTRY_ACTIVITY;
import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.SIGN_OUT_URI;
public class AccountUtils {
private static final Logger LOG = getLogger(AccountUtils.class.getName());
private static final String[] BACKUP_DIRS =
{"app_db", "app_key", "shared_prefs"};
public static void exportAccount(Context ctx) {
try {
File dataDir = getDataDir(ctx);
File backupDir = getBackupDir(ctx);
for (String name : BACKUP_DIRS) {
copyRecursively(new File(dataDir, name),
new File(backupDir, name));
}
Toast.makeText(ctx, "Account exported to "
+ backupDir.getCanonicalPath(), LENGTH_LONG).show();
} catch (IOException e) {
logException(LOG, WARNING, e);
Toast.makeText(ctx, "Export failed", LENGTH_LONG).show();
}
}
public static void importAccount(Context ctx) {
try {
File dataDir = getDataDir(ctx);
File backupDir = getBackupDir(ctx);
for (String name : BACKUP_DIRS) {
copyRecursively(new File(backupDir, name),
new File(dataDir, name));
}
Toast.makeText(ctx, "Account imported from "
+ backupDir.getCanonicalPath(), LENGTH_LONG).show();
Intent intent = new Intent(ctx, ENTRY_ACTIVITY);
intent.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
intent.setData(SIGN_OUT_URI);
ctx.startActivity(intent);
} catch (IOException e) {
logException(LOG, WARNING, e);
Toast.makeText(ctx, "Import failed", LENGTH_LONG).show();
}
}
private static File getDataDir(Context ctx) {
return new File(ctx.getApplicationInfo().dataDir);
}
private static File getBackupDir(Context ctx) {
File downloads = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS);
return new File(downloads, ctx.getPackageName());
}
private static void copyRecursively(File src, File dest)
throws IOException {
if (src.isDirectory()) {
if (!dest.isDirectory() && !dest.mkdirs()) throw new IOException();
File[] children = src.listFiles();
if (children == null) throw new IOException();
for (File child : children) {
copyRecursively(child, new File(dest, child.getName()));
}
} else if (src.isFile()) {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dest);
copyAndClose(in, out);
}
}
}

View File

@@ -117,24 +117,14 @@ public class UnlockActivity extends BaseActivity {
@RequiresApi(api = 28)
private void requestFingerprintUnlock() {
BiometricPrompt biometricPrompt;
if (SDK_INT >= 29) {
biometricPrompt = new Builder(this)
.setTitle(getString(R.string.lock_unlock))
.setDescription(getString(
R.string.lock_unlock_fingerprint_description))
.setDeviceCredentialAllowed(true)
.build();
} else {
biometricPrompt = new Builder(this)
.setTitle(getString(R.string.lock_unlock))
.setDescription(getString(
R.string.lock_unlock_fingerprint_description))
.setNegativeButton(getString(R.string.lock_unlock_password),
getMainExecutor(),
(dialog, which) -> requestKeyguardUnlock())
.build();
}
BiometricPrompt biometricPrompt = new Builder(this)
.setTitle(getString(R.string.lock_unlock))
.setDescription(
getString(R.string.lock_unlock_fingerprint_description))
.setNegativeButton(getString(R.string.lock_unlock_password),
getMainExecutor(),
(dialog, which) -> requestKeyguardUnlock())
.build();
CancellationSignal signal = new CancellationSignal();
AuthenticationCallback callback = new AuthenticationCallback() {
@Override

View File

@@ -47,7 +47,6 @@ import org.briarproject.briar.android.login.OpenDatabaseFragment;
import org.briarproject.briar.android.login.PasswordFragment;
import org.briarproject.briar.android.login.StartupActivity;
import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
import org.briarproject.briar.android.navdrawer.TransportsActivity;
import org.briarproject.briar.android.panic.PanicPreferencesActivity;
import org.briarproject.briar.android.panic.PanicResponderActivity;
import org.briarproject.briar.android.privategroup.conversation.GroupActivity;
@@ -164,8 +163,6 @@ public interface ActivityComponent {
void inject(SettingsActivity activity);
void inject(TransportsActivity activity);
void inject(TestDataActivity activity);
void inject(ChangePasswordActivity activity);

View File

@@ -18,6 +18,7 @@ import org.briarproject.bramble.api.plugin.LanTcpConstants;
import org.briarproject.bramble.api.plugin.Plugin;
import org.briarproject.bramble.api.plugin.Plugin.State;
import org.briarproject.bramble.api.plugin.PluginManager;
import org.briarproject.bramble.api.plugin.event.BluetoothEnabledEvent;
import org.briarproject.bramble.api.plugin.event.TransportStateEvent;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
@@ -117,6 +118,13 @@ public abstract class KeyAgreementActivity extends BriarActivity implements
*/
private boolean continueClicked = false;
/**
* Records whether the Bluetooth adapter was already enabled before we
* asked for Bluetooth discoverability, so we know whether to broadcast a
* {@link BluetoothEnabledEvent}.
*/
private boolean wasAdapterEnabled = false;
/**
* Records whether we've enabled the wifi plugin so we don't enable it more
* than once.
@@ -266,6 +274,7 @@ public abstract class KeyAgreementActivity extends BriarActivity implements
if (i.resolveActivity(getPackageManager()) != null) {
LOG.info("Asking for Bluetooth discoverability");
bluetoothDecision = BluetoothDecision.WAITING;
wasAdapterEnabled = bt.isEnabled();
startActivityForResult(i, REQUEST_BLUETOOTH_DISCOVERABLE);
} else {
bluetoothDecision = BluetoothDecision.NO_ADAPTER;
@@ -311,6 +320,11 @@ public abstract class KeyAgreementActivity extends BriarActivity implements
} else {
LOG.info("Bluetooth discoverability was accepted");
bluetoothDecision = BluetoothDecision.ACCEPTED;
if (!wasAdapterEnabled) {
LOG.info("Bluetooth adapter was enabled by us");
eventBus.broadcast(new BluetoothEnabledEvent());
wasAdapterEnabled = true;
}
}
showQrCodeFragmentIfAllowed();
} else super.onActivityResult(request, result, data);

View File

@@ -11,7 +11,6 @@ import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.google.android.material.navigation.NavigationView;
@@ -57,10 +56,8 @@ import androidx.core.content.ContextCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
@@ -78,8 +75,6 @@ import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD;
import static org.briarproject.briar.android.navdrawer.IntentRouter.handleExternalIntent;
import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry;
import static org.briarproject.briar.android.util.UiUtils.observeOnce;
import static org.briarproject.briar.android.util.UiUtils.resolveColorAttribute;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
@@ -102,9 +97,6 @@ public class NavDrawerActivity extends BriarActivity implements
public static Uri SIGN_OUT_URI =
Uri.parse("briar-content://org.briarproject.briar/sign-out");
private final List<Transport> transports = new ArrayList<>(3);
private final MutableLiveData<ImageView> torIcon = new MutableLiveData<>();
private NavDrawerViewModel navDrawerViewModel;
private PluginViewModel pluginViewModel;
private ActionBarDrawerToggle drawerToggle;
@@ -118,6 +110,7 @@ public class NavDrawerActivity extends BriarActivity implements
private DrawerLayout drawerLayout;
private NavigationView navigation;
private List<Transport> transports;
private BaseAdapter transportsAdapter;
@Override
@@ -148,11 +141,6 @@ public class NavDrawerActivity extends BriarActivity implements
drawerLayout = findViewById(R.id.drawer_layout);
navigation = findViewById(R.id.navigation);
GridView transportsView = findViewById(R.id.transportsView);
LinearLayout transportsLayout = findViewById(R.id.transports);
transportsLayout.setOnClickListener(v -> {
LOG.info("Starting transports activity");
startActivity(new Intent(this, TransportsActivity.class));
});
setSupportActionBar(toolbar);
ActionBar actionBar = requireNonNull(getSupportActionBar());
@@ -161,23 +149,13 @@ public class NavDrawerActivity extends BriarActivity implements
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,
R.string.nav_drawer_open_description,
R.string.nav_drawer_close_description) {
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
navDrawerViewModel.checkTransportsOnboarding();
}
};
R.string.nav_drawer_close_description);
drawerLayout.addDrawerListener(drawerToggle);
navigation.setNavigationItemSelectedListener(this);
initializeTransports();
transportsView.setAdapter(transportsAdapter);
observeOnce(navDrawerViewModel.showTransportsOnboarding(), this, show ->
observeOnce(torIcon, this, imageView ->
showTransportsOnboarding(show, imageView)));
lockManager.isLockable().observe(this, this::setLockVisible);
if (lifecycleManager.getLifecycleState().isAfter(RUNNING)) {
@@ -402,6 +380,8 @@ public class NavDrawerActivity extends BriarActivity implements
}
private void initializeTransports() {
transports = new ArrayList<>(3);
transportsAdapter = new BaseAdapter() {
@Override
@@ -442,8 +422,6 @@ public class NavDrawerActivity extends BriarActivity implements
TextView text = view.findViewById(R.id.textView);
text.setText(getString(t.label));
if (t.id.equals(TorConstants.ID)) torIcon.setValue(icon);
return view;
}
};
@@ -466,7 +444,7 @@ public class NavDrawerActivity extends BriarActivity implements
private Transport createTransport(TransportId id,
@DrawableRes int iconDrawable, @StringRes int label) {
int iconColor = getIconColor(STARTING_STOPPING);
Transport transport = new Transport(id, iconDrawable, label, iconColor);
Transport transport = new Transport(iconDrawable, label, iconColor);
pluginViewModel.getPluginState(id).observe(this, state -> {
transport.iconColor = getIconColor(state);
transportsAdapter.notifyDataSetChanged();
@@ -474,25 +452,8 @@ public class NavDrawerActivity extends BriarActivity implements
return transport;
}
private void showTransportsOnboarding(boolean show, ImageView imageView) {
if (show) {
int color = resolveColorAttribute(this, R.attr.colorControlNormal);
new MaterialTapTargetPrompt.Builder(NavDrawerActivity.this,
R.style.OnboardingDialogTheme).setTarget(imageView)
.setPrimaryText(R.string.network_settings_title)
.setSecondaryText(R.string.transports_onboarding_text)
.setIcon(R.drawable.transport_tor)
.setIconDrawableColourFilter(color)
.setBackgroundColour(
ContextCompat.getColor(this, R.color.briar_primary))
.show();
navDrawerViewModel.transportsOnboardingShown();
}
}
private static class Transport {
private final TransportId id;
@DrawableRes
private final int iconDrawable;
@StringRes
@@ -501,9 +462,8 @@ public class NavDrawerActivity extends BriarActivity implements
@ColorRes
private int iconColor;
private Transport(TransportId id, @DrawableRes int iconDrawable,
@StringRes int label, @ColorRes int iconColor) {
this.id = id;
private Transport(@DrawableRes int iconDrawable, @StringRes int label,
@ColorRes int iconColor) {
this.iconDrawable = iconDrawable;
this.label = label;
this.iconColor = iconColor;

View File

@@ -34,8 +34,6 @@ public class NavDrawerViewModel extends AndroidViewModel {
getLogger(NavDrawerViewModel.class.getName());
private static final String EXPIRY_DATE_WARNING = "expiryDateWarning";
private static final String SHOW_TRANSPORTS_ONBOARDING =
"showTransportsOnboarding";
@DatabaseExecutor
private final Executor dbExecutor;
@@ -45,8 +43,6 @@ public class NavDrawerViewModel extends AndroidViewModel {
new MutableLiveData<>();
private final MutableLiveData<Boolean> shouldAskForDozeWhitelisting =
new MutableLiveData<>();
private final MutableLiveData<Boolean> showTransportsOnboarding =
new MutableLiveData<>();
@Inject
NavDrawerViewModel(Application app, @DatabaseExecutor Executor dbExecutor,
@@ -132,39 +128,4 @@ public class NavDrawerViewModel extends AndroidViewModel {
}
});
}
@UiThread
LiveData<Boolean> showTransportsOnboarding() {
return showTransportsOnboarding;
}
@UiThread
void checkTransportsOnboarding() {
if (showTransportsOnboarding.getValue() != null) return;
dbExecutor.execute(() -> {
try {
Settings settings =
settingsManager.getSettings(SETTINGS_NAMESPACE);
boolean show =
settings.getBoolean(SHOW_TRANSPORTS_ONBOARDING, true);
showTransportsOnboarding.postValue(show);
} catch (DbException e) {
logException(LOG, WARNING, e);
}
});
}
@UiThread
void transportsOnboardingShown() {
showTransportsOnboarding.setValue(false);
dbExecutor.execute(() -> {
try {
Settings settings = new Settings();
settings.putBoolean(SHOW_TRANSPORTS_ONBOARDING, false);
settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE);
} catch (DbException e) {
logException(LOG, WARNING, e);
}
});
}
}

View File

@@ -1,20 +1,8 @@
package org.briarproject.briar.android.navdrawer;
import android.app.Application;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
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.network.NetworkManager;
import org.briarproject.bramble.api.network.NetworkStatus;
import org.briarproject.bramble.api.network.event.NetworkStatusEvent;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.BluetoothConstants;
import org.briarproject.bramble.api.plugin.LanTcpConstants;
@@ -24,44 +12,28 @@ import org.briarproject.bramble.api.plugin.PluginManager;
import org.briarproject.bramble.api.plugin.TorConstants;
import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.event.TransportStateEvent;
import org.briarproject.bramble.api.settings.Settings;
import org.briarproject.bramble.api.settings.SettingsManager;
import org.briarproject.bramble.api.settings.event.SettingsUpdatedEvent;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import javax.inject.Inject;
import androidx.annotation.Nullable;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import static android.bluetooth.BluetoothAdapter.ACTION_STATE_CHANGED;
import static android.bluetooth.BluetoothAdapter.EXTRA_STATE;
import static android.bluetooth.BluetoothAdapter.STATE_ON;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE;
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
import static org.briarproject.bramble.util.LogUtils.logDuration;
import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.bramble.util.LogUtils.now;
@NotNullByDefault
public class PluginViewModel extends AndroidViewModel implements EventListener {
public class PluginViewModel extends ViewModel implements EventListener {
private static final Logger LOG =
getLogger(PluginViewModel.class.getName());
private final Application app;
private final Executor dbExecutor;
private final SettingsManager settingsManager;
private final PluginManager pluginManager;
private final EventBus eventBus;
private final BroadcastReceiver receiver;
private final MutableLiveData<State> torPluginState =
new MutableLiveData<>();
@@ -70,68 +42,24 @@ public class PluginViewModel extends AndroidViewModel implements EventListener {
private final MutableLiveData<State> btPluginState =
new MutableLiveData<>();
private final MutableLiveData<Boolean> torEnabledSetting =
new MutableLiveData<>(false);
private final MutableLiveData<Boolean> wifiEnabledSetting =
new MutableLiveData<>(false);
private final MutableLiveData<Boolean> btEnabledSetting =
new MutableLiveData<>(false);
private final MutableLiveData<NetworkStatus> networkStatus =
new MutableLiveData<>();
private final MutableLiveData<Boolean> bluetoothTurnedOn =
new MutableLiveData<>(false);
@Inject
PluginViewModel(Application app, @DatabaseExecutor Executor dbExecutor,
SettingsManager settingsManager, PluginManager pluginManager,
EventBus eventBus, NetworkManager networkManager) {
super(app);
this.app = app;
this.dbExecutor = dbExecutor;
this.settingsManager = settingsManager;
PluginViewModel(PluginManager pluginManager, EventBus eventBus) {
this.pluginManager = pluginManager;
this.eventBus = eventBus;
eventBus.addListener(this);
receiver = new BluetoothStateReceiver();
app.registerReceiver(receiver, new IntentFilter(ACTION_STATE_CHANGED));
networkStatus.setValue(networkManager.getNetworkStatus());
torPluginState.setValue(getTransportState(TorConstants.ID));
wifiPluginState.setValue(getTransportState(LanTcpConstants.ID));
btPluginState.setValue(getTransportState(BluetoothConstants.ID));
initialiseBluetoothState();
loadSettings();
}
@Override
protected void onCleared() {
eventBus.removeListener(this);
app.unregisterReceiver(receiver);
}
@Override
public void eventOccurred(Event e) {
if (e instanceof NetworkStatusEvent) {
networkStatus.setValue(((NetworkStatusEvent) e).getStatus());
} else if (e instanceof SettingsUpdatedEvent) {
SettingsUpdatedEvent s = (SettingsUpdatedEvent) e;
if (s.getNamespace().equals(TorConstants.ID.getString())) {
boolean enable = s.getSettings().getBoolean(PREF_PLUGIN_ENABLE,
TorConstants.DEFAULT_PREF_PLUGIN_ENABLE);
torEnabledSetting.setValue(enable);
} else if (s.getNamespace().equals(
LanTcpConstants.ID.getString())) {
boolean enable = s.getSettings().getBoolean(PREF_PLUGIN_ENABLE,
LanTcpConstants.DEFAULT_PREF_PLUGIN_ENABLE);
wifiEnabledSetting.setValue(enable);
} else if (s.getNamespace().equals(
BluetoothConstants.ID.getString())) {
boolean enable = s.getSettings().getBoolean(PREF_PLUGIN_ENABLE,
BluetoothConstants.DEFAULT_PREF_PLUGIN_ENABLE);
btEnabledSetting.setValue(enable);
}
} else if (e instanceof TransportStateEvent) {
if (e instanceof TransportStateEvent) {
TransportStateEvent t = (TransportStateEvent) e;
TransportId id = t.getTransportId();
State state = t.getState();
@@ -149,62 +77,6 @@ public class PluginViewModel extends AndroidViewModel implements EventListener {
return liveData;
}
LiveData<Boolean> getPluginEnabledSetting(TransportId id) {
if (id.equals(TorConstants.ID)) return torEnabledSetting;
else if (id.equals(LanTcpConstants.ID)) return wifiEnabledSetting;
else if (id.equals(BluetoothConstants.ID)) return btEnabledSetting;
else throw new IllegalArgumentException();
}
LiveData<NetworkStatus> getNetworkStatus() {
return networkStatus;
}
LiveData<Boolean> getBluetoothTurnedOn() {
return bluetoothTurnedOn;
}
int getReasonsTorDisabled() {
Plugin plugin = pluginManager.getPlugin(TorConstants.ID);
return plugin == null ? 0 : plugin.getReasonsDisabled();
}
void enableTransport(TransportId id, boolean enable) {
Settings s = new Settings();
s.putBoolean(PREF_PLUGIN_ENABLE, enable);
mergeSettings(s, id.getString());
}
private void initialiseBluetoothState() {
BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();
if (bt == null) bluetoothTurnedOn.setValue(false);
else bluetoothTurnedOn.setValue(bt.getState() == STATE_ON);
}
private void loadSettings() {
dbExecutor.execute(() -> {
try {
boolean tor = isPluginEnabled(TorConstants.ID,
TorConstants.DEFAULT_PREF_PLUGIN_ENABLE);
torEnabledSetting.postValue(tor);
boolean wifi = isPluginEnabled(LanTcpConstants.ID,
LanTcpConstants.DEFAULT_PREF_PLUGIN_ENABLE);
wifiEnabledSetting.postValue(wifi);
boolean bt = isPluginEnabled(BluetoothConstants.ID,
BluetoothConstants.DEFAULT_PREF_PLUGIN_ENABLE);
btEnabledSetting.postValue(bt);
} catch (DbException e) {
logException(LOG, WARNING, e);
}
});
}
private boolean isPluginEnabled(TransportId id, boolean defaultValue)
throws DbException {
Settings s = settingsManager.getSettings(id.getString());
return s.getBoolean(PREF_PLUGIN_ENABLE, defaultValue);
}
private State getTransportState(TransportId id) {
Plugin plugin = pluginManager.getPlugin(id);
return plugin == null ? STARTING_STOPPING : plugin.getState();
@@ -217,26 +89,4 @@ public class PluginViewModel extends AndroidViewModel implements EventListener {
else if (id.equals(BluetoothConstants.ID)) return btPluginState;
else return null;
}
private void mergeSettings(Settings s, String namespace) {
dbExecutor.execute(() -> {
try {
long start = now();
settingsManager.mergeSettings(s, namespace);
logDuration(LOG, "Merging settings", start);
} catch (DbException e) {
logException(LOG, WARNING, e);
}
});
}
private class BluetoothStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int state = intent.getIntExtra(EXTRA_STATE, 0);
if (state == STATE_ON) bluetoothTurnedOn.postValue(true);
else bluetoothTurnedOn.postValue(false);
}
}
}

View File

@@ -1,360 +0,0 @@
package org.briarproject.briar.android.navdrawer;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import org.briarproject.bramble.api.network.NetworkStatus;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.plugin.BluetoothConstants;
import org.briarproject.bramble.api.plugin.LanTcpConstants;
import org.briarproject.bramble.api.plugin.Plugin.State;
import org.briarproject.bramble.api.plugin.TorConstants;
import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.SwitchCompat;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE;
import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED;
import static org.briarproject.bramble.api.plugin.Plugin.State.ENABLING;
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_BATTERY;
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_COUNTRY_BLOCKED;
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_MOBILE_DATA;
import static org.briarproject.briar.android.util.UiUtils.showOnboardingDialog;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class TransportsActivity extends BriarActivity {
@Inject
ViewModelProvider.Factory viewModelFactory;
private final List<Transport> transports = new ArrayList<>(3);
private PluginViewModel viewModel;
private BaseAdapter transportsAdapter;
@Override
public void onCreate(@Nullable Bundle state) {
super.onCreate(state);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}
setContentView(R.layout.activity_transports);
ViewModelProvider provider =
ViewModelProviders.of(this, viewModelFactory);
viewModel = provider.get(PluginViewModel.class);
GridView grid = findViewById(R.id.grid);
initializeCards();
grid.setAdapter(transportsAdapter);
}
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
} else if (item.getItemId() == R.id.action_help) {
String text = getString(R.string.transports_help_text);
showOnboardingDialog(this, text);
return true;
}
return false;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.help_action, menu);
return super.onCreateOptionsMenu(menu);
}
private void initializeCards() {
transportsAdapter = new BaseAdapter() {
@Override
public int getCount() {
return transports.size();
}
@Override
public Transport getItem(int position) {
return transports.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
View view;
if (convertView != null) {
view = convertView;
} else {
LayoutInflater inflater = getLayoutInflater();
view = inflater.inflate(R.layout.list_item_transport_card,
parent, false);
}
Transport t = getItem(position);
ImageView icon = view.findViewById(R.id.icon);
icon.setImageDrawable(ContextCompat.getDrawable(
TransportsActivity.this, t.iconDrawable));
icon.setColorFilter(ContextCompat.getColor(
TransportsActivity.this, t.iconColor));
TextView title = view.findViewById(R.id.title);
title.setText(getString(t.title));
SwitchCompat switchCompat =
view.findViewById(R.id.switchCompat);
switchCompat.setText(getString(t.switchLabel));
switchCompat.setOnClickListener(v ->
viewModel.enableTransport(t.id,
switchCompat.isChecked()));
switchCompat.setChecked(t.isSwitchChecked);
TextView summary = view.findViewById(R.id.summary);
if (t.summary == 0) {
summary.setVisibility(GONE);
} else {
summary.setText(t.summary);
summary.setVisibility(VISIBLE);
}
TextView deviceStatus = view.findViewById(R.id.deviceStatus);
deviceStatus.setText(getBulletString(t.deviceStatus));
TextView pluginStatus = view.findViewById(R.id.appStatus);
pluginStatus.setText(getBulletString(t.pluginStatus));
pluginStatus.setVisibility(t.showPluginStatus ? VISIBLE : GONE);
return view;
}
};
Transport tor = createTransport(TorConstants.ID,
R.drawable.transport_tor, R.string.transport_tor,
R.string.tor_enable_title, R.string.tor_enable_summary,
R.string.tor_device_status_offline,
R.string.tor_plugin_status_inactive);
transports.add(tor);
Transport wifi = createTransport(LanTcpConstants.ID,
R.drawable.transport_lan, R.string.transport_lan_long,
R.string.wifi_setting, 0, R.string.lan_device_status_off,
R.string.lan_plugin_status_inactive);
transports.add(wifi);
Transport bt = createTransport(BluetoothConstants.ID,
R.drawable.transport_bt, R.string.transport_bt,
R.string.bluetooth_setting, 0, R.string.bt_device_status_off,
R.string.bt_plugin_status_inactive);
transports.add(bt);
viewModel.getNetworkStatus().observe(this, status -> {
updateTorResources(tor, status);
updateWifiResources(wifi, status);
transportsAdapter.notifyDataSetChanged();
});
viewModel.getBluetoothTurnedOn().observe(this, on -> {
updateBtResources(bt, on);
transportsAdapter.notifyDataSetChanged();
});
}
private String getBulletString(@StringRes int resId) {
return "\u2022 " + getString(resId);
}
@ColorRes
private int getIconColor(State state) {
if (state == ACTIVE) return R.color.briar_lime_400;
else if (state == ENABLING) return R.color.briar_orange_500;
else return android.R.color.tertiary_text_light;
}
private void updateTorResources(Transport tor, NetworkStatus status) {
if (status.isConnected()) {
if (status.isWifi()) {
tor.deviceStatus = R.string.tor_device_status_online_wifi;
} else {
tor.deviceStatus = R.string.tor_device_status_online_mobile;
}
tor.showPluginStatus = true;
} else {
tor.deviceStatus = R.string.tor_device_status_offline;
tor.showPluginStatus = false;
}
}
private void updateWifiResources(Transport wifi, NetworkStatus status) {
if (status.isWifi()) {
wifi.deviceStatus = R.string.lan_device_status_on;
wifi.showPluginStatus = true;
} else {
wifi.deviceStatus = R.string.lan_device_status_off;
wifi.showPluginStatus = false;
}
}
private void updateBtResources(Transport bt, boolean on) {
if (on) {
bt.deviceStatus = R.string.bt_device_status_on;
bt.showPluginStatus = true;
} else {
bt.deviceStatus = R.string.bt_device_status_off;
bt.showPluginStatus = false;
}
}
@StringRes
private int getPluginStatus(TransportId id, State state) {
if (id.equals(TorConstants.ID)) {
return getTorPluginStatus(state);
} else if (id.equals(LanTcpConstants.ID)) {
return getWifiPluginStatus(state);
} else if (id.equals(BluetoothConstants.ID)) {
return getBtPluginStatus(state);
} else throw new AssertionError();
}
@StringRes
private int getTorPluginStatus(State state) {
if (state == ENABLING) {
return R.string.tor_plugin_status_enabling;
} else if (state == ACTIVE) {
return R.string.tor_plugin_status_active;
} else if (state == DISABLED) {
int reasons = viewModel.getReasonsTorDisabled();
if ((reasons & REASON_MOBILE_DATA) != 0) {
return R.string.tor_plugin_status_disabled_mobile_data;
} else if ((reasons & REASON_BATTERY) != 0) {
return R.string.tor_plugin_status_disabled_battery;
} else if ((reasons & REASON_COUNTRY_BLOCKED) != 0) {
return R.string.tor_plugin_status_disabled_country_blocked;
} else {
return R.string.tor_plugin_status_disabled;
}
} else {
return R.string.tor_plugin_status_inactive;
}
}
@StringRes
private int getWifiPluginStatus(State state) {
if (state == ENABLING) return R.string.lan_plugin_status_enabling;
else if (state == ACTIVE) return R.string.lan_plugin_status_active;
else if (state == DISABLED) return R.string.lan_plugin_status_disabled;
else return R.string.lan_plugin_status_inactive;
}
@StringRes
private int getBtPluginStatus(State state) {
if (state == ENABLING) return R.string.bt_plugin_status_enabling;
else if (state == ACTIVE) return R.string.bt_plugin_status_active;
else if (state == DISABLED) return R.string.bt_plugin_status_disabled;
else return R.string.bt_plugin_status_inactive;
}
private Transport createTransport(TransportId id,
@DrawableRes int iconDrawable, @StringRes int title,
@StringRes int switchLabel, @StringRes int summary,
@StringRes int deviceStatus, @StringRes int pluginStatus) {
int iconColor = getIconColor(STARTING_STOPPING);
Transport transport = new Transport(id, iconDrawable, iconColor, title,
switchLabel, false, summary, deviceStatus, pluginStatus, false);
viewModel.getPluginState(id).observe(this, state -> {
transport.iconColor = getIconColor(state);
transport.pluginStatus = getPluginStatus(transport.id, state);
transportsAdapter.notifyDataSetChanged();
});
viewModel.getPluginEnabledSetting(id).observe(this, enabled -> {
transport.isSwitchChecked = enabled;
transportsAdapter.notifyDataSetChanged();
});
return transport;
}
private static class Transport {
private final TransportId id;
@DrawableRes
private final int iconDrawable;
@StringRes
private final int title, switchLabel, summary;
@ColorRes
private int iconColor;
@StringRes
private int deviceStatus, pluginStatus;
private boolean isSwitchChecked, showPluginStatus;
private Transport(TransportId id,
@DrawableRes int iconDrawable,
@ColorRes int iconColor,
@StringRes int title,
@StringRes int switchLabel,
boolean isSwitchChecked,
@StringRes int summary,
@StringRes int deviceStatus,
@StringRes int pluginStatus,
boolean showPluginStatus) {
this.id = id;
this.iconDrawable = iconDrawable;
this.iconColor = iconColor;
this.title = title;
this.switchLabel = switchLabel;
this.isSwitchChecked = isSwitchChecked;
this.summary = summary;
this.deviceStatus = deviceStatus;
this.pluginStatus = pluginStatus;
this.showPluginStatus = showPluginStatus;
}
}
}

View File

@@ -32,6 +32,7 @@ import org.briarproject.bramble.plugin.tor.CircumventionProvider;
import org.briarproject.bramble.util.StringUtils;
import org.briarproject.briar.R;
import org.briarproject.briar.android.Localizer;
import org.briarproject.briar.android.account.AccountUtils;
import org.briarproject.briar.android.util.UiUtils;
import java.util.ArrayList;
@@ -251,9 +252,23 @@ public class SettingsFragment extends PreferenceFragmentCompat
throw new RuntimeException("Boom!");
}
);
findPreference("pref_key_export").setOnPreferenceClickListener(
preference -> {
AccountUtils.exportAccount(requireContext());
return true;
}
);
findPreference("pref_key_import").setOnPreferenceClickListener(
preference -> {
AccountUtils.importAccount(requireContext());
return true;
}
);
} else {
findPreference("pref_key_explode").setVisible(false);
findPreference("pref_key_test_data").setVisible(false);
findPreference("pref_key_export").setVisible(false);
findPreference("pref_key_import").setVisible(false);
PreferenceGroup testing =
findPreference("pref_key_explode").getParent();
if (testing == null) throw new AssertionError();

View File

@@ -1,41 +0,0 @@
package org.briarproject.briar.android.widget;
import android.annotation.TargetApi;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import androidx.annotation.Nullable;
@NotNullByDefault
public class TouchInterceptingLinearLayout extends LinearLayout {
public TouchInterceptingLinearLayout(Context context) {
super(context);
}
public TouchInterceptingLinearLayout(Context context,
@Nullable AttributeSet attrs) {
super(context, attrs);
}
public TouchInterceptingLinearLayout(Context context,
@Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(21)
public TouchInterceptingLinearLayout(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
onTouchEvent(e);
return false;
}
}

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="1"
android:padding="6dp"
android:verticalSpacing="12dp"
tools:listitem="@layout/list_item_transport_card" />

View File

@@ -24,7 +24,6 @@
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textColor="?android:attr/textColorSecondary"
android:textIsSelectable="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/include_in_report"

View File

@@ -1,89 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/BriarCard"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
tools:background="@drawable/transport_tor"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_large"
tools:text="@string/transport_tor" />
</LinearLayout>
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/switchCompat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_medium"
android:widgetLayout="@layout/preference_switch_compat"
tools:checked="true"
tools:text="@string/tor_enable_title" />
<TextView
android:id="@+id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:layout_marginRight="32dp"
android:textColor="?android:attr/textColorSecondary"
android:visibility="gone"
tools:text="@string/tor_enable_summary"
tools:visibility="visible" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/status_heading"
android:textColor="?android:attr/textColorPrimary" />
<TextView
android:id="@+id/deviceStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_marginLeft="4dp"
android:textColor="?android:attr/textColorPrimary"
tools:text="@string/tor_device_status_online_wifi" />
<TextView
android:id="@+id/appStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_marginLeft="4dp"
android:textColor="?android:attr/textColorPrimary"
tools:text="@string/tor_plugin_status_active" />
</LinearLayout>
</androidx.cardview.widget.CardView>

View File

@@ -26,13 +26,21 @@
app:layout_constraintTop_toTopOf="parent"
app:menu="@menu/navigation_drawer" />
<View
android:id="@+id/divider1"
style="@style/Divider.Horizontal"
android:layout_width="0dp"
app:layout_constraintEnd_toEndOf="@+id/navigation"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/navigation" />
<View
android:id="@+id/spacer"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/transports"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/navigation"
app:layout_constraintTop_toBottomOf="@+id/divider1"
app:layout_constraintVertical_weight="1" />
<include

View File

@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<org.briarproject.briar.android.widget.TouchInterceptingLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:orientation="vertical"
tools:showIn="@layout/navigation_menu">
@@ -17,4 +16,4 @@
android:numColumns="3"
tools:listitem="@layout/list_item_transport" />
</org.briarproject.briar.android.widget.TouchInterceptingLinearLayout>
</LinearLayout>

View File

@@ -24,7 +24,7 @@
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_btn_settings"
android:icon="@drawable/ic_settings_black"
android:icon="@drawable/ic_settings_black_24dp"
android:title="@string/settings_button"/>
<item
android:id="@+id/nav_btn_lock"

View File

@@ -26,8 +26,6 @@
<!--Login-->
<string name="enter_password">‮كلمة السّر</string>
<string name="try_again">كلمة السرّ خاطئة, الرجاء المحاولة مجدّدا</string>
<string name="dialog_title_cannot_check_password">لا يمكن التحقق من كلمة السر</string>
<string name="dialog_message_cannot_check_password">Briar لم يتمكن من التحقق من كلمة المرور. الرجاء إعادة تشغيل جهازك من أجل جل المشكلة</string>
<string name="sign_in_button">تسجيل الدخول</string>
<string name="forgotten_password">نسيتُ كلمة السر</string>
<string name="dialog_title_lost_password">فقدت كلمة السر</string>
@@ -65,36 +63,10 @@
<string name="lock_button">قفل التطبيق</string>
<string name="settings_button">الإعدادات</string>
<string name="sign_out_button">تسجيل الخروج</string>
<string name="transports_onboarding_text">إلمس هنا من أجل التحكم بطريقةالربط مع جهات الاتصال.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">إنترنت</string>
<string name="tor_device_status_online_wifi">جهازك لديه ولوج لشبكة الانترنت عبر ال Wi-Fi </string>
<string name="tor_device_status_online_mobile">جهازك لديه ولوج لشبكة الانترنت عبر بيانات الهاتف</string>
<string name="tor_device_status_offline">جهازك ليس متصل بالانترنت</string>
<string name="tor_plugin_status_enabling">جاري اتصال Briar بالانترنت</string>
<string name="tor_plugin_status_active">Briar متصل بالانترنت</string>
<string name="tor_plugin_status_inactive">Briar لم يتمكن من الاتصال بالانترنت </string>
<string name="tor_plugin_status_disabled">إعدادات Briar لاتسمح بالاتصال بالانترنت</string>
<string name="tor_plugin_status_disabled_mobile_data">إعدادات Briar لاتسمح بالاتصال عن طريق بيانات الهاتف</string>
<string name="tor_plugin_status_disabled_battery">إعدادات Briar لاتسمح بالاتصال بالانترنت عند استخدام بطارية الهاتف</string>
<string name="tor_plugin_status_disabled_country_blocked">لايمكن استخدام Briar في هذا البلد</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">واي-فاي</string>
<string name="transport_lan_long">نفس شبكة الWi-Fi </string>
<string name="lan_device_status_on">جهازك متصل بشبكة الWi-Fi</string>
<string name="lan_device_status_off">جهازك ليس متصل بشبكة الWi-Fi</string>
<string name="lan_plugin_status_enabling">جاري ايصال Briar بشبكة الWi-Fi</string>
<string name="lan_plugin_status_active"> Briar متصل بشبكة الWi-Fi</string>
<string name="lan_plugin_status_inactive">لم يتمكن Briar من الاتصال بشبكة ال Wi-Fi</string>
<string name="lan_plugin_status_disabled">إعدادات Briar لاتسمح بالاتصال بشبكة ال Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">بلوتوث</string>
<string name="bt_device_status_on"> البلوتوث مفعّل </string>
<string name="bt_device_status_off">البلوتوث مفعّل</string>
<string name="bt_plugin_status_enabling">جاري اتصال Briar بالبلوتوث</string>
<string name="bt_plugin_status_active">Briar متصل بالبلوتوث</string>
<string name="bt_plugin_status_inactive">لم يتمكن Briar من الاتصال بالانترنت</string>
<string name="bt_plugin_status_disabled">إعدادات Briar لاتسمح بالاتصال بالبلوتوث</string>
<string name="transport_lan">واي-فاي</string>
<!--Notifications-->
<string name="reminder_notification_title">تم تسجيل الخروج من Briar (براير)</string>
<string name="reminder_notification_text">الرجاء اللمس لإعادة الدخول</string>
@@ -157,7 +129,6 @@
<string name="help">مساعدة</string>
<string name="sorry">معذرة</string>
<string name="error_start_activity">غير متوفّر على نظامكم </string>
<string name="status_heading">الحالة:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">لا جهات اتصال للعرض</string>
<string name="no_contacts_action">لمس علامة + لإضافة جهة إتصال</string>
@@ -477,20 +448,10 @@
<string name="pref_theme_auto">تلقائي (توقيت النهار)</string>
<string name="pref_theme_system">النظام الافتراضي</string>
<!--Settings Connections-->
<string name="network_settings_title">شبكات الاتصال</string>
<string name="bluetooth_setting">ربط جهات الاتصال عن طريق بلوتوث</string>
<string name="wifi_setting">ربط جهات الاتصال عن طريق نفس شبكة الواي فاي</string>
<string name="tor_enable_title">ربط شبكات الاتصال عن طريق الانترنت</string>
<string name="tor_enable_summary">كل جهات الاتصال تمر عبر شبكة تور من أجل الخصوصية</string>
<string name="tor_network_setting">وسيلة الاتصال لشبكة تور</string>
<string name="tor_network_setting_automatic">تلقائيًا حسب الموقع</string>
<string name="tor_network_setting_without_bridges">استخدام شبكة تور من دون جسور</string>
<string name="tor_network_setting_with_bridges">استخدام شبكة تور مع جسور</string>
<string name="tor_network_setting_never">لا يمكن الاتصال بالإنترنت</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">تلقائيا: %1$s (في %2$s)</string>
<string name="tor_mobile_data_title">إستخدام بيانات الجوال</string>
<string name="tor_only_when_charging_title">الاتصال بالإنترنت فقط عن الشحن</string>
<string name="tor_only_when_charging_summary">تعطيل الاتصال بالانترنت عند تشغيل الجهاز على البطارية</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">الأمان</string>
@@ -600,8 +561,6 @@
<string name="lock_unlock_password">استخدام كلمة السر</string>
<string name="lock_is_locked">Briar (براير) مقفل</string>
<string name="lock_tap_to_unlock">الرجاء اللمس لفك القفل</string>
<!--Connections Screen-->
<string name="transports_help_text">يمكن ل Briar التواصل مع جهات الاتصال عن طريق الانترنت, شكبة ال Wi-Fi أو البلوتوث.n\n\كل وسائل الاتصال عن طريق الانترنت تمر عبر شبكة تور من أجل الخصوصية.n\n\إذا كان من الممكن الوصول إلى شبكة إتصال بعدة طرق فإن Briar سوف يستعملهم جميعاً بالتوازي.</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>

View File

@@ -59,12 +59,10 @@
<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: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<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>
@@ -111,7 +109,6 @@
<string name="help">Yardım</string>
<string name="sorry">Bağışlayın</string>
<string name="error_start_activity">Sizin sistemdə ələçatmazdır. </string>
<string name="status_heading">Status:</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>
@@ -476,7 +473,6 @@
<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>
<!--Connections Screen-->
<!--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>

View File

@@ -53,12 +53,10 @@
<string name="lock_button">Zaključaj aplikaciju</string>
<string name="settings_button">Podešavanja</string>
<string name="sign_out_button">Odjava</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Odjavljeni ste iz Briara</string>
<string name="reminder_notification_text">Dotaknite da se prijavite nazad.</string>
@@ -88,7 +86,6 @@
<string name="fix">Popravi</string>
<string name="help">Pomoć</string>
<string name="sorry">Izvini</string>
<string name="status_heading">Status:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Nema kontakata za prikazivanje</string>
<string name="no_contacts_action">Taknite + ikonu da dodate kontakt</string>
@@ -467,7 +464,6 @@
<string name="lock_unlock_password">Koristi lozinku</string>
<string name="lock_is_locked">Briar je zaključan</string>
<string name="lock_tap_to_unlock">Dotakni da otključaš</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Fata</string>

View File

@@ -61,12 +61,10 @@
<string name="lock_button">Bloqueja l\'aplicació</string>
<string name="settings_button">Configuració</string>
<string name="sign_out_button">Tanca la sessió </string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Heu sortit de Briar</string>
<string name="reminder_notification_text">Toqueu per a reiniciar la sessió.</string>
@@ -113,7 +111,6 @@
<string name="help">Ajuda</string>
<string name="sorry">Ens sap greu</string>
<string name="error_start_activity">No disponible al vostre sistema</string>
<string name="status_heading">Estat</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">No hi ha cap contacte per mostrar</string>
<string name="no_contacts_action">Toqueu la icona + per afegir un contacte</string>
@@ -526,7 +523,6 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
<string name="lock_unlock_password">Usa la contrasenya</string>
<string name="lock_is_locked">Briar està bloquejat</string>
<string name="lock_tap_to_unlock">Toqueu per desbloquejar-lo</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alba</string>

View File

@@ -61,36 +61,10 @@
<string name="lock_button">App sperren</string>
<string name="settings_button">Einstellungen</string>
<string name="sign_out_button">Abmelden</string>
<string name="transports_onboarding_text">Hier tippen, um die Verbindung zu deinen Kontakten zu steuern.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">Dein Telefon hat Internetzugang über WLAN</string>
<string name="tor_device_status_online_mobile">Dein Telefon hat Internetzugang über mobile Daten</string>
<string name="tor_device_status_offline">Dein Telefon hat keinen Internetzugang</string>
<string name="tor_plugin_status_enabling">Briar verbindet sich mit dem Internet</string>
<string name="tor_plugin_status_active">Briar ist mit dem Internet verbunden</string>
<string name="tor_plugin_status_inactive">Briar kann keine Verbindung zum Internet herstellen</string>
<string name="tor_plugin_status_disabled">Briar ist so konfiguriert, dass keine Internetverbindung verwendet werden soll</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar ist so konfiguriert, dass keine mobilen Daten verwendet werden sollen</string>
<string name="tor_plugin_status_disabled_battery">Briar ist so konfiguriert, dass im Akkubetrieb das Internet nicht genutzt werden soll</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar ist so konfiguriert, dass keine Internetverbindung in diesem Land verwendet werden soll</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">WLAN</string>
<string name="transport_lan_long">Selbes WLAN-Netzwerk</string>
<string name="lan_device_status_on">Dein Telefon ist über WLAN verbunden</string>
<string name="lan_device_status_off">Dein Telefon ist nicht über WLAN verbunden</string>
<string name="lan_plugin_status_enabling">Briar verbindet sich mit dem WLAN-Netzwerk</string>
<string name="lan_plugin_status_active">Briar ist mit dem WLAN-Netzwerk verbunden</string>
<string name="lan_plugin_status_inactive">Briar kann keine Verbindung zum WLAN-Netzwerk herstellen</string>
<string name="lan_plugin_status_disabled">Briar ist so konfiguriert, dass kein WLAN-Netzwerk verwendet werden soll</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Die Bluetooth-Funktion deines Telefons ist eingeschaltet</string>
<string name="bt_device_status_off">Die Bluetooth-Funktion deines Telefons ist ausgeschaltet</string>
<string name="bt_plugin_status_enabling">Briar verbindet sich über Bluetooth</string>
<string name="bt_plugin_status_active">Briar ist über Bluetooth verbunden</string>
<string name="bt_plugin_status_inactive">Briar kann keine Verbindung über Bluetooth herstellen</string>
<string name="bt_plugin_status_disabled">Briar ist so konfiguriert, dass Bluetooth nicht verwendet werden soll</string>
<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>
@@ -137,7 +111,6 @@
<string name="help">Hilfe</string>
<string name="sorry">Entschuldigung</string>
<string name="error_start_activity">Nicht Verfügbar für dein System</string>
<string name="status_heading">Status:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Keine Kontakte vorhanden</string>
<string name="no_contacts_action">Tippe auf das + Symbol, um einen Kontakt hinzuzufügen</string>
@@ -154,7 +127,7 @@
<string name="set_alias_button">Ändern</string>
<string name="delete_all_messages">Alle Nachrichten löschen</string>
<string name="dialog_title_delete_all_messages">Löschen der Nachrichten bestätigen</string>
<string name="dialog_message_delete_all_messages">Bist du sicher, dass du alle Nachrichten löschen willst?</string>
<string name="dialog_message_delete_all_messages">Bist Du sicher, dass Du alle Nachrichten löschen willst?</string>
<string name="dialog_title_not_all_messages_deleted">Es konnten nicht alle Nachrichten gelöscht werden</string>
<string name="dialog_message_not_deleted_ongoing_both">Nachrichten, die sich auf laufende Einladungen und Kontaktempfehlungen beziehen, können nicht gelöscht werden, bis sie abgeschlossen sind.</string>
<string name="dialog_message_not_deleted_ongoing_introductions">Nachrichten, die sich auf laufende Kontaktempfehlungen beziehen, können nicht gelöscht werden, bis sie abgeschlossen sind.</string>
@@ -195,7 +168,7 @@
<string name="connecting_to_device">Verbinde mit Gerät\u2026</string>
<string name="authenticating_with_device">Authentifiziere Gerät\u2026</string>
<string name="connection_error_title">Keine Verbindung zum Kontakt</string>
<string name="connection_error_explanation">Überprüfe, ob ihr beide mit demselben WLAN-Netzwerk verbunden seid.</string>
<string name="connection_error_explanation">Überprüfe, ob ihr beide mit dem selben WLAN-Netzwerk verbunden seid.</string>
<string name="connection_error_feedback">Wenn das Problem weiterbesteht, hilf uns die App zu verbessern und <a href="feedback">schicke Feedback</a>.</string>
<!--Adding Contacts Remotely-->
<string name="add_contact_remotely_title_case">Kontakt aus der Ferne hinzufügen</string>
@@ -211,7 +184,7 @@
<string name="add_contact_choose_nickname">Wähle einen Spitznamen</string>
<string name="add_contact_choose_a_nickname">Gib einen Spitznamen ein</string>
<string name="nickname_intro">Gib deinem Kontakt einen Spitznamen. Nur du kannst ihn sehen.</string>
<string name="your_link">Gib diesen Link dem Kontakt, den du hinzufügen möchtest</string>
<string name="your_link">Gebe diesen Link dem Kontakt, den du hinzufügen möchtest:</string>
<string name="link_clip_label">Briar Link</string>
<string name="link_copied_toast">Link kopiert</string>
<string name="adding_contact_error">Es gab einen Fehler beim Hinzufügen des Kontaktes.</string>
@@ -252,7 +225,7 @@
will be used in a dialog button, so if the translation of this string longer than 20 characters,
please use "No" instead, and use "Yes" for the "Same Person" button-->
<string name="different_person_button">Andere Person</string>
<string name="duplicate_link_dialog_text_3">%s und %s haben Dir denselben Link geschickt.\n\nMöglicherweise versucht einer der beiden mehr über deine Kontakte zu erfahren.\n\nDu solltest deswegen niemandem sagen, dass du diesen Link auch von jemand anderem erhalten hast.</string>
<string name="duplicate_link_dialog_text_3">%s und %s haben Dir denselben Link geschickt.\n\nMöglicherweise versucht einer der beiden mehr über deine Kontakte zu erfahren.\n\nDu solltest deswegen niemandem sagen, dass Du diesen Link auch von jemand anderem erhalten hast.</string>
<string name="pending_contact_updated_toast">Ausstehender Kontakt aktualisiert</string>
<!--Introductions-->
<string name="introduction_onboarding_title">Mache deine Kontakte untereinander bekannt</string>
@@ -437,19 +410,10 @@
<string name="pref_theme_system">Systemstandard</string>
<!--Settings Connections-->
<string name="network_settings_title">Verbindungen</string>
<string name="bluetooth_setting">Verbindung zu den Kontakten über Bluetooth</string>
<string name="wifi_setting">Verbindung zu den Kontakten über dasselbe WLAN-Netzwerk</string>
<string name="tor_enable_title">Verbindung zu den Kontakten über das Internet</string>
<string name="tor_enable_summary">Alle Verbindungen laufen über das Tor-Netzwerk, um den Datenschutz zu gewährleisten</string>
<string name="tor_network_setting">Verbindungsmethode mit dem Tor-Netzwerk</string>
<string name="tor_network_setting_automatic">Automatisch (standortbasiert)</string>
<string name="tor_network_setting_without_bridges">Tor-Netzwerk ohne Bridges nutzen</string>
<string name="tor_network_setting_with_bridges">Tor-Netzwerk mit Bridges nutzen</string>
<string name="tor_network_setting_never">Keine Verbindung zum Internet herstellen</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">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 zum Internet nur während des Ladevorgangs</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>
@@ -559,8 +523,6 @@
<string name="lock_unlock_password">Passwort benutzen</string>
<string name="lock_is_locked">Briar ist gesperrt</string>
<string name="lock_tap_to_unlock">Zum Entsperren antippen</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar kann sich über das Internet, WLAN oder Bluetooth mit deinen Kontakten verbinden.\n\nAlle Internetverbindungen laufen über das Tor-Netzwerk, um den Datenschutz zu gewährleisten.\n\nWenn ein Kontakt auf mehreren Wegen erreichbar ist, nutzt Briar diese parallel.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alice</string>

View File

@@ -61,36 +61,10 @@
<string name="lock_button">Bloquear aplicación</string>
<string name="settings_button">Configuración</string>
<string name="sign_out_button">Cerrar sesión</string>
<string name="transports_onboarding_text">Pulsa aquí para controlar cómo se conecta Briar a tus contactos.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">Tu teléfono tiene acceso a Internet vía Wi-Fi</string>
<string name="tor_device_status_online_mobile">Tu teléfono tiene acceso a Internet vía datos móviles</string>
<string name="tor_device_status_offline">Tu teléfono no tiene acceso a Internet</string>
<string name="tor_plugin_status_enabling">Briar está conectando a Internet</string>
<string name="tor_plugin_status_active">Briar está conectado a Internet</string>
<string name="tor_plugin_status_inactive">Briar no puede conectar a Internet</string>
<string name="tor_plugin_status_disabled">Briar está configurado para no usar Internet</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar está configurado para no usar datos móviles</string>
<string name="tor_plugin_status_disabled_battery">Briar está configurado para no usar Internet cuando se esté funcionando en batería</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar está configurado para no usar Internet en este país</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Misma red Wi-Fi</string>
<string name="lan_device_status_on">Tu teléfono está conectado al Wi-Fi</string>
<string name="lan_device_status_off">Tu teléfono no está conectado al Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar está conectando a la red Wi-Fi</string>
<string name="lan_plugin_status_active">Briar está conectado a la red Wi-Fi</string>
<string name="lan_plugin_status_inactive">Briar no puede conectar a la red Wi-Fi</string>
<string name="lan_plugin_status_disabled">Briar está configurado para no usar a la red Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">El Bluetooth de tu teléfono está encendido</string>
<string name="bt_device_status_off">El Bluetooth de tu teléfono está apagado</string>
<string name="bt_plugin_status_enabling">Briar está conectando con Bluetooth</string>
<string name="bt_plugin_status_active">Briar está conectado con Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar no puede conectar con Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar está configurado para no usar Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Sesión de Briar cerrada</string>
<string name="reminder_notification_text">Golpear para reiniciar sesión.</string>
@@ -137,7 +111,6 @@
<string name="help">Ayuda</string>
<string name="sorry">Disculpa</string>
<string name="error_start_activity">No disponible en tu sistema</string>
<string name="status_heading">Estado:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">No hay contactos para mostrar</string>
<string name="no_contacts_action">Golpear el icono + para añadir un contacto</string>
@@ -157,12 +130,12 @@
<string name="dialog_message_delete_all_messages">¿Estás seguro de que deseas eliminar todos los mensajes?</string>
<string name="dialog_title_not_all_messages_deleted">No se pudieron eliminar todos los mensajes.</string>
<string name="dialog_message_not_deleted_ongoing_both">Los mensajes relacionados con presentaciones o invitaciones en curso no se pueden eliminar hasta que finalicen.</string>
<string name="dialog_message_not_deleted_ongoing_introductions">Los mensajes relacionados con presentaciones no se pueden eliminar hasta que finalicen.</string>
<string name="dialog_message_not_deleted_ongoing_introductions">Los mensajes relacionados con presentaciones o invitaciones en curso no se pueden eliminar hasta que finalicen.</string>
<string name="dialog_message_not_deleted_ongoing_invitations">Los mensajes relacionados a invitaciones en curso no pueden ser borrados hasta su conclusión.</string>
<string name="dialog_message_not_deleted_partly_downloaded">Los mensajes parcialmente descargados no se pueden eliminar hasta que haya finalizado la descarga.</string>
<string name="dialog_message_not_deleted_not_all_selected_both">Para borrar una invitación o presentación, debes seleccionar la petición y la respuesta.</string>
<string name="dialog_message_not_deleted_not_all_selected_introductions">Para eliminar una introducción, debes seleccionar la solicitud y la respuesta.</string>
<string name="dialog_message_not_deleted_not_all_selected_invitations">Para eliminar una invitación, debes seleccionar la solicitud y la respuesta.</string>
<string name="dialog_message_not_deleted_not_all_selected_introductions">Para eliminar una introducción, debe seleccionar la solicitud y la respuesta.</string>
<string name="dialog_message_not_deleted_not_all_selected_invitations">Para eliminar una invitación, debe seleccionar la solicitud y la respuesta.</string>
<string name="delete_contact">Eliminar contacto</string>
<string name="dialog_title_delete_contact">Confirmar eliminación de contacto</string>
<string name="dialog_message_delete_contact">¿Seguro que quieres eliminar este contacto y todos los mensajes intercambiados entre vosotros?</string>
@@ -437,19 +410,10 @@
<string name="pref_theme_system">Predeterminado del sistema</string>
<!--Settings Connections-->
<string name="network_settings_title">Conexiones</string>
<string name="bluetooth_setting">Conectar con contactos mediante Bluetooth</string>
<string name="wifi_setting">Conectar con contactos en la misma red Wi-Fi</string>
<string name="tor_enable_title">Conectar con contactos mediante Internet</string>
<string name="tor_enable_summary">Dirigir todas las conexiones a través de la red Tor por privacidad</string>
<string name="tor_network_setting">Método de conexión para la red Tor</string>
<string name="tor_network_setting_automatic">Automático basado en ubicación</string>
<string name="tor_network_setting_without_bridges">Utilizar la red Tor sin puentes</string>
<string name="tor_network_setting_with_bridges">Utilizar la red Tor a través de puentes</string>
<string name="tor_network_setting_never">Evitar conectar a Internet</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">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 a Internet solamente mientras se carga el dispositivo</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>
@@ -559,8 +523,6 @@
<string name="lock_unlock_password">Usa la contraseña</string>
<string name="lock_is_locked">Briar está bloqueado</string>
<string name="lock_tap_to_unlock">Golpear para desbloquear</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar puede conectar a tus contactos vía Internet, Wi-Fi o Bluetooth.\n\nTodas las conexiones a Internet van a través de la red Tor por privacidad.\n\nSi un contacto puede ser alcanzado por múltiples métodos, Briar los usa en paralelo.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alicia</string>

View File

@@ -61,12 +61,10 @@
<string name="lock_button">Blokeatu aplikazioa</string>
<string name="settings_button">Ezarpenak</string>
<string name="sign_out_button">Amaitu saioa</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Briar saioa amaituta</string>
<string name="reminder_notification_text">Sakatu saioa berriro hasteko.</string>
@@ -113,7 +111,6 @@
<string name="help">Laguntza</string>
<string name="sorry">Sentitzen dugu</string>
<string name="error_start_activity">Ez dago eskuragarri zure sistemarako</string>
<string name="status_heading">Egoera:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Ez dago erakusteko kontakturik</string>
<string name="no_contacts_action">Sakatu + ikonoa kontaktua gehitzeko</string>
@@ -525,7 +522,6 @@
<string name="lock_unlock_password">Erabili pasahitza</string>
<string name="lock_is_locked">Briar blokeatuta dago</string>
<string name="lock_tap_to_unlock">Sakatu desblokeatzeko</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Arantza</string>

View File

@@ -67,12 +67,10 @@
<string name="lock_button">قفل کردن برنامه</string>
<string name="settings_button">تنظیمات</string>
<string name="sign_out_button">خروج</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">اینترنت</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">وای فای</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">بلوتوث</string>
<string name="transport_lan">وای فای</string>
<!--Notifications-->
<string name="reminder_notification_title">از Briar (برایر) خارج شد</string>
<string name="reminder_notification_text">برای وارد شدن دوباره ضربه بزنید.</string>
@@ -119,7 +117,6 @@
<string name="help">راهنما</string>
<string name="sorry">پوزش</string>
<string name="error_start_activity">برای سیستم شما موجود نمی باشد</string>
<string name="status_heading">وضعیت:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">هیچ مخاطبی برای نمایش وجود ندارد</string>
<string name="no_contacts_action">برای افزودن مخاطب روی + کلیک کنید</string>
@@ -452,20 +449,10 @@
<string name="pref_theme_auto">خودکار ( روز)</string>
<string name="pref_theme_system">پیش فرض سیستم</string>
<!--Settings Connections-->
<string name="network_settings_title">اتصالات</string>
<string name="bluetooth_setting">اتصال به مخاطبان از طریق بلوتوث</string>
<string name="wifi_setting">اتصال به مخاطبان روی یک شبکه وای‌-فای یکسان</string>
<string name="tor_enable_title">اتصال به مخاطبان از طریق اینترنت</string>
<string name="tor_enable_summary">تمام اتصال ها برای حفظ حریم خصوصی از شبکه تور عبور می‌کنند</string>
<string name="tor_network_setting">روش اتصال برای شبکه تور</string>
<string name="tor_network_setting_automatic">خودکار مبتنی بر موقعیت</string>
<string name="tor_network_setting_without_bridges">استفاده از شبکه تور بدون پل</string>
<string name="tor_network_setting_with_bridges">استفاده از شبکه تور با پل</string>
<string name="tor_network_setting_never">به اینترنت وصل نشو</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">خودکار: %1$s(در %2$s)</string>
<string name="tor_mobile_data_title">استفاده از داده موبایل</string>
<string name="tor_only_when_charging_title">اتصال به اینترنت تنها در هنگام شارژ شدن</string>
<string name="tor_only_when_charging_summary">ارتباط اینترنت را هنگامی که دستگاه در حال استفاده از باتری خود می باشد را غیرفعال می کند</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">امنیت</string>
@@ -587,7 +574,6 @@ Briar (برایر) موقعیت شما را ذخیره نمی‌کند و آن
<string name="lock_unlock_password">استفاده از گذرواژه</string>
<string name="lock_is_locked">Briar (برایر) قفل می باشد</string>
<string name="lock_tap_to_unlock">برای آنلاک کردن کلیک کنید</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">آلیس</string>

View File

@@ -25,7 +25,7 @@
<string name="warning_dozed">%s na pas pu fonctionner en arrière-plan</string>
<!--Login-->
<string name="enter_password">Mot de passe</string>
<string name="try_again">Le mot de passe est erroné, réessayez</string>
<string name="try_again">Le mot de passe est erroné, ressayez</string>
<string name="dialog_title_cannot_check_password">Impossible de vérifier le mot de passe</string>
<string name="dialog_message_cannot_check_password">Briar ne peut pas vérifier votre mot de passe. Veuillez essayer de redémarrer votre appareil pour résoudre ce problème.</string>
<string name="sign_in_button">Connexion</string>
@@ -37,7 +37,7 @@
<string name="startup_failed_activity_title">Échec de démarrage de Briar</string>
<string name="startup_failed_db_error">Pour quelque raison, votre base de données Briar est corrompue sans espoir de réparation. Votre compte, vos données et tous vos contacts sont perdus. Malheureusement, vous devez réinstaller Briar et créer un nouveau compte en choisissant « Jai oublié mon mot de passe » dans linvite de mot de passe.</string>
<string name="startup_failed_data_too_old_error">Votre compte a été créé avec une ancienne version de cette appli et ne peut pas être ouvert avec cette version. Vous devez soit réinstaller lancienne version, soit créer un nouveau compte en choisissant « Jai oublié mon mot de passe » dans linvite de mot de passe.</string>
<string name="startup_failed_data_too_new_error">Cette version de lappli est trop ancienne. Veuillez passer à la version la plus récente et réessayer.</string>
<string name="startup_failed_data_too_new_error">Cette version de lappli est trop ancienne. Veuillez passer à la version la plus récente et ressayer.</string>
<string name="startup_failed_service_error">Briar na pas pu démarrer un greffon exigé. Réinstaller Briar résout généralement ce problème. Veuillez cependant noter que vous perdrez votre compte et toutes données relatives puisque Briar nutilise pas de serveurs centralisés sur lesquels enregistrer vos données.</string>
<plurals name="expiry_warning">
<item quantity="one">Ceci est une version de test de Briar. Votre compte arrivera à expiration dans %d jour et ne peut pas être renouvelé.</item>
@@ -61,36 +61,10 @@
<string name="lock_button">Verrouiller lappli</string>
<string name="settings_button">Paramètres</string>
<string name="sign_out_button">Déconnexion</string>
<string name="transports_onboarding_text">Touchez ici pour contrôler comment Briar se connecte à vos contacts.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">Votre téléphone a accès à Internet par le Wi-Fi</string>
<string name="tor_device_status_online_mobile">Votre téléphone a accès à Internet par les données mobiles</string>
<string name="tor_device_status_offline">Votre téléphone na pas accès à Internet</string>
<string name="tor_plugin_status_enabling">Briar se connecte à Internet</string>
<string name="tor_plugin_status_active">Briar est connecté à Internet</string>
<string name="tor_plugin_status_inactive">Briar ne peut pas se connecter à Internet</string>
<string name="tor_plugin_status_disabled">Briar est configuré pour ne pas utiliser Internet</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar est configuré pour ne pas utiliser les données mobiles</string>
<string name="tor_plugin_status_disabled_battery">Briar est configuré pour ne pas utiliser Internet si lappareil utilise sa pile</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar est configuré pour ne pas utiliser Internet dans ce pays</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Même réseau Wi-Fi</string>
<string name="lan_device_status_on">Votre téléphone est connecté au Wi-Fi</string>
<string name="lan_device_status_off">Votre téléphone nest pas connecté au Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar se connecte au réseau Wi-Fi</string>
<string name="lan_plugin_status_active">Briar est connecté au réseau Wi-Fi</string>
<string name="lan_plugin_status_inactive">Briar ne peut pas se connecter au réseau Wi-Fi</string>
<string name="lan_plugin_status_disabled">Briar est configuré pour ne pas utiliser le réseau Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Le Bluetooth de votre téléphone est activé</string>
<string name="bt_device_status_off">Le Bluetooth de votre téléphone est désactivé</string>
<string name="bt_plugin_status_enabling">Briar se connecte au Bluetooth</string>
<string name="bt_plugin_status_active">Briar est connecté au Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar ne peut pas se connecter au Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar est configuré pour ne pas utiliser le Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Déconnecté de Briar</string>
<string name="reminder_notification_text">Touchez pour vous reconnecter</string>
@@ -137,13 +111,12 @@
<string name="help">Aide</string>
<string name="sorry">Désolé</string>
<string name="error_start_activity">Nest pas proposée sur votre système.</string>
<string name="status_heading">État :</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Aucun contact à afficher</string>
<string name="no_contacts_action">Touchez licône + pour ajouter un contact</string>
<string name="date_no_private_messages">Aucun message.</string>
<string name="no_private_messages">Aucun message à afficher</string>
<string name="message_hint">Rédigez un message</string>
<string name="message_hint">Rédiger le message</string>
<string name="image_caption_hint">Ajouter une légende (facultatif)</string>
<string name="image_attach">Joindre une image</string>
<string name="image_attach_error">Impossible de joindre une ou des images</string>
@@ -171,7 +144,7 @@
<string name="you">Vous</string>
<string name="save_image">Enregistrer limage</string>
<string name="dialog_title_save_image">Enregistrer limage?</string>
<string name="dialog_message_save_image">Lenregistrement de cette image permettra aux autres applis dy accéder.\n\n Voulez-vous vraiment lenregistrer?</string>
<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>
@@ -189,8 +162,8 @@
<string name="contact_added_toast">Contact ajouté : %s</string>
<string name="contact_already_exists">Le contact %s existe déjà</string>
<string name="qr_code_invalid">Le code QR est invalide</string>
<string name="qr_code_too_old">Le code QR que vous avez balayé provient dune version plus ancienne de %s.\n\nVeuillez demander à votre contact de passer à la version la plus récente et réessayer.</string>
<string name="qr_code_too_new">Le code QR que vous avez balayé provient dune version plus récente de %s.\n\nVeuillez passer à la version la plus récente et réessayer.</string>
<string name="qr_code_too_old">Le code QR que vous avez balayé provient dune version plus ancienne de %s.\n\nVeuillez demander à votre contact de passer à la version la plus récente et ressayer.</string>
<string name="qr_code_too_new">Le code QR que vous avez balayé provient dune version plus récente de %s.\n\nVeuillez passer à la version la plus récente et ressayer.</string>
<string name="camera_error">Erreur de lappareil photo</string>
<string name="connecting_to_device">Connexion à lappareil\u2026</string>
<string name="authenticating_with_device">Autentification avec lappareil\u2026</string>
@@ -227,7 +200,7 @@
<string name="own_link_error">Saisissez le lien de votre contact, pas le vôtre</string>
<string name="nickname_missing">Veuillez saisir un pseudonyme</string>
<string name="invalid_link">Le lien est invalide</string>
<string name="unsupported_link">Ce lien provient dune version plus récente de Briar. Veuillez passer à la version la plus récente et réessayer.</string>
<string name="unsupported_link">Ce lien provient dune version plus récente de Briar. Veuillez passer à la version la plus récente et ressayer.</string>
<string name="intent_own_link">Vous avez ouvert votre propre lien. Utilisez celui du contact que vous souhaitez ajouter.</string>
<string name="missing_link">Veuillez saisir un lien</string>
<!--This is a numeral indicating the first step in a series of screens-->
@@ -266,7 +239,7 @@
<string name="introduction_sent">Votre présentation a été envoyée.</string>
<string name="introduction_error">Une erreur est survenue lors de la présentation.</string>
<string name="introduction_request_sent">Vous avez demandé de présenter %1$s à %2$s.</string>
<string name="introduction_request_received">%1$s a demandé de vous présenter à %2$s. Voulez-vous ajouter %2$s à votre liste de contacts?</string>
<string name="introduction_request_received">%1$s a demandé de vous présenter à %2$s. Souhaitez-vous ajouter %2$s à votre liste de contacts?</string>
<string name="introduction_request_exists_received">%1$s a demandé de vous présenter à %2$s, mais %2$s est déjà dans votre liste de contacts. Puisque %1$s pourrait ne pas le savoir, vous pouvez tout de même répondre :</string>
<string name="introduction_request_answered_received">%1$s a demandé de vous présenter à %2$s.</string>
<string name="introduction_response_accepted_sent">Vous avez accepté dêtre présenté à %1$s.</string>
@@ -424,7 +397,7 @@
<string name="blogs_rss_remove_feed_ok">Supprimer</string>
<string name="blogs_rss_feeds_manage_delete_error">Impossible de supprimer le fil!</string>
<string name="blogs_rss_feeds_manage_empty_state">Aucun fil RSS à afficher\n\nTouchez licône + pour importer un fil</string>
<string name="blogs_rss_feeds_manage_error">Un problème est survenu lors du chargement de vos fils. Veuillez réessayer plus tard.</string>
<string name="blogs_rss_feeds_manage_error">Un problème est survenu lors du chargement de vos fils. Veuillez ressayer plus tard.</string>
<!--Settings Display-->
<string name="pref_language_title">Langue et région</string>
<string name="pref_language_changed">Ce paramètre prendra effet une fois que vous aurez redémarré Briar. Veuillez vous déconnecter et redémarrer Briar.</string>
@@ -559,8 +532,6 @@
<string name="lock_unlock_password">Utiliser un mot de passe</string>
<string name="lock_is_locked">Briar est verrouillée</string>
<string name="lock_tap_to_unlock">Toucher pour déverrouiller</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar peut se connecter à vos contacts par Internet, Wi-Fi ou Bluetooth.\n\nToutes les connections Internet passent par le réseau Tor afin de protéger les données.\n\nSi un contact peut être joint par plusieurs moyens, Briar les utilisera simultanément.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Laurence</string>

View File

@@ -61,36 +61,10 @@
<string name="lock_button">Bloquear App</string>
<string name="settings_button">Axustes</string>
<string name="sign_out_button">Finalizar sesión</string>
<string name="transports_onboarding_text">Toca aquí para controlar o xeito en que Briar conecta cos teus contactos.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">O teu móbil ten acceso a internet por Wi-Fi</string>
<string name="tor_device_status_online_mobile">O teu móbil ten acceso a internet por datos móbiles</string>
<string name="tor_device_status_offline">O teu móbil non ten acceso a internet</string>
<string name="tor_plugin_status_enabling">Briar estase conectando a internet</string>
<string name="tor_plugin_status_active">Briar está conectada a internet</string>
<string name="tor_plugin_status_inactive">Briar non pode conectarse a internet</string>
<string name="tor_plugin_status_disabled">Briar está configurada para non usar internet</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar está configurada para non usar datos móbilies</string>
<string name="tor_plugin_status_disabled_battery">Briar está configurada para non usar internet se está usando batería</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar está configurada para non usar internet neste país</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Mesma rede Wi-Fi</string>
<string name="lan_device_status_on">O móbil está conectado á Wi-Fi</string>
<string name="lan_device_status_off">O móbil non está conectado á Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar está conectando á rede Wi-Fi</string>
<string name="lan_plugin_status_active">Briar está conectada á rede Wi-Fi</string>
<string name="lan_plugin_status_inactive">Briar non pode conectar coa rede Wi-Fi</string>
<string name="lan_plugin_status_disabled">Briar está configurada para non usar a rede Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">O móbil ten o Bluetooth activado</string>
<string name="bt_device_status_off">O móbil ten o Bluetooth desactivado</string>
<string name="bt_plugin_status_enabling">Briar está conectando por Bluetooth</string>
<string name="bt_plugin_status_active">Briar está conectada ó Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar non pode conectar por Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar está configurada para non usar Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Desconectou de Briar</string>
<string name="reminder_notification_text">Toque para voltar a conectar</string>
@@ -137,7 +111,6 @@
<string name="help">Axuda</string>
<string name="sorry">Desculpe</string>
<string name="error_start_activity">Non dispoñible para o teu sistema</string>
<string name="status_heading">Estado</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Sen contactos para amosar</string>
<string name="no_contacts_action">Toque a icona + para engadir un contacto</string>
@@ -436,20 +409,10 @@
<string name="pref_theme_auto">Automático (no día)</string>
<string name="pref_theme_system">Por omisión do sistema</string>
<!--Settings Connections-->
<string name="network_settings_title">Conexións</string>
<string name="bluetooth_setting">Conectar cos contactos vía Bluetooth</string>
<string name="wifi_setting">Conectar cos contactos na mesma rede Wi-Fi</string>
<string name="tor_enable_title">Conectar cos contactos a través de internet</string>
<string name="tor_enable_summary">Todas as conexións a través da rede Tor para ter privacidade</string>
<string name="tor_network_setting">Método de conexión á rede Tor</string>
<string name="tor_network_setting_automatic">Automática baseada na localización</string>
<string name="tor_network_setting_without_bridges">Usar rede Tor sen pontes</string>
<string name="tor_network_setting_with_bridges">Usar rede Tor con pontes</string>
<string name="tor_network_setting_never">Non conectar a internet</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">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 só cando carga batería</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>
@@ -559,8 +522,6 @@
<string name="lock_unlock_password">Utilizar contrasinal</string>
<string name="lock_is_locked">Briar está bloqueada</string>
<string name="lock_tap_to_unlock">Toque para desbloquear</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar pode conectar cos teus contactos a través de Internet, Wi-Fi ou Bluetooth.\n\nTodas as conexións a internet pasan a través da rede Tor para máis privacidade.\n\nSe un contacto é accesible de múltiples xeitos, Briar usaráos en paralelo.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alice</string>

View File

@@ -63,12 +63,10 @@
<string name="lock_button">נעל יישום</string>
<string name="settings_button">הגדרות</string>
<string name="sign_out_button">התנתק</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">אינטרנט</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">שן כחולה</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">נותקת מן Briar</string>
<string name="reminder_notification_text">הקש כדי להתחבר חזרה.</string>
@@ -123,7 +121,6 @@
<string name="help">עזרה</string>
<string name="sorry">סליחה</string>
<string name="error_start_activity">בלתי זמין במערכת שלך</string>
<string name="status_heading">מצב</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">אין אנשי קשר להראות</string>
<string name="no_contacts_action">הקש על הצלמית + כדי להוסיף איש קשר</string>
@@ -549,7 +546,6 @@
<string name="lock_unlock_password">השתמש בסיסמה</string>
<string name="lock_is_locked">Briar נעול</string>
<string name="lock_tap_to_unlock">הקש כדי לבטל נעילה</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">נועה</string>

View File

@@ -57,12 +57,10 @@
<string name="lock_button">लॉक ऐप</string>
<string name="settings_button">सेटिंग्स</string>
<string name="sign_out_button">साइन आउट</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">इंटरनेट</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">वाई - फाई</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">ब्लूटूथ</string>
<string name="transport_lan">वाई - फाई</string>
<!--Notifications-->
<string name="reminder_notification_title">Briar से साइन आउट हो रहा है ...</string>
<string name="reminder_notification_text">वापस साइन इन करने के लिए टैप करें।</string>
@@ -108,7 +106,6 @@
<string name="fix">ठीक कर</string>
<string name="help">सहायता</string>
<string name="sorry">माफ़ कीजिये</string>
<string name="status_heading">स्थिति</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">दिखाने के लिए कोई संपर्क नहीं है</string>
<string name="no_contacts_action">संपर्क जोड़ने के लिए + आइकन टैप करें</string>
@@ -507,7 +504,6 @@
<string name="lock_unlock_password">पासवर्ड का प्रयोग करें</string>
<string name="lock_is_locked">Briar लॉक है</string>
<string name="lock_tap_to_unlock">अनलॉक करने के लिए टैप करें</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">ऐलिस</string>

View File

@@ -61,36 +61,10 @@
<string name="lock_button">App zárolása</string>
<string name="settings_button">Beállítások</string>
<string name="sign_out_button">Kijelentkezés</string>
<string name="transports_onboarding_text">Érintse meg itt, hogy beállíthassa, hogyan csatlakozzon a Tor kapcsolataihoz.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">A telefonja Internet hozzáféréssel rendelkezik Wi-Fi-n keresztül</string>
<string name="tor_device_status_online_mobile">A telefonja Internet hozzáféréssel rendelkezik mobil hálózaton keresztül</string>
<string name="tor_device_status_offline">A telefonja nem rendelkezik Internet hozzáféréssel</string>
<string name="tor_plugin_status_enabling">A Briar csatlakozik az Internethez</string>
<string name="tor_plugin_status_active">A Briar csatlakoztatva az Internethez</string>
<string name="tor_plugin_status_inactive">A Briar nem tud csatlakozni az Internethez</string>
<string name="tor_plugin_status_disabled">A Briar Internet nélküli használatra van beállítva</string>
<string name="tor_plugin_status_disabled_mobile_data">A Briar mobil hálózat nélküli használatra van beállítva</string>
<string name="tor_plugin_status_disabled_battery">A Briar úgy van beállítva, hogy ne használjon Internetet, ha akkumulátorról megy a telefon</string>
<string name="tor_plugin_status_disabled_country_blocked">A Briar úgy van beállítva, hogy ne használjon Internetet ebben az országban</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Azonos Wi-Fi hálózat</string>
<string name="lan_device_status_on">A telefonja Wi-Fi-hez csatlakoztatott.</string>
<string name="lan_device_status_off">A telefonja Wi-Fi-hez nem csatlakoztatott.</string>
<string name="lan_plugin_status_enabling">A Briar csatlakozik a Wi-Fi hálózathoz</string>
<string name="lan_plugin_status_active">A Briar csatlakoztatva a Wi-Fi hálózathoz</string>
<string name="lan_plugin_status_inactive">A Briar nem tud csatlakozni a Wi-Fi hálózathoz</string>
<string name="lan_plugin_status_disabled">A Briar Wi-Fi nélküli használatra van beállítva</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">A telefonja Bluetooth-ja bekapcsolva</string>
<string name="bt_device_status_off">A telefonja Bluetooth-ja kikapcsolva</string>
<string name="bt_plugin_status_enabling">A Briar csatlakozik a Bluetooth-hoz</string>
<string name="bt_plugin_status_active">A Briar csatlakoztatva a Bluetooth-hoz</string>
<string name="bt_plugin_status_inactive">A Briar nem tud csatlakozni a Bluetooth-hoz</string>
<string name="bt_plugin_status_disabled">A Briar Bluetooth nélküli használatra van beállítva</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Kilépve a Briar-ból</string>
<string name="reminder_notification_text">Érintse meg az újra belépéshez.</string>
@@ -137,7 +111,6 @@
<string name="help">Súgó</string>
<string name="sorry">Sajnáljuk</string>
<string name="error_start_activity">Nem elérhető az ön rendszerén</string>
<string name="status_heading">Állapot</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Nincs megjeleníthető kapcsolat</string>
<string name="no_contacts_action">Érintse meg a + gombot kapcsolatok hozzáadásához</string>
@@ -445,19 +418,10 @@ Kapcsolatai, akivel megosztotta ezt a blogot, lehet nem kapnak többé frissít
<string name="pref_theme_system">Rendszer alapértelmezett</string>
<!--Settings Connections-->
<string name="network_settings_title">Kapcsolatok</string>
<string name="bluetooth_setting">Csatlakozás a kapcsolatokhoz Bluetooth-on</string>
<string name="wifi_setting">Csatlakozás az egy Wi-Fi hálózaton lévő kapcsolatokhoz</string>
<string name="tor_enable_title">Csatlakozás a kapcsolatokhoz Interneten</string>
<string name="tor_enable_summary">Minden kapcsolat átmegy a Tor hálózaton az adatvédelem érdekében</string>
<string name="tor_network_setting">Kapcsolódási mód a Tor hálózathoz</string>
<string name="tor_network_setting_automatic">Automatikusan hely alapján</string>
<string name="tor_network_setting_without_bridges">Tor hálózat használata hidak nélkül</string>
<string name="tor_network_setting_with_bridges">Tor hálózat használata hidakkal</string>
<string name="tor_network_setting_never">Ne csatlakozzon az internethez</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">Automatikus: %1$s ( %2$s)</string>
<string name="tor_mobile_data_title">Mobil adat használata</string>
<string name="tor_only_when_charging_title">Csatlakozás az internethez csak töltés alatt</string>
<string name="tor_only_when_charging_summary">Letiltja az internet kapcsolatot, amikor elemről fut az eszköz</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Biztonság</string>
@@ -568,8 +532,6 @@ Vigyázat: Ez végleg törli az identitásait, kapcsolatait és üzeneteit</stri
<string name="lock_unlock_password">Jelszó használata</string>
<string name="lock_is_locked">A Briar zárolt</string>
<string name="lock_tap_to_unlock">Érintse meg a zárolás feloldásához</string>
<!--Connections Screen-->
<string name="transports_help_text">A Briar Interneten, Wi-Fi-n vagy Bluetooth-on keresztül csatlakozhat kapcsolataihoz.\n\nAz összes internetkapcsolat a Tor hálózaton megy keresztül megy az adatvédelem érdekében.\n\nHa egy kapcsolatot több módszerrel is el lehet érni, Briar párhuzamosan használja azokat.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alice</string>

View File

@@ -61,36 +61,10 @@
<string name="lock_button">Læsa forriti</string>
<string name="settings_button">Stillingar</string>
<string name="sign_out_button">Skrá út</string>
<string name="transports_onboarding_text">Ýttu hér til að stýra hvernig Briar tengist tengiliðunum þínum.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">Síminn þinn er með aðgang að internetinu í gegnum Wi-Fi</string>
<string name="tor_device_status_online_mobile">Síminn þinn er með aðgang að internetinu í gegnum farsímagögn</string>
<string name="tor_device_status_offline">Síminn þinn er ekki með aðgang að internetinu</string>
<string name="tor_plugin_status_enabling">Briar er að tengjast við internetið</string>
<string name="tor_plugin_status_active">Briar er tengt við internetið</string>
<string name="tor_plugin_status_inactive">Briar getur ekki tengst við internetið</string>
<string name="tor_plugin_status_disabled">Briar er sett upp til að nota ekki internetið</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar er sett upp til að nota ekki farsímagögn</string>
<string name="tor_plugin_status_disabled_battery">Briar er sett upp til að nota ekki internetið þegar keyrt er á rafhlöðu</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar er sett upp til að nota ekki internetið í þessu landi</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Þráðlaust Wi-Fi net</string>
<string name="transport_lan_long">Sama þráðlausa Wi-Fi netkerfið</string>
<string name="lan_device_status_on">Síminn þinn er tengdur við Wi-Fi</string>
<string name="lan_device_status_off">Síminn þinn er ekki tengdur við Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar er að tengjast við Wi-Fi-netið</string>
<string name="lan_plugin_status_active">Briar er tengt við við Wi-Fi-netið</string>
<string name="lan_plugin_status_inactive">Briar getur ekki tengst við Wi-Fi-netið</string>
<string name="lan_plugin_status_disabled">Briar er sett upp til að nota ekki Wi-Fi-netið</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Kveikt er á Bluetooth-kerfi símans</string>
<string name="bt_device_status_off">Slökkt er á Bluetooth-kerfi símans</string>
<string name="bt_plugin_status_enabling">Briar er að tengjast við Bluetooth</string>
<string name="bt_plugin_status_active">Briar er tengt við Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar getur ekki tengst við Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar er sett upp til að nota ekki Bluetooth</string>
<string name="transport_lan">Þráðlaust Wi-Fi net</string>
<!--Notifications-->
<string name="reminder_notification_title">Skráð út úr Briar</string>
<string name="reminder_notification_text">Ýttu til að skrá þig aftur inn.</string>
@@ -137,7 +111,6 @@
<string name="help">Hjálp</string>
<string name="sorry">Því miður</string>
<string name="error_start_activity">Er ekki tiltækt fyrir kerfið þitt</string>
<string name="status_heading">Staða</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Engir tengiliðir til að birta</string>
<string name="no_contacts_action">Ýttu á + táknið til að bæta við tengilið</string>
@@ -436,29 +409,19 @@
<string name="pref_theme_auto">Sjálfvirkt (eftir tíma dags)</string>
<string name="pref_theme_system">Sjálfgefið í kerfinu</string>
<!--Settings Connections-->
<string name="network_settings_title">Tengingar</string>
<string name="bluetooth_setting">Tengjast tengiliðum í gegnum Bluetooth</string>
<string name="wifi_setting">Tengjast tengiliðum á sama þráðlausa Wi-Fi neti</string>
<string name="tor_enable_title">Tengjast tengiliðum í gegnum internetið</string>
<string name="tor_enable_summary">Allar tengingar fara í gegnum Tor-netið til að vernda persónuupplýsingar</string>
<string name="tor_network_setting">Aðferðir til tengingar við Tor-netið</string>
<string name="tor_network_setting_automatic">Sjálfvirkt byggt á staðsetningu</string>
<string name="tor_network_setting_without_bridges">Nota Tor-netkerfið án brúa</string>
<string name="tor_network_setting_with_bridges">Nota Tor-netkerfið með brúm</string>
<string name="tor_network_setting_never">Ekki tengjast við internetið</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">Sjálfvirkt: %1$s (eftir %2$s)</string>
<string name="tor_mobile_data_title">Nota farsímagagnasamband</string>
<string name="tor_only_when_charging_title">Tengjast í gegnum internetið aðeins þegar verið er í hleðslu</string>
<string name="tor_only_when_charging_summary">Gerir internettengingu óvirka þegar tækið keyrir á rafhlöðu</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Öryggi</string>
<string name="pref_lock_title">Forritslæsing</string>
<string name="pref_lock_summary">Notaðu skjálæsingu tækisins til að vernda Briar á meðan þú ert skráð/ur inn</string>
<string name="pref_lock_disabled_summary">Til að nota þetta þarftu að setja upp skjálæsingu fyrir tækið þitt</string>
<string name="pref_lock_timeout_title">Tímamörk læsingar forrits við aðgerðaleysi</string>
<string name="pref_lock_timeout_title">Tímamörk forritslæsingar við aðgerðaleysi</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Þegar ekki er verið að nota Briar, læsa því sjálfvirkt eftir %s</string>
<string name="pref_lock_timeout_summary">Þehar ekki er verið að nota Briar, læsa því sjálfvirkt eftir %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
<string name="pref_lock_timeout_1">1 mínúta</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -559,8 +522,6 @@
<string name="lock_unlock_password">Nota lykilorð</string>
<string name="lock_is_locked">Briar er læst</string>
<string name="lock_tap_to_unlock">Ýttu til að aflæsa</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar getur tengst við tengiliðina þína í gegnum internet, Wi-Fi eða Bluetooth.\n\nAllar internettengingar fara í gegnum Tor-netkerfið til að gæta gagnaleyndar.\n\nEf hægt er að nálgast tengilið með mörgum leiðum, notar Briar þær samhliða.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Lísa</string>

View File

@@ -61,36 +61,10 @@
<string name="lock_button">Blocca app</string>
<string name="settings_button">Impostazioni</string>
<string name="sign_out_button">Esci</string>
<string name="transports_onboarding_text">Tocca qui per controllare come Briar si connette ai tuoi contatti.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">Il tuo telefono ha accesso internet via Wi-Fi</string>
<string name="tor_device_status_online_mobile">Il tuo telefono ha accesso internet via dati mobili</string>
<string name="tor_device_status_offline">Il tuo telefono non ha accesso internet</string>
<string name="tor_plugin_status_enabling">Briar si sta connettendo a internet</string>
<string name="tor_plugin_status_active">Briar è connesso a internet</string>
<string name="tor_plugin_status_inactive">Briar non riesce a connettersi a internet</string>
<string name="tor_plugin_status_disabled">Briar è configurato per non usare internet</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar è configurato per non usare i dati mobili</string>
<string name="tor_plugin_status_disabled_battery">Briar è configurato per non usare internet quando funziona a batteria</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar è configurato per non usare internet in questa nazione</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Stessa rete Wi-Fi</string>
<string name="lan_device_status_on">Il tuo telefono è connesso al Wi-Fi</string>
<string name="lan_device_status_off">Il tuo telefono non è connesso al Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar si sta connettendo alla rete Wi-Fi</string>
<string name="lan_plugin_status_active">Briar è connesso alla rete Wi-Fi</string>
<string name="lan_plugin_status_inactive">Briar non riesce a connettersi alla rete Wi-Fi</string>
<string name="lan_plugin_status_disabled">Briar è configurato per non usare la rete Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Il Bluetooth del tuo telefono è acceso</string>
<string name="bt_device_status_off">Il Bluetooth del tuo telefono è spento</string>
<string name="bt_plugin_status_enabling">Briar si sta connettendo al Bluetooth</string>
<string name="bt_plugin_status_active">Briar è connesso al Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar non riesce a connettersi al Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar è configurato per non usare il Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Uscito da Briar</string>
<string name="reminder_notification_text">Tocca per riaccedere.</string>
@@ -137,7 +111,6 @@
<string name="help">Aiuto</string>
<string name="sorry">Scusa</string>
<string name="error_start_activity">Non disponibile sul tuo sistema</string>
<string name="status_heading">Stato</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Nessun contatto da mostrare</string>
<string name="no_contacts_action">Tocca l\'icona + per aggiungere un contatto</string>
@@ -437,19 +410,10 @@
<string name="pref_theme_system">Predefinito di sistema</string>
<!--Settings Connections-->
<string name="network_settings_title">Connessioni</string>
<string name="bluetooth_setting">Connetti ai contatti attraverso Bluetooth</string>
<string name="wifi_setting">Connetti ai contatti nella stessa rete Wi-Fi</string>
<string name="tor_enable_title">Connetti ai contatti attraverso internet</string>
<string name="tor_enable_summary">Tutte le connessioni passano attraverso la rete Tor per privacy</string>
<string name="tor_network_setting">Metodo di connessione per la rete Tor</string>
<string name="tor_network_setting_automatic">Automatico basato sulla posizione</string>
<string name="tor_network_setting_without_bridges">Usa la rete Tor senza bridge</string>
<string name="tor_network_setting_with_bridges">Usa la rete Tor con bridge</string>
<string name="tor_network_setting_never">Non connettere a internet</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">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 a internet 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>
@@ -559,8 +523,6 @@
<string name="lock_unlock_password">Usa password</string>
<string name="lock_is_locked">Briar è bloccato</string>
<string name="lock_tap_to_unlock">Tocca per sbloccare</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar può connettersi ai tuoi contatti tramite internet, Wi-Fi o Bluetooth.\n\nTutte le connessioni internet passano attraverso la rete Tor per privacy.\n\nSe un contatto può essere raggiunto con più metodi, Briar li usa in parallelo.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alice</string>

View File

@@ -56,12 +56,10 @@
<string name="lock_button">アプリをロック</string>
<string name="settings_button">設定</string>
<string name="sign_out_button">サインアウト</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">インターネット</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Briarからサインアウト</string>
<string name="reminder_notification_text">タップして再ログインします。</string>
@@ -103,7 +101,6 @@
<string name="fix">修復する</string>
<string name="help">ヘルプ</string>
<string name="sorry">すみません</string>
<string name="status_heading">状態</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">表示する連絡先がありません</string>
<string name="no_contacts_action">「+」アイコンをタップして連絡先を追加</string>
@@ -498,7 +495,6 @@
<string name="lock_unlock_password">パスワードを使用</string>
<string name="lock_is_locked">Briarはロックされています</string>
<string name="lock_tap_to_unlock">タップしてロック解除</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">アリス</string>

View File

@@ -56,12 +56,10 @@
<string name="lock_button">앱 잠그기</string>
<string name="settings_button">설정</string>
<string name="sign_out_button">로그아웃</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">인터넷</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">블루투스</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Briar에서 로그아웃 됨</string>
<string name="reminder_notification_text">눌러서 다시 로그인하세요.</string>
@@ -103,7 +101,6 @@
<string name="fix">고치기</string>
<string name="help">도움</string>
<string name="sorry">죄송합니다</string>
<string name="status_heading">상태</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">저장된 연락처가 없습니다</string>
<string name="no_contacts_action">+ 상징을 눌러서 연락처를 추가하세요</string>
@@ -497,7 +494,6 @@
<string name="lock_unlock_password">비밀번호 사용하기</string>
<string name="lock_is_locked">Briar가 잠겼습니다</string>
<string name="lock_tap_to_unlock">눌러 잠금해제</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">영희</string>

View File

@@ -26,8 +26,6 @@
<!--Login-->
<string name="enter_password">Slaptažodis</string>
<string name="try_again">Neteisingas slaptažodis, bandykite dar kartą</string>
<string name="dialog_title_cannot_check_password">Nepavyksta patikrinti slaptažodžio</string>
<string name="dialog_message_cannot_check_password">Briar nepavyksta patikrinti jūsų slaptažodžio. Norėdami išspręsti šią problemą, pabandykite paleisti įrenginį iš naujo.</string>
<string name="sign_in_button">Prisijungti</string>
<string name="forgotten_password">Aš pamiršau savo slaptažodį</string>
<string name="dialog_title_lost_password">Prarastas slaptažodis</string>
@@ -63,36 +61,10 @@
<string name="lock_button">Užrakinti programėlę</string>
<string name="settings_button">Nustatymai</string>
<string name="sign_out_button">Atsijungti</string>
<string name="transports_onboarding_text">Bakstelėkite čia norėdami valdyti tai, kaip Briar jungiasi prie jūsų adresatų.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internetas</string>
<string name="tor_device_status_online_wifi">Jūsų telefonas jungiasi prie interneto per belaidį (Wi-Fi)</string>
<string name="tor_device_status_online_mobile">Jūsų telefonas jungiasi prie interneto per mobiliuosius duomenis</string>
<string name="tor_device_status_offline">Jūsų telefonas neprisijungęs prie interneto</string>
<string name="tor_plugin_status_enabling">Briar jungiasi prie interneto</string>
<string name="tor_plugin_status_active">Briar yra prisijungusi prie interneto</string>
<string name="tor_plugin_status_inactive">Briar negali prisijungti prie interneto</string>
<string name="tor_plugin_status_disabled">Briar yra sukonfigūruota taip, kad nesinaudotų internetu</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar yra sukonfigūruota taip, kad nesinaudotų mobiliaisiais duomenimis</string>
<string name="tor_plugin_status_disabled_battery">Briar yra sukonfigūruota taip, kad nesinaudotų internetu, kai įrenginys veikia naudodamas akumuliatoriaus energiją</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar yra sukonfigūruota taip, kad šioje šalyje nesinaudotų internetu</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Belaidis (Wi-Fi)</string>
<string name="transport_lan_long">Tas pats belaidis (Wi-Fi) tinklas</string>
<string name="lan_device_status_on">Jūsų telefonas yra prisijungęs prie belaidžio (Wi-Fi)</string>
<string name="lan_device_status_off">Jūsų telefonas nėra prisijungęs prie belaidžio (Wi-Fi)</string>
<string name="lan_plugin_status_enabling">Briar jungiasi prie belaidžio (Wi-Fi) tinklo</string>
<string name="lan_plugin_status_active">Briar yra prisijungusi prie belaidžio (Wi-Fi) tinklo</string>
<string name="lan_plugin_status_inactive">Briar negali prisijungti prie belaidžio (Wi-Fi) tinklo</string>
<string name="lan_plugin_status_disabled">Briar yra sukonfigūruota taip, kad nesinaudotų belaidžiu (Wi-Fi) tinklu</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Jūsų telefono Bluetooth ryšys yra įjungtas</string>
<string name="bt_device_status_off">Jūsų telefono Bluetooth ryšys yra išjungtas</string>
<string name="bt_plugin_status_enabling">Briar jungiasi prie Bluetooth</string>
<string name="bt_plugin_status_active">Briar yra prisijungusi prie Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar negali prisijungti prie Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar yra sukonfigūruota taip, kad nesinaudotų Bluetooth</string>
<string name="transport_lan">Belaidis (Wi-Fi)</string>
<!--Notifications-->
<string name="reminder_notification_title">Atsijungta iš Briar</string>
<string name="reminder_notification_text">Bakstelėkite, norėdami prisijungti atgal.</string>
@@ -147,7 +119,6 @@
<string name="help">Pagalba</string>
<string name="sorry">Atsiprašome</string>
<string name="error_start_activity">Jūsų sistemoje neprieinama</string>
<string name="status_heading">Būsena:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Nėra rodytinų adresatų</string>
<string name="no_contacts_action">Norėdami pridėti adresatą, bakstelėkite + piktogramą</string>
@@ -456,20 +427,10 @@
<string name="pref_theme_auto">Automatinis (Dienos metas)</string>
<string name="pref_theme_system">Sistemos numatytasis</string>
<!--Settings Connections-->
<string name="network_settings_title">Ryšiai</string>
<string name="bluetooth_setting">Jungtis prie adresatų per Bluetooth ryšį</string>
<string name="wifi_setting">Jungtis prie adresatų tame pačiame belaidžiame (Wi-Fi) tinkle</string>
<string name="tor_enable_title">Jungtis prie adresatų per internetą</string>
<string name="tor_enable_summary">Privatumo sumetimais, visi ryšiai jungsis per Tor tinklą</string>
<string name="tor_network_setting">Būdas, kaip jungtis prie Tor tinklo</string>
<string name="tor_network_setting_automatic">Automatiškai pagal buvimo vietą</string>
<string name="tor_network_setting_without_bridges">Naudoti Tor tinklą be tinklų tilto</string>
<string name="tor_network_setting_with_bridges">Naudoti Tor tinklą su tinklų tiltu</string>
<string name="tor_network_setting_never">Neprisijungti prie interneto</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">Automatiškai: %1$s (šalyje %2$s)</string>
<string name="tor_mobile_data_title">Naudoti mobiliuosius duomenis</string>
<string name="tor_only_when_charging_title">Prisijungti prie interneto tik įkraunant įrenginį</string>
<string name="tor_only_when_charging_summary">Išjungia interneto ryšį, kai įrenginys veikia naudodamas akumuliatorių</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Saugumas</string>
@@ -579,8 +540,6 @@
<string name="lock_unlock_password">Naudoti slaptažodį</string>
<string name="lock_is_locked">Briar užrakinta</string>
<string name="lock_tap_to_unlock">Bakstelėkite, norėdami atrakinti</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar gali jungtis prie jūsų adresatų per internetą, belaidį (Wi-Fi) tinklą ar Bluetooth ryšį.\n\nPrivatumo sumetimais, visi ryšiai jungiasi per Tor tinklą.\n\nJei adresatas gali būti pasiekiamas keliais būdais, tuomet Briar naudoja juos lygiagrečiai.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Jurgita</string>

View File

@@ -61,12 +61,10 @@
<string name="lock_button">Заклучи ја апликацијата</string>
<string name="settings_button">Поставки</string>
<string name="sign_out_button">Одјави се</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Интернет</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Одјави се од Briar</string>
<string name="reminder_notification_text">Допрете за да се најавите.</string>
@@ -524,7 +522,6 @@
<string name="lock_unlock_password">Користете лозинка</string>
<string name="lock_is_locked">Briar е заклучен</string>
<string name="lock_tap_to_unlock">Допрете за отклучување</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Жарко</string>

View File

@@ -61,36 +61,10 @@
<string name="lock_button">App vergrendelen</string>
<string name="settings_button">Instellingen</string>
<string name="sign_out_button">Log uit</string>
<string name="transports_onboarding_text">Tik hier om in te stellen hoe Briar een verbinding met je contacten opzet.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">Je apparaat heeft internettoegang via wifi</string>
<string name="tor_device_status_online_mobile">Je apparaat heeft internettoegang via mobiele dataverbinding</string>
<string name="tor_device_status_offline">Je apparaat heeft geen internettoegang</string>
<string name="tor_plugin_status_enabling">Briar is aan het verbinden met internet</string>
<string name="tor_plugin_status_active">Briar is verbonden met het internet</string>
<string name="tor_plugin_status_inactive">Briar kan geen verbinding maken met het internet</string>
<string name="tor_plugin_status_disabled">Briar is geconfigureerd om internet niet te gebruiken</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar is geconfigureerd om mobiele dataverbinding niet te gebruiken</string>
<string name="tor_plugin_status_disabled_battery">Briar is geconfigureerd om het internet niet te gebruiken als apparaat op baterij loopt</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar is geconfigureerd om internet niet te gebruiken in dit land</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wifi</string>
<string name="transport_lan_long">Hetzelfde wifinetwerk</string>
<string name="lan_device_status_on">Je apparaat is verbonden met wifi</string>
<string name="lan_device_status_off">Je apparaat is niet verbonden met wifi</string>
<string name="lan_plugin_status_enabling">Briar is verbinding aan het maken met het wifinetwerk</string>
<string name="lan_plugin_status_active">Briar is verbonden met het wifinetwerk</string>
<string name="lan_plugin_status_inactive">Briar kan geen verbinding maken met het wifinetwerk</string>
<string name="lan_plugin_status_disabled">Briar is geconfigureerd om het wifinetwerk niet te gebruiken</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Bluetooth op je apparaat staat aan</string>
<string name="bt_device_status_off">Bluetooth op je apparaat staat uit</string>
<string name="bt_plugin_status_enabling">Briar is aan het verbinden met bluetooth</string>
<string name="bt_plugin_status_active">Briar is verbonden met bluetooth</string>
<string name="bt_plugin_status_inactive">Briar kan geen verbinding maken met bluetooth</string>
<string name="bt_plugin_status_disabled">Briar is geconfigureerd om bluetooth niet te gebruiken</string>
<string name="transport_lan">Wifi</string>
<!--Notifications-->
<string name="reminder_notification_title">Uitgelogd van Briar</string>
<string name="reminder_notification_text">Tik om opnieuw in te loggen.</string>
@@ -137,7 +111,6 @@
<string name="help">Help</string>
<string name="sorry">Excuses</string>
<string name="error_start_activity">Onbeschikbaar op jouw systeem</string>
<string name="status_heading">Status:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Er zijn geen contacten om te tonen</string>
<string name="no_contacts_action">Tik op het +-icoon om een contact toe te voegen</string>
@@ -163,7 +136,7 @@
<string name="dialog_message_not_deleted_not_all_selected_both">Om een uitnodiging of introductie te verwijderen met je het verzoek en het antwoord selecteren.</string>
<string name="dialog_message_not_deleted_not_all_selected_introductions">Om een introductie te verwijderen met je het verzoek en het antwoord selecteren.</string>
<string name="dialog_message_not_deleted_not_all_selected_invitations">Om een uitnodiging te verwijderen met je het verzoek en het antwoord selecteren.</string>
<string name="delete_contact">Verwijder contact</string>
<string name="delete_contact">Verwijder bericht</string>
<string name="dialog_title_delete_contact">Bevestig verwijderen contact</string>
<string name="dialog_message_delete_contact">Weet je zeker dat je dit contact en alle berichten die met dit contact zijn uitgewisseld wil verwijderen?</string>
<string name="contact_deleted_toast">Contact is verwijderd</string>
@@ -437,19 +410,10 @@
<string name="pref_theme_system">Systeemstandaard</string>
<!--Settings Connections-->
<string name="network_settings_title">Verbindingen</string>
<string name="bluetooth_setting">Verbind met contacten via bluetooth</string>
<string name="wifi_setting">Verbind met contacten over hetzelfde wifinetwerk</string>
<string name="tor_enable_title">Verbind met contactenover het internet</string>
<string name="tor_enable_summary">Alle verbindingen gaan door het Tornetwerk voor privacy</string>
<string name="tor_network_setting">Verbindingsmethose voor Tornetwerk</string>
<string name="tor_network_setting_automatic">Automatisch gebaseerd op locatie</string>
<string name="tor_network_setting_without_bridges">Gebruikt Tornetwerk zonder bridges</string>
<string name="tor_network_setting_with_bridges">Gebruik Tornetwerk met bridges</string>
<string name="tor_network_setting_never">Verbind niet met het internet</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">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 alleen met het internet 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>
@@ -546,9 +510,9 @@
<string name="permission_camera_title">Cameratoestemming</string>
<string name="permission_camera_request_body">Om de QR-code te scannen moet Briar toegang hebben tot de camera.</string>
<string name="permission_location_title">Toegang tot locatie</string>
<string name="permission_location_request_body">Om bluetoothapparaten te ontdekken heeft Briar toestemming nodig tot je locatie.\n\nBriar slaat je locatie niet op en deelt het met niemand.</string>
<string name="permission_location_request_body">Om Bluetooth-apparaten te ontdekken heeft Briar toestemming nodig tot je locatie.\n\nBriar slaat je locatie niet op en deelt het met niemand.</string>
<string name="permission_camera_location_title">Camera en locatie</string>
<string name="permission_camera_location_request_body">Om de QR-code in te scannen heeft Briar toegang nodig tot de camera.\n\nOm bluetoothapparaten te ontdekken heeft Briar toestemming nodig tot je locatie.\n\nBriar slaat je locatie niet op en deelt het met niemand.</string>
<string name="permission_camera_location_request_body">Om de QR-code in te scannen heeft Briar toegang nodig tot de camera.\n\nOm Bluetooth-apparaten te ontdekken heeft Briar toestemming nodig tot je locatie.\n\nBriar slaat je locatie niet op en deelt het met niemand.</string>
<string name="permission_camera_denied_body">Je hebt toegang tot de camera niet vrijgegeven, terwijl het toevoegen van contacten de camera nodig heeft.\n\nOverweeg alsjeblieft toegang vrij te geven.</string>
<string name="qr_code">QR-code</string>
<string name="show_qr_code_fullscreen">Toon QR-code op volledig scherm</string>
@@ -559,8 +523,6 @@
<string name="lock_unlock_password">Gebruik Wachtwoord</string>
<string name="lock_is_locked">Briar is vergrendeld</string>
<string name="lock_tap_to_unlock">Tik om te ontgrendelen</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar kan met je contacten verbinden via het internet, wifi of bluetooth.\n\nAlle internetverbindingen gaan voor privacy door het Tornetwerk.\n\nAls een contact via meerdere methoden te bereiken is, zal Briar die parallel gebruiken.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Veerle</string>

View File

@@ -63,12 +63,10 @@ Volètz suprimir vòstre compte e ne crear un nòu?\n
<string name="lock_button">Verrolhar laplicacion</string>
<string name="settings_button">Paramètres</string>
<string name="sign_out_button">Se desconnectar</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wifi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Wifi</string>
<!--Notifications-->
<string name="reminder_notification_title">Desconnectat de Briar</string>
<string name="reminder_notification_text">Tocatz per vos desconnectar</string>
@@ -528,7 +526,6 @@ parteja pas amb degun.</string>
<string name="lock_unlock_password">Utilizar lo senhal</string>
<string name="lock_is_locked">Briar es verrolhat</string>
<string name="lock_tap_to_unlock">Tocatz per desverrolhar</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alicia</string>

View File

@@ -59,12 +59,10 @@
<string name="lock_button">Zablokuj Aplikację</string>
<string name="settings_button">Ustawienia</string>
<string name="sign_out_button">Wyloguj się</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Wylogowano z Briar</string>
<string name="reminder_notification_text">Dotknij, aby zalogować się ponownie</string>
@@ -118,7 +116,6 @@
<string name="fix">Napraw</string>
<string name="help">Pomoc</string>
<string name="sorry">Przepraszam</string>
<string name="status_heading">Status</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Brak kontaktów do pokazania</string>
<string name="no_contacts_action">Dotknij ikonki + aby dodać kontakt</string>
@@ -529,7 +526,6 @@
<string name="lock_unlock_password">Użyj hasła</string>
<string name="lock_is_locked">Briar jest zablokowany</string>
<string name="lock_tap_to_unlock">Dotknij by odblokować</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alicja</string>

View File

@@ -61,13 +61,10 @@
<string name="lock_button">Bloquear Aplicativo</string>
<string name="settings_button">Configurações</string>
<string name="sign_out_button">Sair</string>
<string name="transports_onboarding_text">Clique aqui para controlar como o Briar se conecta aos seus contatos.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Wi-fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Saiu do Briar</string>
<string name="reminder_notification_text">Toque para fazer login novamente.</string>
@@ -114,7 +111,6 @@
<string name="help">Ajuda</string>
<string name="sorry">Sentimos muito</string>
<string name="error_start_activity">Indisponível no seu sistema</string>
<string name="status_heading">Status:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Sem contatos para exibir</string>
<string name="no_contacts_action">Toque no ícone + para adicionar um contato</string>
@@ -527,7 +523,6 @@
<string name="lock_unlock_password">Usar senha</string>
<string name="lock_is_locked">O Briar está desbloqueado</string>
<string name="lock_tap_to_unlock">Toque para desbloquear</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alice</string>

View File

@@ -2,7 +2,7 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Setup-->
<string name="setup_title">Bine ați venit la Briar</string>
<string name="setup_name_explanation">Numele dumneavoastră va fi afișat lângă orice conținut trimis. Nu îl veți putea schimba după crearea contului.</string>
<string name="setup_name_explanation">Numele dumneavoastră va fi afișat lângă orice conținut trimiteți. Nu îl veți putea schimba după crearea contului.</string>
<string name="setup_next">Următorul</string>
<string name="setup_password_intro">Alegeți o parolă</string>
<string name="setup_password_explanation">Contul dvs. Briar este stocat criptat pe dispozitiv, nu în cloud. Dacă vă uitați parola sau ștergeți Briar, nu veți putea să vă recuperați contul.\n\nAlegeți o parolă lungă greu de ghicit, de exemplu, patru cuvinte aleatorii sau zece litere, numere și simboluri aleatoare.</string>
@@ -21,7 +21,7 @@
<string name="don_t_ask_again">Nu mai întreba din nou</string>
<string name="setup_huawei_text">Vă rugăm să apăsați butonul de mai jos și să vă asigurați că Briar este marcat ca protejat în fereastra de \"Aplicații protejate\".</string>
<string name="setup_huawei_button">Protejează Briar</string>
<string name="setup_huawei_help">Dacă Briar nu este adăugat în lista de aplicații protejate, nu va fi capabil să ruleze în fundal.</string>
<string name="setup_huawei_help">Dacă Briar nu este adăugat în lista de aplicații protejate, nu v-a fi capabil să ruleze în fundal.</string>
<string name="warning_dozed">%s nu poate rula în fundal</string>
<!--Login-->
<string name="enter_password">Parola</string>
@@ -32,8 +32,8 @@
<string name="forgotten_password">Am uitat parola</string>
<string name="dialog_title_lost_password">Parolă uitată</string>
<string name="dialog_message_lost_password">Contul dvs. Briar este stocat criptat pe dispozitiv, nu în cloud. Dacă vă uitați parola sau ștergeți Briar, nu veți putea să vă recuperați contul. Doriți să vă ștergeți contul și să începeți din nou?\n\nAtenție: identitățile, contactele și mesajele dvs. vor fi pierdute definitiv.</string>
<string name="startup_failed_notification_title">Briar nu a putut fi pornit</string>
<string name="startup_failed_notification_text">Atingeți pentru informații suplimentare.</string>
<string name="startup_failed_notification_title">Briar nu a putut pornii</string>
<string name="startup_failed_notification_text">Atingeți pentru informații suplimentare</string>
<string name="startup_failed_activity_title">Eroare de pornire Briar</string>
<string name="startup_failed_db_error">Din anumite motive, baza dvs. de date Briar este deteriorată fără vreo posibilitate de a o recupera. Contul dvs., datele dvs. și toate persoanele de contact sunt pierdute. Din nefericire, trebuie să reinstalați Briar sau să creați un nou cont, selectând \"Am uitat parola\" la promptul de parolă.</string>
<string name="startup_failed_data_too_old_error">Contul dvs. a fost creat cu o versiune veche a acestei aplicații și nu poate fi deschis cu această versiune. Trebuie fie să reinstalați versiunea veche, fie să configurați un nou cont, selectând \"Am uitat parola\" la solicitarea de a introduce parola.</string>
@@ -42,7 +42,7 @@
<plurals name="expiry_warning">
<item quantity="one">Aceasta este o versiune de test pentru Briar. Contul dumneavoastră va expira în %d zi și nu se poate reînnoi</item>
<item quantity="few">Aceasta este o versiune de test pentru Briar. Contul dumneavoastră va expira în %d zile și nu se poate reînnoi.</item>
<item quantity="other">Aceasta este o versiune de test pentru Briar. Contul dumneavoastră va expira în %d zile și nu poate fi reînnoit.</item>
<item quantity="other">Aceasta este o versiune de test pentru Briar. Contul dumneavoastră va expira în %d de zile și nu se poate reînnoi.</item>
</plurals>
<string name="expiry_date_reached">Acest program a expirat.\nVă mulțumim că l-ați testat!</string>
<string name="download_briar">Pentru a putea să utilizați Briar în continuare, vă rugăm să descărcați ultima versiune.</string>
@@ -62,36 +62,10 @@
<string name="lock_button">Blochează aplicația</string>
<string name="settings_button">Setări</string>
<string name="sign_out_button">Ieșire</string>
<string name="transports_onboarding_text">Atingeți aici pentru a controla modul în care Briar se conectează la contacte</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">Telefonul are acces la internet prin Wi-Fi</string>
<string name="tor_device_status_online_mobile">Telefonul are acces la internet prin date mobile</string>
<string name="tor_device_status_offline">Telefonul nu are acces la internet</string>
<string name="tor_plugin_status_enabling">Briar se conectează la internet</string>
<string name="tor_plugin_status_active">Briar este conectat la internet</string>
<string name="tor_plugin_status_inactive">Briar nu se poate conecta la internet</string>
<string name="tor_plugin_status_disabled">Briar este configurat să nu se conecteze la internet</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar este configurat să nu folosească date mobile</string>
<string name="tor_plugin_status_disabled_battery">Briar este configurat să nu folosească internetul când utilizează bateria</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar este configurat să nu folosească internetul în această țară</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Aceeași rețea Wi-Fi</string>
<string name="lan_device_status_on">Telefonul este conectat la Wi-Fi</string>
<string name="lan_device_status_off">Telefonul nu este conectat la Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar se conectează la rețeaua Wi-Fi</string>
<string name="lan_plugin_status_active">Briar este conectat la rețeaua Wi-Fi</string>
<string name="lan_plugin_status_inactive">Briar nu se poate conecta la rețeaua Wi-Fi</string>
<string name="lan_plugin_status_disabled">Briar este configurat să nu folosească rețeaua Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Telefonul are Bluetooth pornit</string>
<string name="bt_device_status_off">Telefonul nu are Bluetooth pornit</string>
<string name="bt_plugin_status_enabling">Briar se conectează la Bluetooth</string>
<string name="bt_plugin_status_active">Briar este conectat la Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar nu se poate conecta la Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar este configurat să nu folosească Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Ieșire din Briar</string>
<string name="reminder_notification_text">Atingeți pentru autentificare.</string>
@@ -102,28 +76,28 @@
<plurals name="private_message_notification_text">
<item quantity="one">Mesaj privat nou.</item>
<item quantity="few">%d mesaje private noi.</item>
<item quantity="other">%d mesaje private noi.</item>
<item quantity="other">%d de mesaje private noi.</item>
</plurals>
<plurals name="group_message_notification_text">
<item quantity="one">Mesaj nou de grup.</item>
<item quantity="few">%d mesaje de grup noi.</item>
<item quantity="other">%d mesaje de grup noi.</item>
<item quantity="other">%d de mesaje de grup noi.</item>
</plurals>
<plurals name="forum_post_notification_text">
<item quantity="one">Un nou mesaj pe forum.</item>
<item quantity="few">%d mesaje noi pe forum.</item>
<item quantity="other">%d mesaje noi pe forum.</item>
<item quantity="other">%d de mesaje noi pe forum.</item>
</plurals>
<plurals name="blog_post_notification_text">
<item quantity="one">Un nou mesaj pe blog.</item>
<item quantity="few">%d mesaje noi pe blog.</item>
<item quantity="other">%d mesaje noi pe blog.</item>
<item quantity="other">%d de mesaje noi pe blog.</item>
</plurals>
<!--Misc-->
<string name="now">acum</string>
<string name="show">Arată</string>
<string name="hide">Ascunde</string>
<string name="ok">OK</string>
<string name="ok">Bine</string>
<string name="cancel">Anulează</string>
<string name="got_it">Am înțeles</string>
<string name="delete">Șterge</string>
@@ -137,17 +111,16 @@
<string name="no_data">Fără date</string>
<string name="ellipsis"></string>
<string name="text_too_long">Textul introdus este prea lung</string>
<string name="show_onboarding">Arată fereastra de ajutor</string>
<string name="show_onboarding">Arata fereastra de ajutor</string>
<string name="fix">Rezolvă</string>
<string name="help">Ajutor</string>
<string name="sorry">Ne pare rău</string>
<string name="error_start_activity">Indisponibil pentru sistemul dumneavoastră</string>
<string name="status_heading">Status:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Niciun contact de arătat</string>
<string name="no_contacts">Nici un contact de arătat</string>
<string name="no_contacts_action">Atingeți iconița + pentru a adăuga un contact</string>
<string name="date_no_private_messages">Fără mesaje.</string>
<string name="no_private_messages">Niciun mesaj de arătat</string>
<string name="no_private_messages">Nici un mesaj de arătat</string>
<string name="message_hint">Scrieți mesajul</string>
<string name="image_caption_hint">Adaugă un subtitlu (opțional)</string>
<string name="image_attach">Atașează imagine</string>
@@ -569,8 +542,6 @@
<string name="lock_unlock_password">Folosește parola</string>
<string name="lock_is_locked">Briar este blocat</string>
<string name="lock_tap_to_unlock">Atingeți pentru a debloca</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar se poate conecta la contactele dumneavoastră prin internet, Wi-Fi sau Bluetooth.\n\nToate conexiunile la internet trec prin rețeaua Tor din motive de confidențialitate.\n\nDacă un contact poate fi accesat prin metode multiple, Briar le va folosi în mod paralel.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alice</string>

View File

@@ -65,36 +65,10 @@
<string name="lock_button">Заблокировать приложение</string>
<string name="settings_button">Настройки</string>
<string name="sign_out_button">Выйти</string>
<string name="transports_onboarding_text">Нажмите здесь, чтобы проверить, как Briar подключается к вашим контактам.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Интернет</string>
<string name="tor_device_status_online_wifi">Ваш телефон имеет доступ в интернет через Wi-Fi</string>
<string name="tor_device_status_online_mobile">Ваш телефон имеет доступ в интернет через мобильную сеть.</string>
<string name="tor_device_status_offline">Ваш телефон не имеет доступа в интернет</string>
<string name="tor_plugin_status_enabling">Briar подключается к интернету</string>
<string name="tor_plugin_status_active">Briar подключен к интернету</string>
<string name="tor_plugin_status_inactive">Briar не может подключиться к интернету.</string>
<string name="tor_plugin_status_disabled">Briar настроен не использовать интернет</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar настроен не использовать мобильную сеть</string>
<string name="tor_plugin_status_disabled_battery">Briar настроен не использовать интернет при работе от батареи</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar настроен не использовать интернет в этой стране</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Та же сеть Wi-Fi</string>
<string name="lan_device_status_on">Ваш телефон подключен к Wi-Fi</string>
<string name="lan_device_status_off">Телефон не подключен к Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar подключается к сети Wi-Fi</string>
<string name="lan_plugin_status_active">Briar подключен к сети Wi-Fi</string>
<string name="lan_plugin_status_inactive">Briar не может подключиться к сети Wi-Fi.</string>
<string name="lan_plugin_status_disabled">Briar настроен не использовать сеть Wi-Fi.</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Bluetooth вашего телефона включен.</string>
<string name="bt_device_status_off">Bluetooth вашего телефона отключен.</string>
<string name="bt_plugin_status_enabling">Briar подключается к Bluetooth</string>
<string name="bt_plugin_status_active">Briar подключен к Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar не может подключиться к Bluetooth.</string>
<string name="bt_plugin_status_disabled">Briar настроен не использовать Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Вы не авторизованы в Briar</string>
<string name="reminder_notification_text">Нажмите для входа</string>
@@ -149,7 +123,6 @@
<string name="help">Помощь</string>
<string name="sorry">Сожалеем</string>
<string name="error_start_activity">Недоступно для вашей системы</string>
<string name="status_heading">Статус:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Нет контактов для отображения</string>
<string name="no_contacts_action">Для добавления контакта нажмите значок +</string>
@@ -223,7 +196,7 @@
<string name="add_contact_choose_nickname">Выберите ник</string>
<string name="add_contact_choose_a_nickname">Введите ник</string>
<string name="nickname_intro">Дайте вашему контакту ник. Увидеть его сможете только вы.</string>
<string name="your_link">Передайте эту ссылку контакту, который вы хотите добавить.</string>
<string name="your_link">Передайте эту ссылку контакту, которого вы хотите добавить.</string>
<string name="link_clip_label">Ссылка Briar</string>
<string name="link_copied_toast">Ссылка скопирована</string>
<string name="adding_contact_error">При добавлении контакта произошла ошибка.</string>
@@ -458,20 +431,10 @@
<string name="pref_theme_auto">Авто (День)</string>
<string name="pref_theme_system">Системные настройки</string>
<!--Settings Connections-->
<string name="network_settings_title">Подключения</string>
<string name="bluetooth_setting">Подключение к контактам через Bluetooth</string>
<string name="wifi_setting">Подключение к контактам в той же сети Wi-Fi</string>
<string name="tor_enable_title">Подключение к контактам через интернет</string>
<string name="tor_enable_summary">Все соединения проходят через сеть Tor для обеспечения конфиденциальности</string>
<string name="tor_network_setting">Способ подключения для сети Tor</string>
<string name="tor_network_setting_automatic">Автоматически на основе местоположения</string>
<string name="tor_network_setting_without_bridges">Использовать сеть Tor без мостов</string>
<string name="tor_network_setting_with_bridges">Использовать сеть Tor с мостами</string>
<string name="tor_network_setting_never">Не подключаться к интернету</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">Автоматически: %1$s (%2$s)</string>
<string name="tor_mobile_data_title">Использовать мобильные данные</string>
<string name="tor_only_when_charging_title">Подключаться к интернету только во время зарядки</string>
<string name="tor_only_when_charging_summary">Отключение интернет-соединения, при работе устройства от батареи</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Безопасность</string>
@@ -581,8 +544,6 @@
<string name="lock_unlock_password">Использовать пароль</string>
<string name="lock_is_locked">Briar заблокирован</string>
<string name="lock_tap_to_unlock">Нажмите для разблокировки</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar может подключаться к контактам через интернет, Wi-Fi или Bluetooth.\n\nВсе интернет-соединения проходят через сеть Tor для обеспечения конфиденциальности.\n\nЕсли с контактом можно связаться несколькими способами, Briar использует их параллельно.</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>

View File

@@ -61,36 +61,10 @@
<string name="lock_button">Kyçe Aplikacionin</string>
<string name="settings_button">Rregullime</string>
<string name="sign_out_button">Dilni</string>
<string name="transports_onboarding_text">Prekkeni këtu që të kontrolloni se si lidhet Briar-i me kontaktet tuaja.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">Telefoni juaj mund të përdorë Internet përmes Wi-Fi</string>
<string name="tor_device_status_online_mobile">Telefoni juaj mund të përdorë Internet përmes të dhënash pakete celulari</string>
<string name="tor_device_status_offline">Telefoni juaj smund të përdorë Internet</string>
<string name="tor_plugin_status_enabling">Briar-i po lidhet me Internetin</string>
<string name="tor_plugin_status_active">Briar-i është lidhur me Internetin</string>
<string name="tor_plugin_status_inactive">Briar-i smund të lidhet me Internetin</string>
<string name="tor_plugin_status_disabled">Briar-i është formësuar të mos përdorë Internet</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar-i është formësuar të mos përdorë të dhëna pakete celulari</string>
<string name="tor_plugin_status_disabled_battery">Briar-i është formësuar të mos përdorë Internet, kur xhiron me bateri</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar-i është formësuar të mos përdorë Internet në këtë vend</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Po atë rrjet Wi-Fi</string>
<string name="lan_device_status_on">Telefoni juaj është lidhur me Wi-Fi</string>
<string name="lan_device_status_off">Telefoni juaj sështë lidhur me Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar-i po lidhet me rrjetin Wi-Fi</string>
<string name="lan_plugin_status_active">Briar-i është lidhur me rrjetin Wi-Fi</string>
<string name="lan_plugin_status_inactive">Briar-i smund të lidhet dot me rrjetin Wi-Fi</string>
<string name="lan_plugin_status_disabled">Briar-i është formësuar të mos përdorë rrjetin Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Bluetooth-i i telefonit tuaj është i hapur</string>
<string name="bt_device_status_off">Bluetooth-i i telefonit tuaj është i mbyllur</string>
<string name="bt_plugin_status_enabling">Briar-i po lidhet me Bluetooth</string>
<string name="bt_plugin_status_active">Briar-i është lidhur me Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar-i smund të lidhet me Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar-i është formësuar të mos përdorë Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">U dol nga Briar-i</string>
<string name="reminder_notification_text">Prekeni që të ribëhet hyrja.</string>
@@ -137,7 +111,6 @@
<string name="help">Ndihmë</string>
<string name="sorry">Na ndjeni</string>
<string name="error_start_activity">Jo i passhëm në sistemin tuaj</string>
<string name="status_heading">Gjëndja</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Ska kontakte për shfaqje</string>
<string name="no_contacts_action">Prekni ikonën + që të shtoni një kontakt</string>
@@ -559,11 +532,6 @@
<string name="lock_unlock_password">Përdor Fjalëkalim</string>
<string name="lock_is_locked">Briar-i është i kyçur</string>
<string name="lock_tap_to_unlock">Prekeni që të shkyçet</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar-i mund të lidhet me kontaktet tuaja përmes Interneti, Wi-Fi ose Bluetooth-i.\n\n
Për privatësi, krejt lidhjet Internet kalojnë përmes rrjetit Tor.\n\n
Nëse me një kontakt mund të bëhet lidhja përmes metodash të shumta,\n\n
Briar-i i përdor ato paralelisht.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Mira</string>

View File

@@ -61,36 +61,10 @@
<string name="lock_button">Lås appen</string>
<string name="settings_button">Inställningar</string>
<string name="sign_out_button">Logga ut</string>
<string name="transports_onboarding_text">Klicka här för att styra hur Briar ansluter till dina kontakter.</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">Din telefon har internetåtkomst via Wi-Fi</string>
<string name="tor_device_status_online_mobile">Din telefon har internetåtkomst via mobildata</string>
<string name="tor_device_status_offline">Din telefon har inte internetåtkomst</string>
<string name="tor_plugin_status_enabling">Briar ansluter till internet</string>
<string name="tor_plugin_status_active">Briar är anslutet till internet</string>
<string name="tor_plugin_status_inactive">Briar kan inte ansluta till internet</string>
<string name="tor_plugin_status_disabled">Briar är inte konfigurerat för att använda internet</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar är konfigurerat så att de inte använder mobildata</string>
<string name="tor_plugin_status_disabled_battery">Briar är konfigurerat att inte använda internet vid batterianvändning</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar är konfigurerat att inte använda internet i detta landet</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Samma Wi-Fi-nätverk</string>
<string name="lan_device_status_on">Din telefon är ansluten till Wi-Fi</string>
<string name="lan_device_status_off">Din telefon är inte ansluten till Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar ansluter till Wi-Fi-nätverket</string>
<string name="lan_plugin_status_active">Briar är anslutet till Wi-Fi nätverket</string>
<string name="lan_plugin_status_inactive">Briar kan inte ansluta till Wi-Fi-nätverket</string>
<string name="lan_plugin_status_disabled">Briar är konfigurerat för att inte använda Wi-Fi-nätverket</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Din telefons Bluetooth är aktiverad</string>
<string name="bt_device_status_off">Din telefons Bluetooth är inaktiverad</string>
<string name="bt_plugin_status_enabling">Briar ansluter till Bluetooth</string>
<string name="bt_plugin_status_active">Briar är ansluten till Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar kan inte ansluta till Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar är konfigurerat för att inte använda Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Utloggad från Briar</string>
<string name="reminder_notification_text">Tryck för att logga in igen.</string>
@@ -137,7 +111,6 @@
<string name="help">Hjälp</string>
<string name="sorry">Tyvärr</string>
<string name="error_start_activity">Otillgänglig på ditt system</string>
<string name="status_heading">Status</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Inga kontakter</string>
<string name="no_contacts_action">Tryck på plus-ikonen (+) för att lägga till en kontakt</string>
@@ -436,20 +409,10 @@
<string name="pref_theme_auto">Automatisk (dagtid)</string>
<string name="pref_theme_system">Systemets förval</string>
<!--Settings Connections-->
<string name="network_settings_title">Anslutningar</string>
<string name="bluetooth_setting">Anslut till kontakter via Bluetooth</string>
<string name="wifi_setting">Anslut till kontakter på samma Wi-Fi-nätverk</string>
<string name="tor_enable_title">Anslut till kontakter via internet</string>
<string name="tor_enable_summary">Alla anslutningar gå via Tor-nätverket av integritetsskäl</string>
<string name="tor_network_setting">Anslutningsmetod för Tor-nätverket</string>
<string name="tor_network_setting_automatic">Automatisk, baserad på position</string>
<string name="tor_network_setting_without_bridges">Använd Tor-nätverket utan bryggor</string>
<string name="tor_network_setting_with_bridges">Anvädn Tor-nätverket med bryggor</string>
<string name="tor_network_setting_never">Anslut inte till internet</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">Automatisk: %1$s (i %2$s)</string>
<string name="tor_mobile_data_title">Använd mobildata</string>
<string name="tor_only_when_charging_title">Anslut till internet endast vid laddning</string>
<string name="tor_only_when_charging_summary">Avaktiverar anslutning över Internet när enheten går på batteri</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Säkerhet</string>
@@ -559,8 +522,6 @@
<string name="lock_unlock_password">Använd lösenord</string>
<string name="lock_is_locked">Briar är låst</string>
<string name="lock_tap_to_unlock">Tryck för att låsa upp</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar kan ansluta till dina kontakter via internet, Wi-Fi eller Bluetooth.\n\nAlla internetanslutningar går via Tor-nätverket av integritetsskäl.\n\nOm en kontakt kan nås via flera metoder kommer Briar att använda dem parallellt.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alice</string>

View File

@@ -5,100 +5,65 @@
<string name="setup_name_explanation">lakabu lako litaonekana kwenye kila chapisho lako . Na hutaweza badilisha baada ya kuteneneza akaunti yako .</string>
<string name="setup_next">Ifuatayo</string>
<string name="setup_password_intro">Chagua neno siri </string>
<string name="setup_password_explanation">Akaunti yako ya Briar imeifaziwa katika msimbo fiche kwenye kifaa chako ,nasio kwenye mawingu. Kama utasahau nywila yako au kuondoa Briar, hamana namna unaweza kuokua akaunti yako . \n\nchagua nywila ndefu ambayo ni ngumu kubuniwa , kama maneno mannne ya nasibu, au kumi ya barua za nasibu, namba na herufi.</string>
<string name="setup_doze_title">Uhusiano wa nyuma</string>
<string name="setup_doze_intro">Kupokea ujumbe kwenye Briar unaitajika uwe umeunganishwa kwenye mkondo.</string>
<string name="setup_doze_explanation">li kupokea ujumbe , Briar unatakiwa uwe umeunganishwa kwenye mkongo kwa nyuma . Tafadhali tengua uboreshaji wa betri ili Briar iendele kuunganishwa.</string>
<string name="setup_doze_button">Ruhusa kuunganishwa </string>
<string name="choose_nickname">Chagua lakabu yako</string>
<string name="choose_password">Chagua nywila yako .</string>
<string name="confirm_password">Hakikisha nenosiri lako
</string>
<string name="name_too_long">Jina ni refu sana .</string>
<string name="password_too_weak">Nywila yako ni dhaifu
</string>
<string name="passwords_do_not_match">
Nenosiri zako haziendani </string>
<string name="create_account_button">Tengeneza akaunti</string>
<string name="more_info">Habari za ziada </string>
<string name="don_t_ask_again">Usiulize tena </string>
<string name="setup_password_explanation">Akaunti yako ya Briar imeifaziwa katika msimbo fiche kwenye kifaa chako ,nasio kwenye mawingu. kama utasahau nywila yako au kuondoa Briar, hamana namna unaweza kuokua akaunti yako . \n\nchagua nywila ndefu ambayo ni ngumu kubuniwa , kama maneno mannne ya nasibu, au kumi ya barua za nasibu, namba na herufi.</string>
<string name="setup_doze_title">uhusiano wa nyuma</string>
<string name="setup_doze_intro">kupokea ujumbe kwenye Briar unaitajika uwe umeunganishwa kwenye mkondo </string>
<string name="setup_doze_explanation">ili kupokea ujumbe , Briar unatakiwa uwe umeunganishwa kwenye mkongo kwa nyuma . Tafathali tengua oboreshaji wa betri ili Briar iendele kuunganishwa.</string>
<string name="setup_doze_button">ruhusa kuunganishwa </string>
<string name="choose_nickname">chagua lakabu yako</string>
<string name="choose_password">chagua Nywila yako
chagua nenosiri lako </string>
<string name="confirm_password">hakikisha Nywila yako
hakikisha nenosiri lako </string>
<string name="name_too_long">jina ni refu sana </string>
<string name="password_too_weak">Nywila yako ni thahifu
nenosiri lako ni thahifu</string>
<string name="passwords_do_not_match">nywila zako haziendani
nenosiri zako haziendani </string>
<string name="create_account_button">tengeneza akauntu</string>
<string name="more_info">habari za ziada </string>
<string name="don_t_ask_again">usiulize tena </string>
<string name="setup_huawei_text">tafathali bonyeza alama hapo chini ili kuhakikisha Briar imelindwa na \"programu Ulizi\" kwenye kioo chako </string>
<string name="setup_huawei_button">Linda Briar </string>
<string name="setup_huawei_help">
Kama Briar haija wekwa kwenye orotha programu ulizi, haitaweza kufanya kazi kwenye nyuma ya mkongo</string>
<string name="setup_huawei_help">kama Briar haija wekwa kwenye orotha programu Ulizi, haitaweza kufanya kazi kwenye nyuma ya mkongo</string>
<string name="warning_dozed">%shaijawezekana kujiendesha kwa nyuma ya mkongo</string>
<!--Login-->
<string name="enter_password">Nywila
nenosiri</string>
<string name="try_again">Umekosea nywila , jaribu tena
Umekosea nenosiri, jaribu tena</string>
<string name="dialog_title_cannot_check_password">Haiwezi Kuangalia nywila</string>
<string name="dialog_message_cannot_check_password">Briar hawezi kuangalia nywila yako. Tafadhali jaribu kuwasha upya kifaa chako ili utatue shida hii.</string>
<string name="sign_in_button">Ingia</string>
<string name="forgotten_password">Nimesahau nywila yangu
<string name="try_again">umekosea nywila , jaribu tena
umekosea nenosiri, jaribu tena</string>
<string name="sign_in_button">ingia</string>
<string name="forgotten_password">nimesahau Nywila yangu
nimesahau nenosiri yangu</string>
<string name="dialog_title_lost_password">Umepoteza nywila.
Umepoteza nenosiri.</string>
<string name="dialog_message_lost_password">Briar hawezi kuhifadhi nywila yako. Tafadhali jaribu kuwasha upya kifaa chako ili utatue shida hii.</string>
<string name="startup_failed_notification_title">Briar imeshidwa anza</string>
<string name="startup_failed_notification_text">Bonyeza kwa taarifa zaidi.</string>
<string name="startup_failed_activity_title">Briar imeshindwa kuanza</string>
<string name="startup_failed_db_error">Kutokana na sababu mbali mbali briar yako imevurugika kwenye hifadhi data. Na akaunti yako data na mawasiliano yako yote yamepotea. Itabidi upakue tena briar au tengeneza akaunti nyingine ila chagua umesahau nywila yako pale kwenye uwanja nenosiri .</string>
<string name="dialog_title_lost_password">umepoteza nywila
umepoteza nenosiri</string>
<string name="startup_failed_notification_title">Briar imeshidwa Anza</string>
<string name="startup_failed_notification_text">bonyeza kwa taarifa zaidi </string>
<string name="startup_failed_activity_title">Briar kuaza kumeshidwa</string>
<string name="startup_failed_db_error">Kutokana na sababu mbali mbali Briar yako imevurugika kwenye kifadhidata. Na akaunti yako data na mawasiliano yako yote yamepotea. Itabidi upakue tena Briar au Tengeneza Akaunti nyingine ila chagua umesahau Nenosiri lako\' pale kwenye uwanja nenosiri .</string>
<string name="startup_failed_data_too_old_error">Akaunti yako imetengenezwa na tolea la zamani la programu hii na Haiwezekani kufungua hili toleo . Nilazima ubadili hili toleo la zamani au utengeneze Akaunti mpaya kwa kuchagua umesahau nenosiri Katika uwanja wa nenosiri </string>
<string name="startup_failed_data_too_new_error">Hili toleo la programu ulilo tumia nila zamani . Tafathi boresha kuwa toleo jipya na ujaribu tena .</string>
<string name="startup_failed_service_error">Briar imeshindikan kuanza Unabidi uunganishwe . Hianzishe Briar kama kwawaida kuondoka hilo tatizo . Japo kuwa utapoteza Akaunti yako na data zako zote kutokana na briar hifadhi data zako kwenye save kuu.</string>
<plurals name="expiry_warning">
<item quantity="one">Hili ni toleo la jaribio la Briar. Akaunti yako itaisha %d kwa siku na haiwezi kufanywa upya.</item>
<item quantity="other">Hili ni toleo la jaribio la Briar. Akaunti yako itaisha %d kwa siku na haiwezi kufanywa upya.</item>
</plurals>
<string name="startup_failed_service_error">Briar imeshindikan kuanza Unabidi uunganishwe . Hianzishe Briar kama kwawaida kuondoka hilo tatizo . Japo kuwa utapoteza Akaunti yako na data zako zote kutokana na Briar haifathi data zako kwenye seva kuu.</string>
<string name="expiry_date_reached">Hii programu imemaliza muda wake.\nAsante kwa kujaribu </string>
<string name="download_briar">Ili kuendelea kutumia Briar, tafadhali pakua toleo la hivi karibuni.</string>
<string name="create_new_account">Unahitajika kutenege Akaunti Mpaya , ila unaweza endelea kutumia lakabu yako .</string>
<string name="download_briar_button">Pakua Kupaata toleo la hivi Karibuni</string>
<string name="startup_open_database">Kupunguka Hifadhidata</string>
<string name="startup_migrate_database">Boresha Hifadhidata</string>
<string name="startup_compact_database">Kuingiliana Hifadhi data rununu</string>
<string name="startup_compact_database">Kuingiliana Hifadhidata</string>
<!--Navigation Drawer-->
<string name="nav_drawer_open_description">Fungua njia ya Usambazaji </string>
<string name="nav_drawer_close_description">Funga njia ya Usambazaji </string>
<string name="contact_list_button">Mawasiliano </string>
<string name="groups_button">Vikundi vya kibinafsi</string>
<string name="forums_button">Ukumbi</string>
<string name="blogs_button">Blogi</string>
<string name="blogs_button">blogi</string>
<!--This is part of the main menu. The app will be locked when this is tapped.-->
<string name="lock_button">Funga programu</string>
<string name="settings_button">Mipangilio</string>
<string name="settings_button">vipimo</string>
<string name="sign_out_button">Kutoka</string>
<string name="transports_onboarding_text">Gonga hapa kudhibiti jinsi Briar inavyounganishwa kwenye mawasiliano yako</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Mtandao </string>
<string name="tor_device_status_online_wifi">Simu yako ina upatikanaji wa mtandano kupitia Wi_Fi</string>
<string name="tor_device_status_online_mobile">Simu yako ina upatikanaji wa mtandano kupitia data ya rununu</string>
<string name="tor_device_status_offline">Simu yako haina upatikanaji wa mtandao</string>
<string name="tor_plugin_status_enabling">Briar inaunganishwa kwenye Mtandao</string>
<string name="tor_plugin_status_active">Simu yako imeunganishwa kwenye Mtandao</string>
<string name="tor_plugin_status_inactive">Briar haiwezi kuunganishwa kwenye Mtandano</string>
<string name="tor_plugin_status_disabled">Briar imeundwa kutotumia Mtandao</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar imeundwa kutotumia data rununu</string>
<string name="tor_plugin_status_disabled_battery">Briar imeundwa kutotumia Mtandao wakati wa kutumia betri</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar imeundwa kutotumia mtandao kwenye nchi hii</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">WI-FI</string>
<string name="transport_lan_long">mtandao sawa wa Wi_Fi</string>
<string name="lan_device_status_on">Simu yako imeunganishwa na Wi_Fi</string>
<string name="lan_device_status_off">Simu yako haijaunganishwa na Wi_Fi</string>
<string name="lan_plugin_status_enabling">Briar inaunganishwa na mtandao wa Wi_Fi</string>
<string name="lan_plugin_status_active">Briar imeunganishwa na mtandao wa Wi_Fi</string>
<string name="lan_plugin_status_inactive">Briar haiwezi kuunganishwa kwenye mtandao wa Wi_Fi</string>
<string name="lan_plugin_status_disabled">Briar imeundwa kutotumia mtandao wa Wi_Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Bluetooth ya simu Yako imewashwa</string>
<string name="bt_device_status_off">Bluetooth ya simu Yako imezimwa</string>
<string name="bt_plugin_status_enabling">Briar inaunganishwa na Bluetooth</string>
<string name="bt_plugin_status_active">Briar imeunganishwa na bluetooth</string>
<string name="bt_plugin_status_inactive">Briar haiwezi kuunganishwa na Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar imeundwa kutotumia Bluetooth</string>
<string name="transport_lan">WI-FI</string>
<!--Notifications-->
<string name="reminder_notification_title">Toka Briar</string>
<string name="reminder_notification_text">bonyeza Kuingia tena .</string>
@@ -116,109 +81,95 @@ Umepoteza nenosiri.</string>
<string name="delete">futa</string>
<string name="accept">kukubali</string>
<string name="decline">kukata</string>
<string name="online">Mkondoni</string>
<string name="offline">Nje ya mkondo</string>
<string name="send">Tuma</string>
<string name="allow">Ruhusu</string>
<string name="open">Fungua</string>
<string name="no_data">Hakuna data</string>
<string name="online">mkondoni</string>
<string name="offline">nje ya mkondo</string>
<string name="send">tuma</string>
<string name="allow">ruhusu</string>
<string name="open">fungua</string>
<string name="no_data">hakuna data</string>
<string name="ellipsis">...</string>
<string name="text_too_long">Maneno ulio yainguza nimarefu sana </string>
<string name="show_onboarding">Kisanduku cha Msaada </string>
<string name="fix">Rekebisha</string>
<string name="help">Msaada</string>
<string name="show_onboarding">Kisanduku cha Msahada </string>
<string name="fix">kurekebisha</string>
<string name="help">Msahada</string>
<string name="sorry">Samahani</string>
<string name="error_start_activity">Haipatikani kwenye mfumo wako</string>
<string name="status_heading">Hali</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Hakuna mawasiliano yakuonyesha </string>
<string name="no_contacts_action">Bonyeza ikoni + kuongeza mawasiliano </string>
<string name="date_no_private_messages">Hakuna ujumbe </string>
<string name="no_private_messages">Hakuna ujumbe wakuonyesha </string>
<string name="message_hint">Andika ujumbe </string>
<string name="image_caption_hint">Ongeza maelezo mafupi (sio ya hiari)</string>
<string name="image_attach">Ambatanisha taswira</string>
<string name="image_attach_error">Imeshidikana kuambatanisha taswira</string>
<string name="image_attach_error_too_big">Taswira ni kubwa sana. Kiwango ni %d MB.</string>
<string name="no_contacts">hakuna mawasiliano yakuonyesha </string>
<string name="no_contacts_action">bonyeza ikoni + kuongeza mawasiliano </string>
<string name="date_no_private_messages">hakuna ujumbe </string>
<string name="no_private_messages">hakuna ujumbe wakuonyesha </string>
<string name="message_hint">andika ujumbe </string>
<string name="image_caption_hint">ongeza maelezo mafupi (sio ya hiari)</string>
<string name="image_attach">Ambatanisha na taswira</string>
<string name="image_attach_error">imeshidikana kuambatanisha taswira(s)</string>
<string name="image_attach_error_too_big">Taswira nikubwa sana . kiwango ni %d MB.</string>
<string name="image_attach_error_invalid_mime_type">Mfumo wa taswira hauendani: %s</string>
<string name="set_contact_alias">Badilisha jina lako la mawasiliano </string>
<string name="set_contact_alias_hint">Jina la mawasiliano </string>
<string name="set_alias_button">Badili</string>
<string name="delete_all_messages">Futa jumbe zote</string>
<string name="dialog_title_delete_all_messages">Hakiki ufutaji wa ujumbe</string>
<string name="dialog_message_delete_all_messages">Je, unauhakika wa kufuta jumbe zote?</string>
<string name="dialog_title_not_all_messages_deleted">Ufutaji wa jumbe zote umeshindikana</string>
<string name="dialog_message_not_deleted_ongoing_both">Jumbe unaohusiana na mialiko inayoendelea na utangulizi haziwezi kufutwa hadi amalize.</string>
<string name="dialog_message_not_deleted_ongoing_introductions">Jumbe zinazohusiana na utangulizi unaoendelea haziwezi kufutwa hadi amalize.</string>
<string name="dialog_message_not_deleted_ongoing_invitations">Jumbe zinazohusiana na mialiko inayoendelea haziwezi kufutwa hadi itakapomalizika.</string>
<string name="dialog_message_not_deleted_partly_downloaded">Jumbe zilizopakuliwa kwa sehemu haziwezi kufutwa hadi amalize kupakua.</string>
<string name="dialog_message_not_deleted_not_all_selected_both"> Kufuta mwaliko au utangulizi, unahitaji kuchagua ombi na jibu.</string>
<string name="dialog_message_not_deleted_not_all_selected_introductions">Ili kufuta utangulizi, unahitaji kuchagua ombi na jibu. </string>
<string name="dialog_message_not_deleted_not_all_selected_invitations">Ili kufuta mwaliko, unahitaji kuchagua ombi na jibu.</string>
<string name="delete_contact">Futa mawasiliano </string>
<string name="dialog_title_delete_contact">Thibitisha ufutaji wa mawasiliano </string>
<string name="dialog_message_delete_contact">Unauhakika unataka kuondoa mawasiliano na ujumbe wote kati yenu .</string>
<string name="contact_deleted_toast">Mawasiliano yamefutwa</string>
<string name="set_contact_alias">badilisha jina lako la mawasiliano </string>
<string name="set_contact_alias_hint">jina la mawasiliano </string>
<string name="set_alias_button">badili</string>
<string name="delete_contact">futaa mawasiliano </string>
<string name="dialog_title_delete_contact">thibitisha kufuta mawasiliano </string>
<string name="dialog_message_delete_contact">unauwakika unataka kuondoa mawasiliano na ujumbe wote kati yenu .</string>
<string name="contact_deleted_toast">mawasiliano yame ondolewa </string>
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
<string name="you">Wewe</string>
<string name="you">wewe</string>
<string name="save_image">Hifathi taswira</string>
<string name="dialog_title_save_image">Hifathi taswira?</string>
<string name="dialog_message_save_image">Uhifadhi wa taswira hii utaruhusu programu nyengine kuiona. Je, unauhakika unahitaji kuhifathi?</string>
<string name="dialog_title_save_image">Unaitaji kuhifathi Taswira?</string>
<string name="dialog_message_save_image">Hifathi hii taswira ila itaruhusu programu nyengine kuziona . Una uwakika unaitaji kuhifathi ?</string>
<string name="save_image_success">Taswira imehifathiwa </string>
<string name="save_image_error">Haiwezekani kuhifathi Taswira.</string>
<string name="dialog_title_no_image_support">Taswira haipatikani </string>
<string name="dialog_message_no_image_support">Anwani yako ya Briar bado haihimili viambatanisho vya picha. Mara tu watakapoboresha utaona aikoni tofauti</string>
<string name="dialog_title_image_support">Sasa unaweza tuma taswira kwa mawasiliano haya.</string>
<string name="dialog_message_image_support">Bonyeza ikoni hii kuambatanisha taswira.</string>
<string name="messaging_too_many_attachments_toast">Taswira ya kwanza %d ndio itakayotumwa</string>
<string name="dialog_message_no_image_support">Mfumo wako wa Briar hausaidi Uambatanishaji wa taswira . Utakapo boresha Briar utaona ikoni tofauti.</string>
<string name="dialog_title_image_support">Sasa unaweza tuma taswira kwa mawasiliano yako.</string>
<string name="dialog_message_image_support">Bonyeza ikoni hii kuambatanisha Taswira.</string>
<!--Adding Contacts-->
<string name="add_contact_title">Ongeza mawasaliano ya walio karibu </string>
<string name="face_to_face">Ni lazima ukutane na mtu unaye taka kumuongeza kwenye mawasiliano.\n\nHii ita kuepusha na mtu mwengine kuweza kusoma ujembo wako huko mbeleni.</string>
<string name="continue_button">Endelea</string>
<string name="try_again_button">Jaribu tena </string>
<string name="waiting_for_contact_to_scan">Usubiri kwa mawasiliano waku skani na kuunganishwa\u2026</string>
<string name="try_again_button">jaribu tena</string>
<string name="waiting_for_contact_to_scan">Usubi kwa mawasiliano ku skana na kuunganishwa\u2026</string>
<string name="exchanging_contact_details">Kubadilishana mawasiliano taharifa\u2026</string>
<string name="contact_added_toast">Mawasiliano yameongezwa:%s</string>
<string name="contact_added_toast">mawasiliano wameongezwa:%s</string>
<string name="contact_already_exists">Wasiliano%s tayari lipo.</string>
<string name="qr_code_invalid">The QR nambari sio sahihi </string>
<string name="qr_code_too_old">Nambari ya QR ulio skana inatokea kwenye toleo la zamani %s.\n\nTafathali wasiliana na mwenzio au boreshe kwenye toleo jipya na ujaribu tena .</string>
<string name="qr_code_too_new">Nambari ya QR ulio skana Inatoka kwenye toleo jipya %s.\n\nTafathali boresha kuwa kwenye toleo jipya na ujaribu tena .</string>
<string name="camera_error">Kamera Hitilafu</string>
<string name="connecting_to_device">Unganisha kwenye kifaa\u2026</string>
<string name="camera_error">kamera Hitilafu</string>
<string name="connecting_to_device">kunganishwa kwenye kifaa\u2026</string>
<string name="authenticating_with_device">Uhalisishaji wa kifaa\u2026</string>
<string name="connection_error_title">Imeshindwa unganishwa kwenye mawasiliano </string>
<string name="connection_error_title">imeshidwa unganishwa kwenye mawasiliano </string>
<string name="connection_error_explanation">Tafathali Angalia kama wote Mmeunganishwa kwenye Mtandao wa WI-FI mmoja .</string>
<string name="connection_error_feedback">Kama hilo tatizo linaendela , Tafathali <a href="feedback"> tutumie maoni</a>ilituboreshe Programu .</string>
<!--Adding Contacts Remotely-->
<string name="add_contact_remotely_title_case">Ongeza mawasiliano kwambali </string>
<string name="add_contact_nearby_title">Ongeza mawasiliano kwa karibu </string>
<string name="add_contact_nearby_title">ongeza mawasiliano kwa karibu </string>
<string name="add_contact_remotely_title">Ongeza Mawasilina kwa wambali </string>
<string name="contact_link_intro">Ingiza kiungo cha mawasiliano hapa. </string>
<string name="contact_link_hint">Unganisha mawasiliano </string>
<string name="paste_button">Bandika </string>
<string name="add_contact_button">Ongeza mawasiliano </string>
<string name="copy_button">Nakala</string>
<string name="share_button">Kushiriki </string>
<string name="contact_link_hint">unganisha mawasiliano </string>
<string name="paste_button">bandika </string>
<string name="add_contact_button">ongeza mawasiliano </string>
<string name="copy_button">nakala</string>
<string name="share_button">kushiriki </string>
<string name="send_link_title">Badilisha Kiungo. </string>
<string name="add_contact_choose_nickname">Chagua lakabu </string>
<string name="add_contact_choose_a_nickname">Ingiza lakabu </string>
<string name="nickname_intro">Ipe namba hii lakabu . Na niwewe tu utaiona .</string>
<string name="your_link">Mpe kiungo hichi unaye taka kuwasiliana nae </string>
<string name="link_clip_label">Kiunga cha Briar</string>
<string name="link_clip_label">Briar kiunga</string>
<string name="link_copied_toast">Kiungo nakili </string>
<string name="adding_contact_error">Kulikuwa na hitilafu wakati wa kuongeza mawasiliano </string>
<string name="adding_contact_error">kulikuwa na Hitilafu wakati wa kuongeza mawasiliano </string>
<string name="pending_contact_requests_snackbar">Maombi ya mawasiliano yalio subirishwa </string>
<string name="pending_contact_requests">Maombi yalio subirishwa </string>
<string name="no_pending_contacts">Hakuna maombi yalio subirishwa </string>
<string name="waiting_for_contact_to_come_online">Subiri kwaulie wasiliana nae aje Mkondoni .</string>
<string name="connecting">Kuunganishwa...</string>
<string name="connecting">kuunganishwa...</string>
<string name="adding_contact">Ongeza Mawasiliano....</string>
<string name="adding_contact_failed">Imeshidikana kuongeza Mawasiliano </string>
<string name="dialog_title_remove_pending_contact">Hakiki Kufuta </string>
<string name="dialog_message_remove_pending_contact">Mawawasilano haya bado yanaendea kuhifathiwa , kama uta ondoa sasa , hayata kuwa yameifathiwa .</string>
<string name="own_link_error">Ingiza kiunga cha mawasiliano, ambacho sio cha kwako </string>
<string name="own_link_error">Ingiza kiunga cha mawasiliano, Ambacho sio cha kwako </string>
<string name="nickname_missing">Tafathali andika lakabu</string>
<string name="invalid_link">Kiunga batili </string>
<string name="invalid_link">kiunga batili </string>
<string name="unsupported_link">Hichi kiunga kimetoka kwenye tolea jipya Bria. Tafathali boresha kuwa kwenye Tolea jipya na ujaribu tena .</string>
<string name="intent_own_link">Umefungua kiunga cha kwako mwenyewe. Tumia kingine unachotaka kuongeza!</string>
<string name="missing_link">Tafathali ingiza Kiungo </string>
@@ -233,28 +184,26 @@ Umepoteza nenosiri.</string>
<string name="offline_state">Hakuna mtandao</string>
<string name="duplicate_link_dialog_title">Kiunga cha kurudia.</string>
<string name="duplicate_link_dialog_text_1">Tayari unayo mawasiliano yenye kiunga hiki:%s</string>
<string name="duplicate_link_dialog_text_1_contact">Tayari una mawasiliano na kiunga hiki: 1%s
 </string>
<!--This is a question asking whether two nicknames refer to the same person-->
<string name="duplicate_link_dialog_text_2">yani%sna%sni mtu mmoja?</string>
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
string will be used in a dialog button, so if the translation of this string is longer than 20
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
<string name="same_person_button">Mtu yuleyule</string>
<string name="same_person_button">Mtu Mmoja</string>
<!--This is a button for answering that two nicknames refer to different people. This string
will be used in a dialog button, so if the translation of this string longer than 20 characters,
please use "No" instead, and use "Yes" for the "Same Person" button-->
<string name="different_person_button">Mtu Tofauti</string>
<string name="duplicate_link_dialog_text_3">%sna%swamekutumia kiunga sawa.\n\nMmoja wapo anajaribu kujuha ninani umewasiliana nae.\n\nUsi waambie umepokea kiunga hicho kwa mtu mwengine .</string>
<string name="pending_contact_updated_toast">mawasilano yalio subirishwa yamesasishwa </string>
<string name="pending_contact_updated_toast">mawasiano yalio subirishwa yamesasishwa </string>
<!--Introductions-->
<string name="introduction_onboarding_title">Tambulisha mawasiliano yako </string>
<string name="introduction_onboarding_text">Unaweza yatambulisha mawasiliano yako kwenu wote,Ili isiwe lazima mpaka wakutane ndio waungane kwenye Briar.</string>
<string name="introduction_menu_item">Anza Utambulisho </string>
<string name="introduction_activity_title">Chagua mawasiliano </string>
<string name="introduction_activity_title">chagua mawasiliano </string>
<string name="introduction_not_possible">Tayari ulisha kuwa na utambulisho wa mawasilino yanaendelea. Tafathali ruhusa kwanza haya yaishe. Ila kama wewe au unaye wasiliananae wanapatikana muda mchache mtandaoni, itachukua muda kuisha .</string>
<string name="introduction_message_title">Tambulisha Mawasiliano </string>
<string name="introduction_message_hint">Ongeza Ujumbe (hiari)</string>
<string name="introduction_message_hint">Ungeza Ujumbe (hiari)</string>
<string name="introduction_button">Anza Utambulisho </string>
<string name="introduction_sent">Utambulisho wako Umetumwa.</string>
<string name="introduction_error">Kulikuwa na hitilafu wakati wa utambulisho .</string>
@@ -264,7 +213,7 @@ Umepoteza nenosiri.</string>
<string name="introduction_request_answered_received">%1$sAmeombwa Akutambulishe kwa %2$s.</string>
<string name="introduction_response_accepted_sent">Umekubali utambulisho kwa%1$s.</string>
<string name="introduction_response_accepted_sent_info">Kabla%1$sAja ongezwa kwenye mawasilino yako, Wanatakiwa wakubali utambulisho vyema . Pia inaweza chukua mudaa </string>
<string name="introduction_response_declined_sent">Umekataa utambulisho kwa%1$s.</string>
<string name="introduction_response_declined_sent">Une kataa utambulisho kwa%1$s.</string>
<string name="introduction_response_accepted_received">%1$samekubali utabulisho kwa %2$s</string>
<string name="introduction_response_declined_received">%1$sKakataa Utambulisho kwa %2$s.</string>
<string name="introduction_response_declined_received_by_introducee">%1$skasema kwamba %2$s kakataa utambulisho.</string>
@@ -272,10 +221,6 @@ Umepoteza nenosiri.</string>
<string name="groups_list_empty">Hakuna kikundi cha kuonyesha </string>
<string name="groups_list_empty_action">Bonyeza +ikoni kutenege kikundi, au uliza mawasiliano yako wakuunge kwenye kikundi </string>
<string name="groups_created_by">Imetengenezwa na %s</string>
<plurals name="messages">
<item quantity="one">1%d jumbe</item>
<item quantity="other">1%d jumbe</item>
</plurals>
<string name="groups_group_is_empty">Hichi kikundi hakina watu </string>
<string name="groups_group_is_dissolved">Hichi kikundi kilisha futwaa</string>
<string name="groups_remove">Ondoa</string>
@@ -340,23 +285,23 @@ Umepoteza nenosiri.</string>
<string name="activity_share_toolbar_header">Chagua Mawasiliano </string>
<string name="no_contacts_selector">hakuna mawasiliano yakuonyesha </string>
<string name="no_contacts_selector_action">Tafathali rudi tena hapa baada ya kuongeza mawasiliano </string>
<string name="forum_shared_snackbar">Jukwaa tulilochangia kwa mawasiliano yaliyochaguliwa</string>
<string name="forum_shared_snackbar">Umetawanya kumbi na mawasiliano ulio chagua </string>
<string name="forum_share_message">Ungeza Ujumbe (hiari)</string>
<string name="forum_share_error">kulikuwa na hitilafu wakati changia huu ukumbi </string>
<string name="forum_invitation_received">%1$samechangia jukwaa\"%2$s\" na wewe.</string>
<string name="forum_invitation_sent">Umechangia jukwaa\"%1$s\" na %2$s.</string>
<string name="forum_invitations_title">Mwaliko wa jukwaa</string>
<string name="forum_invitation_exists">Umekubali mwaliko wa ukumbi huu tayari.\n\nNa kukubali mialiko zaidi itakufanya uwe na mawasiliano yako katika jukwaa yawe ya haraka na yakuaminika.</string>
<string name="forum_joined_toast">umejiunga kwenye jukwaa</string>
<string name="forum_invitation_received">%1$skamwaharifu juu ukumbi \"%2$s\" na wewe.</string>
<string name="forum_invitation_sent">Ume taharifiwa juu ya ukumbi \"%1$s\" na %2$s.</string>
<string name="forum_invitations_title">Mwaliko wa ukumbi</string>
<string name="forum_invitation_exists">Umekubali mwaliko wa ukumbi huu tayari.\n\nNa kukubali mialiko mbali mbali itakufanya uwe na kikundi hai.</string>
<string name="forum_joined_toast">umekiunga kwenye Ukumbi </string>
<string name="forum_declined_toast">Mwaliko umekataliwa</string>
<string name="shared_by_format">Umetumwa na %s</string>
<string name="forum_invitation_already_sharing">Tayari imesha sambazwa</string>
<string name="forum_invitation_response_accepted_sent">Umekubali mwaliko wa jukwaa kutoka kwa %s.</string>
<string name="forum_invitation_response_declined_sent">Umekata mwaliko wa jukwaa kutoka kwa %s.</string>
<string name="forum_invitation_response_accepted_received">%sKakubali mwaliko wa jukwaa.</string>
<string name="forum_invitation_response_declined_received">%skakata mwaliko wa jukwaa.</string>
<string name="forum_invitation_already_sharing">Tayari imesha sabanzwa</string>
<string name="forum_invitation_response_accepted_sent">Umekubali mwaliko wa ukumbi kutoka kwa %s.</string>
<string name="forum_invitation_response_declined_sent">Umekata mwaliko wa ukumbi kutoka kwa %s.</string>
<string name="forum_invitation_response_accepted_received">%sKakubali mwaliko wa ukumbi.</string>
<string name="forum_invitation_response_declined_received">%skakata mwaliko wa ukumbi.</string>
<string name="sharing_status">Tawanya hali </string>
<string name="sharing_status_forum">Mwana kikundi yoyote anaweza kuwataarifu watu wengine. Una tumia jukwaa hili na marafiki zako . Na kuna watu wengine wanaweza kutoona pia .</string>
<string name="sharing_status_forum">Mwana kikundi yoyote naweza taharifu watu wengine. Una tumia ukumbi huu na marafiki zako . Nakuna watu wengine wanweza kutoona pia .</string>
<string name="shared_with">Umesabazwa na %1$d(%2$dmkondoni)</string>
<string name="nobody">Hakuna mtu </string>
<!--Blogs-->
@@ -369,20 +314,19 @@ Umepoteza nenosiri.</string>
<string name="blogs_blog_post_received">Chapisho jipya la blogi limepokelewa </string>
<string name="blogs_blog_post_scroll_to">Tembeza kwa</string>
<string name="blogs_feed_empty_state">Hakuna chapisho lakuonyesha </string>
<string name="blogs_feed_empty_state_action">Taarifa zote kutoka kwenye Mawasaliano yako na blogi unazo zifwatilia zitatokea hapa\n\nBonyeza kalamu ikoni kuandika taarifa </string>
<string name="blogs_feed_empty_state_action">Taharifa zote kutoka kwenye Mawasaliano yako na blogi unazo zifwatilia zitatokea hapa\n\nBonyeza kalamu ikoni kuandika Taharifa </string>
<string name="blogs_remove_blog">Ondoa blogi </string>
<string name="blogs_remove_blog_dialog_message">unauhakika unataka kuondoa hii blogi?\n\nMachapisho yataondolewa kutoka kwenye kifaa chako lakini sio kutoka kwenye vifaa vya watu wengine.\n\nMawasiliano yoyote utakaokuwa umewashirikisha blogi hii wataweza kutopata taarifa mpya.</string>
<string name="blogs_remove_blog_ok">Ondoa</string>
<string name="blogs_blog_removed">Blogi imeondolewa </string>
<string name="blogs_reblog_comment_hint">Weka maoni(hiari)</string>
<string name="blogs_reblog_button">Chapisha tena </string>
<!--Blog Sharing-->
<string name="blogs_sharing_share">Sambaza Blogi</string>
<string name="blogs_sharing_share">tuma kwa wengine Blogi</string>
<string name="blogs_sharing_error">kulikuwa na hitilafu wakati wakuchangia blogi.</string>
<string name="blogs_sharing_button">tuma kwa wengine Blogi</string>
<string name="blogs_sharing_snackbar">Tuma blogi kwa mawasiliano yaliyochaguliwa </string>
<string name="blogs_sharing_snackbar">Tuma blogi kwa bahathi ya mawasiliano </string>
<string name="blogs_sharing_response_accepted_sent">Umekubali mwaliko wa Blogi kutoka %s.</string>
<string name="blogs_sharing_response_declined_sent">Umekataa mwaliko wa blogi kutoka kwa %s.</string>
<string name="blogs_sharing_response_declined_sent">Umekata mwaliko wa blogi kutoka kwa %s.</string>
<string name="blogs_sharing_response_accepted_received">%skakubali mwaliko wa blogi.</string>
<string name="blogs_sharing_response_declined_received">%skakata mwaliko wa blogi.</string>
<string name="blogs_sharing_invitation_received">%1$s kamwalika kwenye blogi\"%2$s\" na wewe.</string>
@@ -390,53 +334,41 @@ Umepoteza nenosiri.</string>
<string name="blogs_sharing_invitations_title">Mwaliko wa Blogi</string>
<string name="blogs_sharing_joined_toast">Jisajili kwenye Blogi</string>
<string name="blogs_sharing_declined_toast">mwaliko umekataliwa</string>
<string name="sharing_status_blog">Yeyote anayejisajili kwenye blogi anaweza akaisambaza kwa mawasiliano yake. Unashirikisha kwa mawasiliano yafuatayo. Kuna wengine watajisajili lakini usiweze kuwaona.</string>
<!--RSS Feeds-->
<string name="blogs_rss_feeds_import">Ingiza RSS taarifa</string>
<string name="blogs_rss_feeds_import_button">Ingiza</string>
<string name="blogs_rss_feeds_import_hint">Ingiza URL za RSS taarifa</string>
<string name="blogs_rss_feeds_import_error">Samahani! Kulikuwa na hitilafu wakati wakuingiza taarifa </string>
<string name="blogs_rss_feeds_manage">Simamia taarifa za RSS</string>
<string name="blogs_rss_feeds_import">Leta RSS taharifa</string>
<string name="blogs_rss_feeds_import_button">Leta</string>
<string name="blogs_rss_feeds_import_hint">Ingiza URL za RSS taharifa</string>
<string name="blogs_rss_feeds_import_error">Tafathi Samahani! Kulikuwa na Hitilafu wakati wakuingiza Taharifa </string>
<string name="blogs_rss_feeds_manage">Simamia RSS taharifa </string>
<string name="blogs_rss_feeds_manage_imported">Zilizoingizwa</string>
<string name="blogs_rss_feeds_manage_author">Mwandishi:</string>
<string name="blogs_rss_feeds_manage_updated">huwisho la mwisho
</string>
<string name="blogs_rss_remove_feed">Ondoa taarifa</string>
<string name="blogs_rss_remove_feed_dialog_message">Unauhakika unataka kutoa hii taarifa?\n\nChapisho lako litaondolewa kwenye kifaa chako ila sio kwenye vifaa vya watu wengine.\n\nMawasiliano yoyote utliokwisha kuyaunganisha wanaweza wasiendelea kupata taarifa. </string>
<string name="blogs_rss_feeds_manage_updated">Yamwisho imesasishwa: </string>
<string name="blogs_rss_remove_feed">Ondoa taharifa</string>
<string name="blogs_rss_remove_feed_dialog_message">Unauwakika unataka kutoa hii taharifa?\n\nChapisho lako litaondolewa kwenye kifaa chako ila sio kwenye vifaa vya watu wengine.\n\nMawasiliano yoyote utakayo ambayo uliyaunganisha wataendelea kupata taharifa. </string>
<string name="blogs_rss_remove_feed_ok">Ondoa</string>
<string name="blogs_rss_feeds_manage_delete_error">Taharifa haziwezekani kuzifuta! </string>
<string name="blogs_rss_feeds_manage_empty_state">Hakuna RSS taharifa zaku onyesha\n\nBonyeza + ikoni kuleta taharifa </string>
<string name="blogs_rss_feeds_manage_error">Kulikuwa na tatizo la kufungua taharifa . Tafathali jaribu baadae kidogo.</string>
<!--Settings Display-->
<string name="pref_language_title">Lugha &amp;mkoa</string>
<string name="pref_language_changed">Huu mpango utafanya kazi utakapo anzisha tena Briar. Tafathali toka na kuanzisha tena Briar.</string>
<string name="pref_language_changed">Huu mpango utafanya kazi baada yaku kuaza upaya Briar.Tafathali toka na kuanza upaya Briar.</string>
<string name="pref_language_default">Mfumo msingi </string>
<string name="display_settings_title">Onyesha</string>
<string name="pref_theme_title">Lengo</string>
<string name="pref_theme_title">Mada</string>
<string name="pref_theme_light">mwanga</string>
<string name="pref_theme_dark">Giza</string>
<string name="pref_theme_auto">kiotomatiki (Mchana)</string>
<string name="pref_theme_system">Mfumo Msingi </string>
<!--Settings Connections-->
<string name="network_settings_title">Viunganishi</string>
<string name="bluetooth_setting">Unganisha kwa anwani kupitia Bluetooth</string>
<string name="wifi_setting">Unganisha kwa anwani kwenye mtandao huo wa Wi-Fi 376 mtandao</string>
<string name="tor_enable_title">Unganisha mawasiliano kupitia mtandao</string>
<string name="tor_enable_summary">Muunganiko wote unaokwenda kwa njia ya mtandao wa Tor ni kwa faragha</string>
<string name="tor_network_setting">Unganisha njia kwa mtandao wa Tor</string>
<string name="tor_network_setting_automatic">kiotomatiki inatengemeana na mahali </string>
<string name="tor_network_setting_without_bridges">Tumia mtandao wa Tor bila madaraja</string>
<string name="tor_network_setting_with_bridges">Tumia mtandao wa Tor na madaraja</string>
<string name="tor_network_setting_never">Usiunganishe kwenye mtandao</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">kiotomatiki:%1$s (ndani%2$s)</string>
<string name="tor_mobile_data_title">Tumia Data ya simu</string>
<string name="tor_only_when_charging_title">Unganisha kwenye mtandao wakati wa kuchaji tu</string>
<string name="tor_only_when_charging_summary">Zima mtandao wakati betri inachajishwa</string>
<string name="tor_only_when_charging_summary">Zima mtandao wakati betri ipo chini </string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Ulizi</string>
<string name="pref_lock_title">Funga programu</string>
<string name="pref_lock_summary">Tumia nenosiri katika kifaa chako kulinda Briar wakati wa kuingia</string>
<string name="pref_lock_summary">Tumia nenosiri la simu kulinda Briar wakati wa kuingia</string>
<string name="pref_lock_disabled_summary">Ili kutumia huu mfumo , weka ulizi kwenye kifaa chako </string>
<string name="pref_lock_timeout_title">Kifungo cha Programu kimefika mwisho wake </string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
@@ -452,43 +384,43 @@ Umepoteza nenosiri.</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">lisaa 1</string>
<string name="pref_lock_timeout_never">Kamwe</string>
<string name="pref_lock_timeout_never_summary">kamwe usifunge Briar kiotomatiki</string>
<string name="pref_lock_timeout_never_summary">isijeikaji funga Briar kiotomatiki</string>
<string name="change_password">Badili nenosiri</string>
<string name="current_password">Nenosiri Lasasa</string>
<string name="choose_new_password">Nywila mpya</string>
<string name="confirm_new_password">Thibitisha nywila mpya.</string>
<string name="password_changed">Nywila imebadilishwa</string>
<string name="panic_setting">Usanidi wa kitufe cha hofu.</string>
<string name="choose_new_password">Nenosiri jipya</string>
<string name="confirm_new_password">Hakiki Nenosiri jipya</string>
<string name="password_changed">Nenosiri limebadilika </string>
<string name="panic_setting">Bonyeza ukiwa na hofu </string>
<string name="panic_setting_title">kitufe cha hofu </string>
<string name="panic_setting_hint">Sanidi jinsi Briar atavyoitikia wakati unatumia programu ya kitufe cha hofu. </string>
<string name="panic_app_setting_title">Programu ya Kitufe cha Hofu.</string>
<string name="unknown_app">programu isiyojulikana</string>
<string name="panic_app_setting_summary">Hakuna programu iliyowekwa</string>
<string name="panic_setting_hint">hakiki jinsi Briar ita kuwa endapo utabonyeza kitufe cha hofu kwenye programu </string>
<string name="panic_app_setting_title">Kitufe cha hofu kwenye programu </string>
<string name="unknown_app">programu isio tambulika</string>
<string name="panic_app_setting_summary">hakuna programu ilio tegeshwa </string>
<string name="panic_app_setting_none">Hakuna</string>
<string name="dialog_title_connect_panic_app">Thibitisha Programu ya Hofu.</string>
<string name="dialog_message_connect_panic_app">Una hakika unataka kuruhusu %1$skuchochea vitendo vya kifungo vya uharibifu.</string>
<string name="panic_setting_destructive_action">Vitendo vya Uharibifu.</string>
<string name="panic_setting_signout_title">Toka.</string>
<string name="panic_setting_signout_summary">Sanidi kutoka kwa Briar ikiwa kitufe cha hofu kimesisitizwa.</string>
<string name="purge_setting_title">Futa Akaunti.</string>
<string name="purge_setting_summary">Futa Akaunti yako ya Briar ikiwa kitufe cha hofu kimesisitizwa .Tahadhari: Hii itafuta kabisa utambulisho wako, anwani na ujumbe.</string>
<string name="dialog_title_connect_panic_app">Hakiki programu Hofu</string>
<string name="dialog_message_connect_panic_app">Unauwakika unataka kumruhusu %1$skujibu taharifa za hofu ? </string>
<string name="panic_setting_destructive_action">Kitendo cha kuharibu </string>
<string name="panic_setting_signout_title">Kutoka</string>
<string name="panic_setting_signout_summary">Toka kwenye Briar endapo kitufe cha Hofu kitabo nyezwa </string>
<string name="purge_setting_title">futa akaunti</string>
<string name="purge_setting_summary">Futa Briar akaunti endapo kitufe cha Hofu kitakuwa kimebonyezwa kwa mstuko . Hii itafuta kabisa mawasiliano na ujumbe wako </string>
<!--Settings Notifications-->
<string name="notification_settings_title">Arifa</string>
<string name="notify_sign_in_title">Nikumbushe kuingia.</string>
<string name="notify_sign_in_summary">Onyesha ukumbusho wakati simu inaanza au programu imesasishwa.</string>
<string name="notify_private_messages_setting_title">Ujumbe binafsi.</string>
<string name="notify_private_messages_setting_summary">Onyesha taarifa za ujumbe wa faragha.</string>
<string name="notify_private_messages_setting_summary_26">Sanidi arifa kwa ujumbe wa faragha.</string>
<string name="notify_group_messages_setting_title">Ujumbe wa kikundi</string>
<string name="notify_group_messages_setting_summary">Onyesha arifa za ujumbe wa kikundi.</string>
<string name="notification_settings_title">Arifu</string>
<string name="notify_sign_in_title">Nikumbushe ku ingia</string>
<string name="notify_sign_in_summary">onyesha kumbusho wakati simu imewaka au programu imesasisha</string>
<string name="notify_private_messages_setting_title">ujumbe wa kibinafsi</string>
<string name="notify_private_messages_setting_summary">onyesha arifu kwa ujumbe wa kibinafsi</string>
<string name="notify_private_messages_setting_summary_26">sanidi arifu kwa ujembe wa kibinafsi</string>
<string name="notify_group_messages_setting_title">ujumbe wakikundi</string>
<string name="notify_group_messages_setting_summary">Onyesha Taharifa za kikundi </string>
<string name="notify_group_messages_setting_summary_26">Hakiki ujumbe wa kikundi </string>
<string name="notify_forum_posts_setting_title">chapisho Ukumbi </string>
<string name="notify_forum_posts_setting_summary">Onyesha tahadhari kwa chapisho la jukwaa</string>
<string name="notify_forum_posts_setting_summary_26"> Hakiki taarifa za chapisho la jukwaa</string>
<string name="notify_forum_posts_setting_summary">Onyesha taharifa za chapisho kwenye Ukumbi </string>
<string name="notify_forum_posts_setting_summary_26">Hakiki taharifa za chapisho kwenye ukumbi </string>
<string name="notify_blog_posts_setting_title">chapisho blogi</string>
<string name="notify_blog_posts_setting_summary">Arifu kwa chapisho ya blogi </string>
<string name="notify_blog_posts_setting_summary">Onyesha chapisho kutoka kwenye blogi </string>
<string name="notify_blog_posts_setting_summary_26">Hakiki taharifa za chapisho kwenye blogi </string>
<string name="notify_vibration_setting">mtetemo </string>
<string name="notify_vibration_setting">vibrate </string>
<string name="notify_sound_setting">Sauti</string>
<string name="notify_sound_setting_default">Mwiito mkuu </string>
<string name="notify_sound_setting_disabled">Hakuna</string>
@@ -498,51 +430,29 @@ Umepoteza nenosiri.</string>
<string name="feedback_settings_title">Maoni</string>
<string name="send_feedback">Tuma Maoni </string>
<!--Link Warning-->
<string name="link_warning_title">kiungo onyo</string>
<string name="link_warning_intro">Uko karibu kufungua kiunga kifuatacho na programu ya nje</string>
<string name="link_warning_text">Hii inaweza kutumika kutambua wewe. Fikiria kama unaamini mtu aliyekutumia kiungo hiki na Fikiria kuifungua kwa kivinjari cha Tor.</string>
<string name="link_warning_open_link">kiunga wazi</string>
<string name="link_warning_title">kiungo cha onyo</string>
<string name="link_warning_open_link">Fungua kiungo </string>
<!--Crash Reporter-->
<string name="crash_report_title">Ripoti fupi ya ajali ya Brair</string>
<string name="crash_report_title">Briar taharia imearibika</string>
<string name="briar_crashed">Samahani, Briar imeharibika.</string>
<string name="not_your_fault"> Hili sio kosa lako</string>
<string name="please_send_report">Tafadhali tusaidie kujenga Briar bora kwa kututumia ripoti ya taharifa.</string>
<string name="report_is_encrypted">Tunaahidi kuwa ripoti hiyo imesimbwa kwa njia fiche na kutumwa salama.</string>
<string name="feedback_title">maoni</string>
<string name="feedback_title">Maoni</string>
<string name="describe_crash">Eleza kilicho tokea (hiari)</string>
<string name="enter_feedback">Weka Maoni yako </string>
<string name="optional_contact_email">Barua pepe yako (hiari)</string>
<string name="include_debug_report_crash">Jumuisha data isiyojulikana kuhusu ajali</string>
<string name="include_debug_report_feedback">Jumuisha data isiyojulikana kuhusu kifaa hiki</string>
<string name="could_not_load_report_data">Haikuweza kupakia data ya ripoti.</string>
<string name="send_report">Tuma repoti </string>
<string name="close">Funga</string>
<string name="dev_report_saved">Ripoti imehifadhiwa. Itatumwa wakati ujao ukiingia kwenye Briar.</string>
<!--Sign Out-->
<string name="progress_title_logout">Kuondoka Kwenye Briar...</string>
<!--Screen Filters & Tapjacking-->
<string name="screen_filter_title">Ufunikaji wa skrini umegunduliwa</string>
<string name="screen_filter_body">Programu nyingine inachorwa juu ya Briar. Ili kulinda usalama wako, Briar haitajibu kugusa wakati programu nyingine inachorwa juu. \n\nProgramu zifuatazo zinaweza kuchorwa juu:\n\n%1$s</string>
<string name="screen_filter_allow">Ruhusu programu hizi kuteka juu</string>
<!--Permission Requests-->
<string name="permission_camera_title">Ruhusa ya Kamera</string>
<string name="permission_camera_request_body">Ili kuchanganua nambari ya QR, Briar inahitaji ufikiaji wa kamera.</string>
<string name="permission_camera_title">kamera iruhusu</string>
<string name="permission_location_title">Ruhusa ya eneo</string>
<string name="permission_location_request_body">ilikugundua vifaa vya Bluetooth, Briar inahitaji idhini ya kufikia eneo lako. \n\ nBriar hahifadhi eneo lako au kushiriki na mtu yeyote.</string>
<string name="permission_camera_location_title">Kamera na Eneo</string>
<string name="permission_camera_location_request_body">Ili kuchanganua nambari ya QR, Briar inahitaji ufikiaji wa kamera. \n\nKugundua vifaa vya Bluetooth, Briar inahitaji idhini ya kufikia eneo lako. \n\nBriar hahifadhi eneo lako au kushiriki na mtu yeyote.</string>
<string name="permission_camera_denied_body">Umekataa ufikiaji wa kamera, lakini kuongeza anwani kunahitaji kutumia kamera. \n\nTafadhali fikiria kutoa idhini ya kufikia.</string>
<string name="qr_code">msimbo wa QR</string>
<string name="show_qr_code_fullscreen">Onyesha skrini nzima ya msimbo wa QR</string>
<!--App Locking-->
<string name="lock_unlock">Fungua Briar</string>
<string name="lock_unlock_verbose">Ingiza PIN ya kifaa chako, fumbo au nywila kufungua Briar </string>
<string name="lock_unlock_fingerprint_description">Gusa kihisi cha alama za vidole kilicho sajiliwa na kidole husika ili kuendelea</string>
<string name="lock_unlock_password">Tumia Nywila</string>
<string name="lock_unlock_verbose">Ingiza Nenosiri la kifaa chako,PIN au fumbo kufungua Briar </string>
<string name="lock_unlock_password">Tumia nenosiri</string>
<string name="lock_is_locked">Briar imefungwa </string>
<string name="lock_tap_to_unlock">Bonyeza kufungua</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar inaweza kuungana na anwani zako kupitia mtandao, Wi-Fi au Bluetooth. \n\n Muunganisho wote wa mtandao hupitia mtandao wa Tor kwa faragha. \n\n Ikiwa anwani inaweza kufikiwa kwa njia nyingi, Briar huitumia kwa usawa.</string>
<string name="lock_tap_to_unlock">Bonyeza kufunga</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alice</string>
@@ -551,9 +461,9 @@ Umepoteza nenosiri.</string>
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_carol">Carol</string>
<!--This is a message to be used in screenshots. Please use the same translation for Bob!-->
<string name="screenshot_message_1">Habari Bob!</string>
<string name="screenshot_message_1">Hi Bob!</string>
<!--This is a message to be used in screenshots. Please use the same translation for Alice!-->
<string name="screenshot_message_2">Habari Alice! Asante kwa kuniambia kuhusu Briar!</string>
<string name="screenshot_message_2">Hi Alice! Asante kwa kuniambia juu ya Briar!</string>
<!--This is a message to be used in screenshots.-->
<string name="screenshot_message_3">Hakuna tatizo, natumaini umeipenda 😀</string>
<string name="screenshot_message_3">Hakuna tatizo, natumaini utaipenda 😀</string>
</resources>

View File

@@ -61,36 +61,10 @@
<string name="lock_button">Uygulamayı Kilitle</string>
<string name="settings_button">Ayarlar</string>
<string name="sign_out_button">Oturumu Kapat</string>
<string name="transports_onboarding_text">Briar\'ın kişilerinizle nasıl bağlanacağını kontrol etmek için buraya tıklayın</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">İnternet</string>
<string name="tor_device_status_online_wifi">Telefonunuzun Wi-Fi aracılığıyla İnternet erişimi var</string>
<string name="tor_device_status_online_mobile">Telefonunuzun mobil veri aracılığıyla İnternet erişimi var</string>
<string name="tor_device_status_offline">Telefonunuzun İnternet erişimi yok</string>
<string name="tor_plugin_status_enabling">Briar İnternet\'e bağlanıyor</string>
<string name="tor_plugin_status_active">Briar İnternet\'e bağlandı</string>
<string name="tor_plugin_status_inactive">Briar İnternet\'e bağlanamıyor</string>
<string name="tor_plugin_status_disabled">Briar İnternet kullanmamak üzere yapılandırılmış</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar mobil veri kullanmamak üzere yapılandırılmış</string>
<string name="tor_plugin_status_disabled_battery">Briar pille çalışırken İnternet kullanmamak üzere yapılandırılmış</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar bu ülkede İnternet kullanmamak üzere yapılandırılmış</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Aynı Wi-Fi Ağı</string>
<string name="lan_device_status_on">Telefonunuz Wi-Fi\'ye bağlı</string>
<string name="lan_device_status_off">Telefonunuz Wi-Fi\'ye bağlı değil</string>
<string name="lan_plugin_status_enabling">Briar Wi-Fi ağına bağlanıyor</string>
<string name="lan_plugin_status_active">Briar Wi-Fi ağına bağlandı</string>
<string name="lan_plugin_status_inactive">Briar Wi-Fi ağına bağlanamıyor</string>
<string name="lan_plugin_status_disabled">Briar Wi-Fi ağını kullanmamak üzere yapılandırılmış</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Telefonunuzun Bluetooth\'u açık</string>
<string name="bt_device_status_off">Telefonunuzun Bluetooth\'u kapalı</string>
<string name="bt_plugin_status_enabling">Briar Bluetooth\'a bağlanıyor</string>
<string name="bt_plugin_status_active">Briar Bluetooth\'a bağlandı</string>
<string name="bt_plugin_status_inactive">Briar Bluetooth\'a bağlanamıyor</string>
<string name="bt_plugin_status_disabled">Briar Bluetooth kullanmamak üzere yapılandırılmış</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Briar oturumu kapatıldı</string>
<string name="reminder_notification_text">Tekrar oturum açmak için dokunun</string>
@@ -137,7 +111,6 @@
<string name="help">Yardım</string>
<string name="sorry">Üzgünüm</string>
<string name="error_start_activity">Sisteminizde mevcut değil</string>
<string name="status_heading">Durum</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Gösterilecek kişi yok</string>
<string name="no_contacts_action">kişi eklemek için + simgesine dokunun</string>
@@ -559,8 +532,6 @@
<string name="lock_unlock_password">Parola Kullanın</string>
<string name="lock_is_locked">Briar kilitli</string>
<string name="lock_tap_to_unlock">Kilidi açmak için dokunun</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar kişilerinizle İnternet, Wi-Fi veya Bluetooth ile bağlanabilir.\n\nBütün İnternet bağlantıları gizliliğiniz için Tor Ağı üzerinden yapılıyor.\n\nEğer bir kişiniz birçok yöntemle erişilebiliyorsa, Briar bu yöntemleri paralel olarak kullanır.</string>
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Alice</string>

View File

@@ -59,12 +59,10 @@
<string name="lock_button">Заблокувати програму</string>
<string name="settings_button">Налаштування</string>
<string name="sign_out_button">Вийти</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">Інтернет</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">Ви вийшли з Briar</string>
<string name="reminder_notification_text">Натисніть, щоб знову увійти.</string>
@@ -118,7 +116,6 @@
<string name="fix">Виправити</string>
<string name="help">Довідка</string>
<string name="sorry">Вибачте</string>
<string name="status_heading">Статус</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Немає контактів для відображення</string>
<string name="no_contacts_action">Натисніть на символ \"+\" для того, щоб додати контакт</string>
@@ -528,7 +525,6 @@
<string name="lock_unlock_password">Використовуйте пароль</string>
<string name="lock_is_locked">Briar заблоковано</string>
<string name="lock_tap_to_unlock">Натисніть, щоб розблокувати</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">Аліса</string>

View File

@@ -60,36 +60,10 @@
<string name="lock_button">锁定应用</string>
<string name="settings_button">设置</string>
<string name="sign_out_button">登出</string>
<string name="transports_onboarding_text">点击这里来控制Briar如何连接到您的联系人</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">互联网</string>
<string name="tor_device_status_online_wifi">你的手机通过Wi-Fi上网</string>
<string name="tor_device_status_online_mobile">您的手机通过移动数据访问互联网</string>
<string name="tor_device_status_offline">你的手机不能上网</string>
<string name="tor_plugin_status_enabling">Briar正在连接互联网</string>
<string name="tor_plugin_status_active">Briar 已联网</string>
<string name="tor_plugin_status_inactive">Briar 无法联网</string>
<string name="tor_plugin_status_disabled">Briar 配置为不使用互联网</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar 配置为不使用移动数据</string>
<string name="tor_plugin_status_disabled_battery">Briar配置为在用电池运行时不使用互联网</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar配置为在这个国家不使用互联网</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">无线局域网</string>
<string name="transport_lan_long">同一 Wi-Fi 网络</string>
<string name="lan_device_status_on">你的手机连接到Wi-Fi</string>
<string name="lan_device_status_off">你的手机未连接到Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar正在连接Wi-Fi网络</string>
<string name="lan_plugin_status_active">Briar已连接到此Wi-Fi网络</string>
<string name="lan_plugin_status_inactive">Briar不能连接到此Wi-Fi网络</string>
<string name="lan_plugin_status_disabled">Briar 配置为不使用Wi-Fi 网络</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">蓝牙</string>
<string name="bt_device_status_on">你手机的蓝牙已打开</string>
<string name="bt_device_status_off">你手机额蓝牙已关闭</string>
<string name="bt_plugin_status_enabling">Briar 正连接蓝牙</string>
<string name="bt_plugin_status_active">Briar 已连接蓝牙</string>
<string name="bt_plugin_status_inactive">Briar 不能连接蓝牙</string>
<string name="bt_plugin_status_disabled">Briar 配置为不使用蓝牙</string>
<string name="transport_lan">无线局域网</string>
<!--Notifications-->
<string name="reminder_notification_title">已登出 Briar</string>
<string name="reminder_notification_text">轻按以重新登录。</string>
@@ -132,7 +106,6 @@
<string name="help">帮助</string>
<string name="sorry">抱歉</string>
<string name="error_start_activity">在您的系统上不可用</string>
<string name="status_heading">状态:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">尚无联系人可供显示</string>
<string name="no_contacts_action">轻按 + 号即可添加联系人</string>
@@ -426,20 +399,10 @@
<string name="pref_theme_auto">自动(白天)</string>
<string name="pref_theme_system">系统默认</string>
<!--Settings Connections-->
<string name="network_settings_title">连接</string>
<string name="bluetooth_setting">通过蓝牙连接联系人</string>
<string name="wifi_setting">通过同一Wi-Fi和联系人连接</string>
<string name="tor_enable_title">通过互联网和联系人连接</string>
<string name="tor_enable_summary">为了保护隐私所有连接都通过Tor网络</string>
<string name="tor_network_setting">Tor网络连接方式</string>
<string name="tor_network_setting_automatic">基于位置自动选择</string>
<string name="tor_network_setting_without_bridges">不通过网桥连接到 Tor</string>
<string name="tor_network_setting_with_bridges">通过网桥连接到 Tor</string>
<string name="tor_network_setting_never">不连接到互联网</string>
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
<string name="tor_network_setting_summary">自动选择:%1$s在 %2$s</string>
<string name="tor_mobile_data_title">使用移动数据</string>
<string name="tor_only_when_charging_title">仅在充电时联网</string>
<string name="tor_only_when_charging_summary">当设备使用电池电量时关闭网络连接</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">安全</string>
@@ -549,8 +512,6 @@
<string name="lock_unlock_password">使用密码</string>
<string name="lock_is_locked">Briar 已锁定</string>
<string name="lock_tap_to_unlock">轻按以解锁</string>
<!--Connections Screen-->
<string name="transports_help_text">Briar可以通过互联网、Wi-Fi或蓝牙连接到您的联系人。\n\n为了保护隐私所有的互联网连接都通过Tor网络。\n\n如果一个联系人可以通过多种方法联系到Briar会并行地使用它们。</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>

View File

@@ -56,12 +56,10 @@
<string name="lock_button">鎖定程式</string>
<string name="settings_button">設置</string>
<string name="sign_out_button">登出</string>
<!--Transports: Tor-->
<!--Transports-->
<string name="transport_tor">互聯網</string>
<!--Transports: Wi-Fi-->
<string name="transport_lan">Wi-Fi</string>
<!--Transports: Bluetooth-->
<string name="transport_bt">藍牙</string>
<string name="transport_lan">Wi-Fi</string>
<!--Notifications-->
<string name="reminder_notification_title">已登出 Briar</string>
<string name="reminder_notification_text">輕按以重新登錄。</string>
@@ -103,7 +101,6 @@
<string name="fix">修復</string>
<string name="help">幫助</string>
<string name="sorry">抱歉</string>
<string name="status_heading">狀態:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">尚無聯絡人可供顯示</string>
<string name="no_contacts_action">輕按 + 號即可添加聯絡人</string>
@@ -497,7 +494,6 @@
<string name="lock_unlock_password">使用密碼</string>
<string name="lock_is_locked">Briar 已鎖定</string>
<string name="lock_tap_to_unlock">輕按以解鎖</string>
<!--Connections Screen-->
<!--Screenshots-->
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
<string name="screenshot_alice">愛麗詩</string>

View File

@@ -68,39 +68,11 @@
<string name="lock_button">Lock App</string>
<string name="settings_button">Settings</string>
<string name="sign_out_button">Sign Out</string>
<string name="transports_onboarding_text">Tap here to control how Briar connects to your contacts.</string>
<!-- Transports: Tor -->
<!-- Transports -->
<string name="transport_tor">Internet</string>
<string name="tor_device_status_online_wifi">Your phone has Internet access via Wi-Fi</string>
<string name="tor_device_status_online_mobile">Your phone has Internet access via mobile data</string>
<string name="tor_device_status_offline">Your phone does not have Internet access</string>
<string name="tor_plugin_status_enabling">Briar is connecting to the Internet</string>
<string name="tor_plugin_status_active">Briar is connected to the Internet</string>
<string name="tor_plugin_status_inactive">Briar can\'t connect to the Internet</string>
<string name="tor_plugin_status_disabled">Briar is configured not to use the Internet</string>
<string name="tor_plugin_status_disabled_mobile_data">Briar is configured not to use mobile data</string>
<string name="tor_plugin_status_disabled_battery">Briar is configured not to use the Internet when running on battery</string>
<string name="tor_plugin_status_disabled_country_blocked">Briar is configured not to use the Internet in this country</string>
<!-- Transports: Wi-Fi -->
<string name="transport_lan">Wi-Fi</string>
<string name="transport_lan_long">Same Wi-Fi network</string>
<string name="lan_device_status_on">Your phone is connected to Wi-Fi</string>
<string name="lan_device_status_off">Your phone is not connected to Wi-Fi</string>
<string name="lan_plugin_status_enabling">Briar is connecting to the Wi-Fi network</string>
<string name="lan_plugin_status_active">Briar is connected to the Wi-Fi network</string>
<string name="lan_plugin_status_inactive">Briar can\'t connect to the Wi-Fi network</string>
<string name="lan_plugin_status_disabled">Briar is configured not to use the Wi-Fi network</string>
<!-- Transports: Bluetooth -->
<string name="transport_bt">Bluetooth</string>
<string name="bt_device_status_on">Your phone\'s Bluetooth is turned on</string>
<string name="bt_device_status_off">Your phone\'s Bluetooth is turned off</string>
<string name="bt_plugin_status_enabling">Briar is connecting to Bluetooth</string>
<string name="bt_plugin_status_active">Briar is connected to Bluetooth</string>
<string name="bt_plugin_status_inactive">Briar can\'t connect to Bluetooth</string>
<string name="bt_plugin_status_disabled">Briar is configured not to use Bluetooth</string>
<string name="transport_lan">Wi-Fi</string>
<!-- Notifications -->
<string name="reminder_notification_title">Signed out of Briar</string>
@@ -149,7 +121,6 @@
<string name="help">Help</string>
<string name="sorry">Sorry</string>
<string name="error_start_activity">Unavailable on your system</string>
<string name="status_heading">Status:</string>
<!-- Contacts and Private Conversations-->
<string name="no_contacts">No contacts to show</string>
@@ -600,9 +571,6 @@
<string name="lock_is_locked">Briar is locked</string>
<string name="lock_tap_to_unlock">Tap to unlock</string>
<!-- Connections Screen -->
<string name="transports_help_text">Briar can connect to your contacts via the Internet, Wi-Fi or Bluetooth.\n\nAll Internet connections go through the Tor network for privacy.\n\nIf a contact can be reached by multiple methods, Briar uses them in parallel.</string>
<!-- Screenshots -->
<!-- This is a name to be used in screenshots. Feel free to change it to a local name. -->

View File

@@ -232,6 +232,16 @@
android:title="Crash"
app:iconSpaceReserved="false"/>
<Preference
android:key="pref_key_export"
android:title="Export Account to SD Card"
app:iconSpaceReserved="false"/>
<Preference
android:key="pref_key_import"
android:title="Import Account from SD Card"
app:iconSpaceReserved="false"/>
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -83,6 +83,8 @@ public class FeedManagerIntegrationTest extends BriarTestCase {
assertEquals(url, feed.getUrl());
assertEquals(feedBlog, feed.getBlog());
assertEquals("Schneier on Security", feed.getTitle());
assertEquals("A blog covering security and security technology.",
feed.getDescription());
assertEquals(feed.getTitle(), feed.getBlog().getName());
assertEquals(feed.getTitle(), feed.getLocalAuthor().getName());

View File

@@ -69,8 +69,7 @@ Returns a JSON array of contacts:
"handshakePublicKey": "XnYRd7a7E4CTqgAvh4hCxh/YZ0EPscxknB9ZcEOpSzY=",
"verified": true,
"lastChatActivity": 1557838312175,
"connected": false,
"unreadCount": 7
"connected": false
}
```
@@ -183,18 +182,6 @@ Note that it's also possible to add contacts nearby via Bluetooth/Wifi or
introductions. In these cases contacts omit the `pendingContact` state and
directly become `contact`s.
### Changing alias of a contact
`PUT /v1/contacts/{contactId}/alias`
The alias should be posted as a JSON object:
```json
{
"alias": "A nickname for the new contact"
}
```
### Removing a contact
`DELETE /v1/contacts/{contactId}`
@@ -246,25 +233,6 @@ The text of the message should be posted as JSON:
}
```
### Marking private messages as read
`POST /v1/messages/{contactId}/read`
The `messageId` of the message to be marked as read
needs to be provided in the request body as follows:
```json
{
"messageId": "+AIMMgOCPFF8HDEhiEHYjbfKrg7v0G94inKxjvjYzA8="
}
```
### Deleting all private messages
`DELETE /v1/messages/{contactId}/all`
It returns with a status code `200`, if removal was successful.
### Listing blog posts
`GET /v1/blogs/posts`
@@ -441,39 +409,3 @@ When the last connection is lost (the contact goes offline), it sends a `Contact
"type": "event"
}
```
### A message was sent
When Briar sent a message to a contact, it sends a `MessagesSentEvent`. This is indicated in Briar
by showing one tick next to the message.
```json
{
"data": {
"contactId": 1,
"messageIds": [
"+AIMMgOCPFF8HDEhiEHYjbfKrg7v0G94inKxjvjYzA8="
]
},
"name": "MessagesSentEvent",
"type": "event"
}
```
### A message was acknowledged
When a contact acknowledges that they received a message, Briar sends a `MessagesAckedEvent`.
This is indicated in Briar by showing two ticks next to the message.
```json
{
"data": {
"contactId": 1,
"messageIds": [
"+AIMMgOCPFF8HDEhiEHYjbfKrg7v0G94inKxjvjYzA8="
]
},
"name": "MessagesAckedEvent",
"type": "event"
}
```

View File

@@ -1,9 +1,3 @@
import java.util.jar.JarEntry
import java.util.jar.JarFile
import java.util.jar.JarOutputStream
import static java.util.Collections.list
plugins {
id 'java'
id 'idea'
@@ -53,34 +47,6 @@ jar {
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
doLast() {
// Rename the original jar
File jar = project.jar.archivePath
String srcPath = jar.toString().replaceFirst('\\.jar$', '.unsorted.jar')
File srcFile = new File(srcPath)
jar.renameTo(srcFile)
JarFile srcJarFile = new JarFile(srcFile)
OutputStream destStream = new JarOutputStream(new FileOutputStream(jar))
// Read and sort the entries
Map<String, JarEntry> entries = new TreeMap<String, JarEntry>()
for (JarEntry e : list(srcJarFile.entries())) entries.put(e.getName(), e)
// Write the sorted entries
for (JarEntry srcEntry : entries.values()) {
JarEntry destEntry = new JarEntry(srcEntry.getName())
destEntry.setTime(0)
destStream.putNextEntry(destEntry)
InputStream srcStream = srcJarFile.getInputStream(srcEntry)
int read
byte[] buf = new byte[4096]
while ((read = srcStream.read(buf, 0, buf.length)) != -1) {
destStream.write(buf, 0, read)
}
destStream.closeEntry()
srcStream.close()
}
destStream.close()
srcJarFile.close()
}
}
// At the moment for non-Android projects we need to explicitly mark the code generated by kapt

View File

@@ -81,20 +81,11 @@ constructor(
path("/:contactId") {
delete { ctx -> contactController.delete(ctx) }
}
path("/:contactId/alias") {
put { ctx -> contactController.setContactAlias(ctx) }
}
}
path("/messages/:contactId") {
get { ctx -> messagingController.list(ctx) }
post { ctx -> messagingController.write(ctx) }
}
path("/messages/:contactId/read") {
post { ctx -> messagingController.markMessageRead(ctx) }
}
path("/messages/:contactId/all") {
delete { ctx -> messagingController.deleteAllMessages(ctx) }
}
path("/forums") {
get { ctx -> forumController.list(ctx) }
post { ctx -> forumController.create(ctx) }

View File

@@ -9,7 +9,6 @@ interface ContactController {
fun addPendingContact(ctx: Context): Context
fun listPendingContacts(ctx: Context): Context
fun removePendingContact(ctx: Context): Context
fun setContactAlias(ctx: Context): Context
fun delete(ctx: Context): Context
}

View File

@@ -77,8 +77,7 @@ constructor(
val contacts = contactManager.contacts.map { contact ->
val latestMsgTime = conversationManager.getGroupCount(contact.id).latestMsgTime
val connected = connectionRegistry.isConnected(contact.id)
val unreadCount = conversationManager.getGroupCount(contact.id).unreadCount
contact.output(latestMsgTime, connected, unreadCount)
contact.output(latestMsgTime, connected)
}
return ctx.json(contacts)
}
@@ -92,7 +91,9 @@ constructor(
val link = ctx.getFromJson(objectMapper, "link")
val alias = ctx.getFromJson(objectMapper, "alias")
if (!LINK_REGEX.matcher(link).find()) throw BadRequestResponse("Invalid Link")
checkAliasLength(alias)
val aliasUtf8 = toUtf8(alias)
if (aliasUtf8.isEmpty() || aliasUtf8.size > MAX_AUTHOR_NAME_LENGTH)
throw BadRequestResponse("Invalid Alias")
val pendingContact = contactManager.addPendingContact(link, alias)
return ctx.json(pendingContact.output())
}
@@ -123,18 +124,6 @@ constructor(
return ctx
}
override fun setContactAlias(ctx: Context): Context {
val contactId = ctx.getContactIdFromPathParam()
val alias = ctx.getFromJson(objectMapper, "alias")
checkAliasLength(alias)
try {
contactManager.setContactAlias(contactId, alias)
} catch (e: NoSuchContactException) {
throw NotFoundResponse()
}
return ctx
}
override fun delete(ctx: Context): Context {
val contactId = ctx.getContactIdFromPathParam()
try {
@@ -145,10 +134,4 @@ constructor(
return ctx
}
private fun checkAliasLength(alias: String) {
val aliasUtf8 = toUtf8(alias)
if (aliasUtf8.isEmpty() || aliasUtf8.size > MAX_AUTHOR_NAME_LENGTH)
throw BadRequestResponse("Invalid Alias")
}
}

View File

@@ -7,13 +7,12 @@ import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent
import org.briarproject.bramble.identity.output
import org.briarproject.briar.headless.json.JsonDict
internal fun Contact.output(latestMsgTime: Long, connected: Boolean, unreadCount: Int) = JsonDict(
internal fun Contact.output(latestMsgTime: Long, connected: Boolean) = JsonDict(
"contactId" to id.int,
"author" to author.output(),
"verified" to isVerified,
"lastChatActivity" to latestMsgTime,
"connected" to connected,
"unreadCount" to unreadCount
"connected" to connected
).apply {
alias?.let { put("alias", it) }
handshakePublicKey?.let { put("handshakePublicKey", it.encoded) }

View File

@@ -8,8 +8,4 @@ interface MessagingController {
fun write(ctx: Context): Context
fun markMessageRead(ctx: Context): Context
fun deleteAllMessages(ctx: Context): Context
}

View File

@@ -11,9 +11,6 @@ import org.briarproject.bramble.api.db.DatabaseExecutor
import org.briarproject.bramble.api.db.NoSuchContactException
import org.briarproject.bramble.api.event.Event
import org.briarproject.bramble.api.event.EventListener
import org.briarproject.bramble.api.sync.event.MessagesAckedEvent
import org.briarproject.bramble.api.sync.event.MessagesSentEvent
import org.briarproject.bramble.api.sync.MessageId
import org.briarproject.bramble.api.system.Clock
import org.briarproject.bramble.util.StringUtils.utf8IsTooLong
import org.briarproject.briar.api.blog.BlogInvitationRequest
@@ -36,16 +33,12 @@ import org.briarproject.briar.headless.event.output
import org.briarproject.briar.headless.getContactIdFromPathParam
import org.briarproject.briar.headless.getFromJson
import org.briarproject.briar.headless.json.JsonDict
import org.spongycastle.util.encoders.Base64
import org.spongycastle.util.encoders.DecoderException
import java.util.concurrent.Executor
import javax.annotation.concurrent.Immutable
import javax.inject.Inject
import javax.inject.Singleton
internal const val EVENT_CONVERSATION_MESSAGE = "ConversationMessageReceivedEvent"
internal const val EVENT_MESSAGES_ACKED = "MessagesAckedEvent"
internal const val EVENT_MESSAGES_SENT = "MessagesSentEvent"
@Immutable
@Singleton
@@ -86,36 +79,6 @@ constructor(
return ctx.json(m.output(contact.id, text))
}
override fun markMessageRead(ctx: Context): Context {
val contact = getContact(ctx)
val groupId = messagingManager.getContactGroup(contact).id
val messageIdString = ctx.getFromJson(objectMapper, "messageId")
val messageId = deserializeMessageId(messageIdString)
messagingManager.setReadFlag(groupId, messageId, true)
return ctx.json(messageIdString)
}
private fun deserializeMessageId(idString: String): MessageId {
val idBytes = try {
Base64.decode(idString)
} catch (e: DecoderException) {
throw NotFoundResponse()
}
if (idBytes.size != MessageId.LENGTH) throw NotFoundResponse()
return MessageId(idBytes)
}
override fun deleteAllMessages(ctx: Context): Context {
val contactId = ctx.getContactIdFromPathParam()
try {
val result = conversationManager.deleteAllMessages(contactId)
return ctx.json(result.output())
} catch (e: NoSuchContactException) {
throw NotFoundResponse()
}
}
override fun eventOccurred(e: Event) {
when (e) {
is ConversationMessageReceivedEvent<*> -> {
@@ -127,12 +90,6 @@ constructor(
webSocketController.sendEvent(EVENT_CONVERSATION_MESSAGE, e.output())
}
}
is MessagesSentEvent -> {
webSocketController.sendEvent(EVENT_MESSAGES_SENT, e.output())
}
is MessagesAckedEvent -> {
webSocketController.sendEvent(EVENT_MESSAGES_ACKED, e.output())
}
}
}

View File

@@ -1,11 +1,7 @@
package org.briarproject.briar.headless.messaging
import org.briarproject.bramble.api.contact.ContactId
import org.briarproject.bramble.api.sync.MessageId
import org.briarproject.bramble.api.sync.event.MessagesAckedEvent
import org.briarproject.bramble.api.sync.event.MessagesSentEvent
import org.briarproject.briar.api.conversation.ConversationMessageHeader
import org.briarproject.briar.api.conversation.DeletionResult
import org.briarproject.briar.api.messaging.PrivateMessage
import org.briarproject.briar.api.messaging.PrivateMessageHeader
import org.briarproject.briar.headless.json.JsonDict
@@ -47,24 +43,3 @@ internal fun PrivateMessage.output(contactId: ContactId, text: String) = JsonDic
"groupId" to message.groupId.bytes,
"text" to text
)
internal fun DeletionResult.output() = JsonDict(
"allDeleted" to allDeleted(),
"hasIntroductionSessionInProgress" to hasIntroductionSessionInProgress(),
"hasInvitationSessionInProgress" to hasInvitationSessionInProgress(),
"hasNotAllIntroductionSelected" to hasNotAllIntroductionSelected(),
"hasNotAllInvitationSelected" to hasNotAllInvitationSelected(),
"hasNotFullyDownloaded" to hasNotFullyDownloaded()
)
internal fun MessagesAckedEvent.output() = JsonDict(
"contactId" to contactId.int,
"messageIds" to messageIds.toJson()
)
internal fun MessagesSentEvent.output() = JsonDict(
"contactId" to contactId.int,
"messageIds" to messageIds.toJson()
)
internal fun Collection<MessageId>.toJson() = map { it.bytes }

View File

@@ -46,7 +46,6 @@ abstract class ControllerTest {
protected val message: Message = getMessage(group.id)
protected val text: String = getRandomString(5)
protected val timestamp = 42L
protected val unreadCount = 42
protected fun assertJsonEquals(json: String, obj: Any) {
assertEquals(json, outputCtx.json(obj).resultString(), STRICT)

View File

@@ -6,7 +6,6 @@ import io.javalin.plugin.json.JavalinJson.toJson
import io.mockk.Runs
import io.mockk.every
import io.mockk.just
import io.mockk.mockkStatic
import io.mockk.runs
import org.briarproject.bramble.api.Pair
import org.briarproject.bramble.api.contact.Contact
@@ -28,7 +27,6 @@ import org.briarproject.bramble.test.TestUtils.getPendingContact
import org.briarproject.bramble.test.TestUtils.getRandomBytes
import org.briarproject.bramble.util.StringUtils.getRandomString
import org.briarproject.briar.headless.ControllerTest
import org.briarproject.briar.headless.getFromJson
import org.briarproject.briar.headless.json.JsonDict
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertThrows
@@ -60,8 +58,7 @@ internal class ContactControllerTest : ControllerTest() {
every { contactManager.contacts } returns listOf(contact)
every { conversationManager.getGroupCount(contact.id).latestMsgTime } returns timestamp
every { connectionRegistry.isConnected(contact.id) } returns connected
every { conversationManager.getGroupCount(contact.id).unreadCount } returns unreadCount
every { ctx.json(listOf(contact.output(timestamp, connected, unreadCount))) } returns ctx
every { ctx.json(listOf(contact.output(timestamp, connected))) } returns ctx
controller.list(ctx)
}
@@ -196,66 +193,6 @@ internal class ContactControllerTest : ControllerTest() {
}
}
@Test
fun testSetContactAlias() {
mockkStatic("org.briarproject.briar.headless.RouterKt")
every { ctx.pathParam("contactId") } returns "1"
every { ctx.getFromJson(objectMapper, "alias") } returns "foo"
every { contactManager.setContactAlias(ContactId(1), "foo") } just Runs
controller.setContactAlias(ctx)
}
@Test
fun testSetContactAliasInvalidId() {
mockkStatic("org.briarproject.briar.headless.RouterKt")
every { ctx.pathParam("contactId") } returns "foo"
every { ctx.getFromJson(objectMapper, "alias") } returns "bar"
assertThrows(NotFoundResponse::class.java) {
controller.setContactAlias(ctx)
}
}
@Test
fun testSetContactAliasNonexistentId() {
mockkStatic("org.briarproject.briar.headless.RouterKt")
every { ctx.pathParam("contactId") } returns "1"
every { ctx.getFromJson(objectMapper, "alias") } returns "foo"
every { contactManager.setContactAlias(ContactId(1), "foo") } throws NotFoundResponse()
assertThrows(NotFoundResponse::class.java) {
controller.setContactAlias(ctx)
}
}
@Test
fun testSetContactAliasInvalid() {
mockkStatic("org.briarproject.briar.headless.RouterKt")
every { ctx.pathParam("contactId") } returns "1"
every { ctx.getFromJson(objectMapper, "alias") } returns getRandomString(MAX_AUTHOR_NAME_LENGTH + 1)
assertThrows(BadRequestResponse::class.java) {
controller.setContactAlias(ctx)
}
}
@Test
fun testSetContactAliasEmpty() {
mockkStatic("org.briarproject.briar.headless.RouterKt")
every { ctx.pathParam("contactId") } returns "1"
every { ctx.getFromJson(objectMapper, "alias") } returns ""
assertThrows(BadRequestResponse::class.java) {
controller.setContactAlias(ctx)
}
}
@Test
fun testSetContactAliasMissing() {
mockkStatic("org.briarproject.briar.headless.RouterKt")
every { ctx.pathParam("contactId") } returns "1"
every { ctx.body() } returns ""
assertThrows(BadRequestResponse::class.java) {
controller.setContactAlias(ctx)
}
}
@Test
fun testDelete() {
every { ctx.pathParam("contactId") } returns "1"
@@ -376,11 +313,10 @@ internal class ContactControllerTest : ControllerTest() {
"handshakePublicKey": ${toJson(contact.handshakePublicKey!!.encoded)},
"verified": ${contact.isVerified},
"lastChatActivity": $timestamp,
"connected": $connected,
"unreadCount": $unreadCount
"connected": $connected
}
"""
assertJsonEquals(json, contact.output(timestamp, connected, unreadCount))
assertJsonEquals(json, contact.output(timestamp, connected))
}
@Test

View File

@@ -10,14 +10,11 @@ import org.briarproject.bramble.api.db.NoSuchContactException
import org.briarproject.bramble.api.identity.AuthorInfo
import org.briarproject.bramble.api.identity.AuthorInfo.Status.UNVERIFIED
import org.briarproject.bramble.api.identity.AuthorInfo.Status.VERIFIED
import org.briarproject.bramble.api.sync.MessageId
import org.briarproject.bramble.api.sync.event.MessagesAckedEvent
import org.briarproject.bramble.api.sync.event.MessagesSentEvent
import org.briarproject.bramble.test.ImmediateExecutor
import org.briarproject.bramble.test.TestUtils.getRandomId
import org.briarproject.bramble.util.StringUtils.getRandomString
import org.briarproject.briar.api.client.SessionId
import org.briarproject.briar.api.conversation.DeletionResult
import org.briarproject.briar.api.conversation.ConversationManager
import org.briarproject.briar.api.introduction.IntroductionRequest
import org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH
import org.briarproject.briar.api.messaging.MessagingManager
@@ -27,13 +24,10 @@ import org.briarproject.briar.api.messaging.PrivateMessageHeader
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent
import org.briarproject.briar.headless.ControllerTest
import org.briarproject.briar.headless.event.output
import org.briarproject.briar.headless.getFromJson
import org.briarproject.briar.headless.json.JsonDict
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.Test
import org.spongycastle.util.encoders.Base64
import kotlin.random.Random
internal class MessagingControllerImplTest : ControllerTest() {
@@ -106,40 +100,6 @@ internal class MessagingControllerImplTest : ControllerTest() {
testInvalidContactId { controller.list(ctx) }
}
@Test
fun testMessagesAckedEvent() {
val messageId1 = MessageId(getRandomId())
val messageId2 = MessageId(getRandomId())
val messageIds = listOf(messageId1, messageId2)
val event = MessagesAckedEvent(contact.id, messageIds)
every {
webSocketController.sendEvent(
EVENT_MESSAGES_ACKED,
event.output()
)
} just runs
controller.eventOccurred(event)
}
@Test
fun testMessagesSentEvent() {
val messageId1 = MessageId(getRandomId())
val messageId2 = MessageId(getRandomId())
val messageIds = listOf(messageId1, messageId2)
val event = MessagesSentEvent(contact.id, messageIds)
every {
webSocketController.sendEvent(
EVENT_MESSAGES_SENT,
event.output()
)
} just runs
controller.eventOccurred(event)
}
@Test
fun listNonexistentContactId() {
testNonexistentContactId { controller.list(ctx) }
@@ -202,32 +162,6 @@ internal class MessagingControllerImplTest : ControllerTest() {
assertThrows(BadRequestResponse::class.java) { controller.write(ctx) }
}
@Test
fun markMessageRead() {
mockkStatic("org.briarproject.briar.headless.RouterKt")
mockkStatic("org.spongycastle.util.encoders.Base64")
expectGetContact()
val messageIdString = message.id.bytes.toString()
every { messagingManager.getContactGroup(contact).id } returns group.id
every { ctx.getFromJson(objectMapper, "messageId") } returns messageIdString
every { Base64.decode(messageIdString) } returns message.id.bytes
every { messagingManager.setReadFlag(group.id, message.id, true) } just Runs
every { ctx.json(messageIdString) } returns ctx
controller.markMessageRead(ctx)
}
@Test
fun markMessageReadInvalidContactId() {
testInvalidContactId { controller.markMessageRead(ctx) }
}
@Test
fun markMessageReadNonexistentId() {
testNonexistentContactId { controller.markMessageRead(ctx) }
}
@Test
fun privateMessageEvent() {
val event = PrivateMessageReceivedEvent(header, contact.id)
@@ -243,43 +177,6 @@ internal class MessagingControllerImplTest : ControllerTest() {
controller.eventOccurred(event)
}
@Test
fun testOutputMessagesAckedEvent() {
val messageId1 = MessageId(getRandomId())
val messageId2 = MessageId(getRandomId())
val messageIds = listOf(messageId1, messageId2)
val event = MessagesAckedEvent(contact.id, messageIds)
val json = """
{
"contactId": ${contact.id.int},
"messageIds": [
${toJson(messageId1.bytes)},
${toJson(messageId2.bytes)}
]
}
"""
assertJsonEquals(json, event.output())
}
@Test
fun testOutputMessagesSentEvent() {
val messageId1 = MessageId(getRandomId())
val messageId2 = MessageId(getRandomId())
val messageIds = listOf(messageId1, messageId2)
val event = MessagesSentEvent(contact.id, messageIds)
val json = """
{
"contactId": ${contact.id.int},
"messageIds": [
${toJson(messageId1.bytes)},
${toJson(messageId2.bytes)}
]
}
"""
assertJsonEquals(json, event.output())
}
@Test
fun testOutputPrivateMessageHeader() {
val json = """
@@ -345,53 +242,6 @@ internal class MessagingControllerImplTest : ControllerTest() {
assertJsonEquals(json, request.output(contact.id))
}
@Test
fun testDeleteAllMessages() {
val result = DeletionResult()
every { ctx.pathParam("contactId") } returns "1"
every { conversationManager.deleteAllMessages(ContactId(1)) } returns result
every { ctx.json(result.output()) } returns ctx
controller.deleteAllMessages(ctx)
}
@Test
fun testDeleteAllMessagesInvalidContactId() {
every { ctx.pathParam("contactId") } returns "foo"
assertThrows(NotFoundResponse::class.java) {
controller.deleteAllMessages(ctx)
}
}
@Test
fun testDeleteAllMessagesNonexistentContactId() {
every { ctx.pathParam("contactId") } returns "1"
every { conversationManager.deleteAllMessages(ContactId(1)) } throws NoSuchContactException()
assertThrows(NotFoundResponse::class.java) {
controller.deleteAllMessages(ctx)
}
}
@Test
fun testOutputDeletionResult() {
val result = DeletionResult()
if (Random.nextBoolean()) result.addInvitationNotAllSelected()
if (Random.nextBoolean()) result.addInvitationSessionInProgress()
if (Random.nextBoolean()) result.addIntroductionNotAllSelected()
if (Random.nextBoolean()) result.addIntroductionSessionInProgress()
if (Random.nextBoolean()) result.addNotFullyDownloaded()
val json = """
{
"allDeleted": ${result.allDeleted()},
"hasIntroductionSessionInProgress": ${result.hasIntroductionSessionInProgress()},
"hasInvitationSessionInProgress": ${result.hasInvitationSessionInProgress()},
"hasNotAllIntroductionSelected": ${result.hasNotAllIntroductionSelected()},
"hasNotAllInvitationSelected": ${result.hasNotAllInvitationSelected()},
"hasNotFullyDownloaded": ${result.hasNotFullyDownloaded()}
}
"""
assertJsonEquals(json, result.output())
}
private fun expectGetContact() {
every { ctx.pathParam("contactId") } returns contact.id.int.toString()
every { contactManager.getContact(contact.id) } returns contact

View File

@@ -33,12 +33,3 @@ buildscript {
classpath files('libs/gradle-witness.jar')
}
}
project.ext {
buildToolsVersion = '30.0.2'
compileSdkVersion = 30
minSdkVersion = 16
targetSdkVersion = 29
versionCode = 10211
versionName = '1.2.11'
}