Compare commits

...

19 Commits

Author SHA1 Message Date
akwizgran
39478a7914 Bump version numbers for 1.1.2 release. 2018-10-01 14:58:45 +01:00
akwizgran
112e71a9cb Bump version numbers for 1.0.2 release. 2018-10-01 14:56:08 +01:00
akwizgran
5650bef310 Update translations. 2018-10-01 14:56:08 +01:00
akwizgran
2a87171c49 Merge branch 'manual-screenshots' into 'master'
Create Screenshot of Conversation for Manual

Closes #1377

See merge request briar/briar!910
2018-10-01 13:41:05 +00:00
akwizgran
15cb5409e7 Merge branch '1352-panic-ripple-fdroid' into 'master'
Fix Panic Button bugs

Closes #1109 and #1352

See merge request briar/briar!937
2018-09-28 09:57:18 +00:00
akwizgran
fd07dc006d Update comment. 2018-09-28 09:55:47 +01:00
akwizgran
cc87c4e37d Merge branch '1391-start-end-api15' into 'master'
RTL language layout fixes

Closes #1391

See merge request briar/briar!938
2018-09-28 08:45:17 +00:00
akwizgran
4a10e876f6 Merge branch '1389-notice-shadows' into 'master'
Fix notice shadows

Closes #1389

See merge request briar/briar!939
2018-09-28 08:43:06 +00:00
Torsten Grote
fad0057c4a Fix notice shadows 2018-09-27 20:32:13 -03:00
Torsten Grote
5aabfcea9a Unmirror checkboxes in RTL layouts 2018-09-27 19:09:08 -03:00
Torsten Grote
f7d928c774 Fix start/end margins for API 15
Fixes #1391
2018-09-27 19:07:13 -03:00
Torsten Grote
bd983d9796 Remove non-functional uninstall panic action
Fixes #1109
2018-09-27 18:37:57 -03:00
Torsten Grote
de8d1b7d96 Allow sign out by trusted non-paired panic apps 2018-09-27 18:25:31 -03:00
Torsten Grote
9155f62d0b Remove Amnesty International's key and add F-Droid Ripple key instead
Fixes #1352
2018-09-27 18:17:14 -03:00
Torsten Grote
c2b7f85b8e Remove code from TestDataCreator that breaks encapsulation 2018-09-24 12:37:11 -03:00
Torsten Grote
ae81eb3737 Throw AssertionError when creating an account while a database key is in memory 2018-09-24 12:37:11 -03:00
Torsten Grote
60d949c342 Refactor tests so that all test data is created in the first test 2018-09-24 12:37:11 -03:00
Torsten Grote
1c90e64894 Split up UI and Screenshot tests
Closes #1377
2018-09-24 12:37:06 -03:00
Torsten Grote
f0e2d5281f Create Screenshot of Conversation for Manual 2018-09-24 12:34:26 -03:00
73 changed files with 677 additions and 425 deletions

View File

@@ -9,8 +9,8 @@ android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 26
versionCode 10101
versionName "1.1.1"
versionCode 10102
versionName "1.1.2"
consumerProguardFiles 'proguard-rules.txt'
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

View File

@@ -159,7 +159,8 @@ class AccountManagerImpl implements AccountManager {
@Override
public boolean createAccount(String name, String password) {
synchronized (stateChangeLock) {
// TODO don't allow creating another account if one already exists
if (hasDatabaseKey())
throw new AssertionError("Already have a database key");
LocalAuthor localAuthor = identityManager.createLocalAuthor(name);
identityManager.registerLocalAuthor(localAuthor);
SecretKey key = crypto.generateSecretKey();
@@ -182,6 +183,7 @@ class AccountManagerImpl implements AccountManager {
LOG.info("Deleting account");
IoUtils.deleteFileOrDir(databaseConfig.getDatabaseKeyDirectory());
IoUtils.deleteFileOrDir(databaseConfig.getDatabaseDirectory());
databaseKey = null;
}
}

View File

@@ -2,65 +2,6 @@ apply plugin: 'com.android.application'
apply plugin: 'witness'
apply from: 'witness.gradle'
dependencies {
implementation project(path: ':briar-core', configuration: 'default')
implementation project(path: ':bramble-core', configuration: 'default')
implementation project(':bramble-android')
def supportVersion = '27.1.1'
implementation "com.android.support:support-v4:$supportVersion"
implementation("com.android.support:appcompat-v7:$supportVersion") {
exclude module: 'support-v4'
}
implementation("com.android.support:preference-v14:$supportVersion") {
exclude module: 'support-v4'
}
implementation("com.android.support:design:$supportVersion") {
exclude module: 'support-v4'
exclude module: 'recyclerview-v7'
}
implementation "com.android.support:cardview-v7:$supportVersion"
implementation "com.android.support:support-annotations:$supportVersion"
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation('ch.acra:acra:4.9.1') {
exclude module: 'support-v4'
exclude module: 'support-annotations'
}
implementation 'info.guardianproject.panic:panic:0.5'
implementation 'info.guardianproject.trustedintents:trustedintents:0.2'
implementation 'de.hdodenhof:circleimageview:2.2.0'
implementation 'com.google.zxing:core:3.3.0'
implementation 'uk.co.samuelwall:material-tap-target-prompt:2.8.0'
implementation 'com.vanniktech:emoji-google:0.5.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.0.2'
compileOnly 'javax.annotation:jsr250-api:1.0'
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
testImplementation 'org.robolectric:robolectric:3.8'
testImplementation 'org.robolectric:shadows-support-v4:3.3.2'
testImplementation 'org.mockito:mockito-core:2.13.0'
testImplementation 'junit:junit:4.12'
testImplementation "org.jmock:jmock:2.8.2"
testImplementation "org.jmock:jmock-junit4:2.8.2"
testImplementation "org.jmock:jmock-legacy:2.8.2"
testImplementation "org.hamcrest:hamcrest-library:1.3"
testImplementation "org.hamcrest:hamcrest-core:1.3"
def espressoVersion = '3.0.2'
androidTestImplementation "com.android.support.test.espresso:espresso-core:$espressoVersion"
androidTestImplementation "com.android.support.test.espresso:espresso-contrib:$espressoVersion"
androidTestImplementation "com.android.support.test.espresso:espresso-intents:$espressoVersion"
androidTestImplementation "tools.fastlane:screengrab:1.1.0"
androidTestImplementation "com.android.support.test.uiautomator:uiautomator-v18:2.1.3"
androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:2.0.2"
androidTestCompileOnly 'javax.annotation:jsr250-api:1.0'
androidTestImplementation 'junit:junit:4.12'
}
def getStdout = { command, defaultValue ->
def stdout = new ByteArrayOutputStream()
try {
@@ -81,15 +22,15 @@ android {
defaultConfig {
minSdkVersion 15
targetSdkVersion 26
versionCode 10101
versionName "1.1.1"
versionCode 10102
versionName "1.1.2"
applicationId "org.briarproject.briar.android"
buildConfigField "String", "GitHash",
"\"${getStdout(['git', 'rev-parse', '--short=7', 'HEAD'], 'No commit hash')}\""
def now = (long) (System.currentTimeMillis() / 1000)
buildConfigField "Long", "BuildTimestamp",
"${getStdout(['git', 'log', '-n', '1', '--format=%ct'], now)}000L"
testInstrumentationRunner 'org.briarproject.briar.android.test.BriarTestRunner'
testInstrumentationRunner 'org.briarproject.briar.android.BriarTestRunner'
}
buildTypes {
@@ -144,6 +85,65 @@ android {
}
}
dependencies {
implementation project(path: ':briar-core', configuration: 'default')
implementation project(path: ':bramble-core', configuration: 'default')
implementation project(':bramble-android')
def supportVersion = '27.1.1'
implementation "com.android.support:support-v4:$supportVersion"
implementation("com.android.support:appcompat-v7:$supportVersion") {
exclude module: 'support-v4'
}
implementation("com.android.support:preference-v14:$supportVersion") {
exclude module: 'support-v4'
}
implementation("com.android.support:design:$supportVersion") {
exclude module: 'support-v4'
exclude module: 'recyclerview-v7'
}
implementation "com.android.support:cardview-v7:$supportVersion"
implementation "com.android.support:support-annotations:$supportVersion"
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation('ch.acra:acra:4.9.1') {
exclude module: 'support-v4'
exclude module: 'support-annotations'
}
implementation 'info.guardianproject.panic:panic:0.5'
implementation 'info.guardianproject.trustedintents:trustedintents:0.2'
implementation 'de.hdodenhof:circleimageview:2.2.0'
implementation 'com.google.zxing:core:3.3.0'
implementation 'uk.co.samuelwall:material-tap-target-prompt:2.8.0'
implementation 'com.vanniktech:emoji-google:0.5.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.0.2'
compileOnly 'javax.annotation:jsr250-api:1.0'
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
testImplementation 'org.robolectric:robolectric:3.8'
testImplementation 'org.robolectric:shadows-support-v4:3.3.2'
testImplementation 'org.mockito:mockito-core:2.13.0'
testImplementation 'junit:junit:4.12'
testImplementation "org.jmock:jmock:2.8.2"
testImplementation "org.jmock:jmock-junit4:2.8.2"
testImplementation "org.jmock:jmock-legacy:2.8.2"
testImplementation "org.hamcrest:hamcrest-library:1.3"
testImplementation "org.hamcrest:hamcrest-core:1.3"
def espressoVersion = '3.0.2'
androidTestImplementation "com.android.support.test.espresso:espresso-core:$espressoVersion"
androidTestImplementation "com.android.support.test.espresso:espresso-contrib:$espressoVersion"
androidTestImplementation "com.android.support.test.espresso:espresso-intents:$espressoVersion"
androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:2.0.2"
androidTestCompileOnly 'javax.annotation:jsr250-api:1.0'
androidTestImplementation 'junit:junit:4.12'
androidTestScreenshotImplementation "tools.fastlane:screengrab:1.2.0"
androidTestScreenshotImplementation "com.android.support.test.uiautomator:uiautomator-v18:2.1.3"
}
task verifyTranslations {
doLast {
def file = project.file("src/main/res/values/arrays.xml")

View File

@@ -1,9 +1,7 @@
app_package_name "org.briarproject.briar.android.screenshot.debug"
locales ['en-US']
use_tests_in_classes([
'org.briarproject.briar.android.login.SetupActivityScreenshotTest',
'org.briarproject.briar.android.settings.SettingsActivityScreenshotTest',
])
app_apk_path "build/outputs/apk/screenshot/debug/briar-android-screenshot-debug.apk"
tests_apk_path "build/outputs/apk/androidTest/screenshot/debug/briar-android-screenshot-debug-androidTest.apk"
test_instrumentation_runner "org.briarproject.briar.android.test.BriarTestRunner"
test_instrumentation_runner "org.briarproject.briar.android.BriarTestRunner"
reinstall_app = true
exit_on_test_failure = true

View File

@@ -4,4 +4,8 @@ adb shell am broadcast -a com.android.systemui.demo -e command enter
adb shell am broadcast -a com.android.systemui.demo -e command notifications -e visible false
adb shell am broadcast -a com.android.systemui.demo -e command battery -e level 100
adb shell am broadcast -a com.android.systemui.demo -e command network -e wifi show
adb shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm 1337
adb shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm 1337
# workaround for Android Pie hidden API Espresso bug
adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1

View File

@@ -12,4 +12,4 @@
-keep class junit.** { *; }
-dontwarn junit.**
-dontwarn org.briarproject.briar.android.BriarTestComponentApplication
-dontwarn org.briarproject.briar.android.**

View File

@@ -1,11 +1,9 @@
package org.briarproject.briar.android.test;
package org.briarproject.briar.android;
import android.app.Application;
import android.content.Context;
import android.support.test.runner.AndroidJUnitRunner;
import org.briarproject.briar.android.BriarTestComponentApplication;
public class BriarTestRunner extends AndroidJUnitRunner {
@Override
@@ -13,8 +11,8 @@ public class BriarTestRunner extends AndroidJUnitRunner {
Context context)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException {
return super.newApplication(cl, BriarTestComponentApplication.class.getName(),
context);
return super.newApplication(cl,
BriarTestComponentApplication.class.getName(), context);
}
}

View File

@@ -0,0 +1,79 @@
package org.briarproject.briar.android;
import android.app.Activity;
import android.content.Intent;
import android.support.test.espresso.intent.rule.IntentsTestRule;
import org.briarproject.bramble.api.account.AccountManager;
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.R;
import javax.annotation.Nullable;
import javax.inject.Inject;
import static android.support.test.InstrumentationRegistry.getTargetContext;
@SuppressWarnings("WeakerAccess")
public abstract class UiTest {
protected final String USERNAME =
getTargetContext().getString(R.string.screenshot_alice);
protected static final String PASSWORD = "123456";
@Inject
protected AccountManager accountManager;
@Inject
protected LifecycleManager lifecycleManager;
public UiTest() {
BriarTestComponentApplication app =
(BriarTestComponentApplication) getTargetContext()
.getApplicationContext();
inject((BriarUiTestComponent) app.getApplicationComponent());
}
protected abstract void inject(BriarUiTestComponent component);
@NotNullByDefault
protected class CleanAccountTestRule<A extends Activity>
extends IntentsTestRule<A> {
@Nullable
private final Runnable runnable;
public CleanAccountTestRule(Class<A> activityClass) {
super(activityClass);
this.runnable = null;
}
/**
* Use this if you need to run code before launching the activity.
* Note: You need to use {@link #launchActivity(Intent)} yourself
* to start the activity.
*/
public CleanAccountTestRule(Class<A> activityClass, Runnable runnable) {
super(activityClass, false, false);
this.runnable = runnable;
}
@Override
protected void beforeActivityLaunched() {
super.beforeActivityLaunched();
accountManager.deleteAccount();
accountManager.createAccount(USERNAME, PASSWORD);
if (runnable != null) {
Intent serviceIntent =
new Intent(getTargetContext(), BriarService.class);
getTargetContext().startService(serviceIntent);
try {
lifecycleManager.waitForStartup();
} catch (InterruptedException e) {
throw new AssertionError(e);
}
runnable.run();
}
}
}
}

View File

@@ -1,4 +1,4 @@
package org.briarproject.briar.android.test;
package org.briarproject.briar.android;
import android.app.Activity;
import android.support.test.espresso.PerformException;

View File

@@ -1,73 +0,0 @@
package org.briarproject.briar.android.test;
import android.app.Activity;
import android.support.test.espresso.intent.rule.IntentsTestRule;
import android.util.Log;
import org.briarproject.bramble.api.account.AccountManager;
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.briar.android.BriarTestComponentApplication;
import org.briarproject.briar.android.BriarUiTestComponent;
import org.junit.ClassRule;
import javax.inject.Inject;
import tools.fastlane.screengrab.Screengrab;
import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy;
import tools.fastlane.screengrab.locale.LocaleTestRule;
import static android.support.test.InstrumentationRegistry.getTargetContext;
import static tools.fastlane.screengrab.Screengrab.setDefaultScreenshotStrategy;
public abstract class ScreenshotTest {
@ClassRule
public static final LocaleTestRule localeTestRule = new LocaleTestRule();
protected static final String USERNAME = "Alice";
protected static final String PASSWORD = "123456";
@Inject
protected AccountManager accountManager;
@Inject
protected LifecycleManager lifecycleManager;
public ScreenshotTest() {
super();
setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy());
BriarTestComponentApplication app =
(BriarTestComponentApplication) getTargetContext()
.getApplicationContext();
inject((BriarUiTestComponent) app.getApplicationComponent());
}
protected abstract void inject(BriarUiTestComponent component);
protected void screenshot(String name) {
try {
Screengrab.screenshot(name);
} catch (RuntimeException e) {
if (!e.getMessage().equals("Unable to capture screenshot."))
throw e;
// The tests should still pass when run from AndroidStudio
// without manually granting permissions like fastlane does.
Log.w("Screengrab", "Permission to write screenshot is missing.");
}
}
protected class CleanAccountTestRule<A extends Activity>
extends IntentsTestRule<A> {
public CleanAccountTestRule(Class<A> activityClass) {
super(activityClass);
}
@Override
protected void beforeActivityLaunched() {
super.beforeActivityLaunched();
accountManager.deleteAccount();
accountManager.createAccount(USERNAME, PASSWORD);
}
}
}

View File

@@ -0,0 +1,25 @@
package org.briarproject.briar.android;
import org.briarproject.bramble.BrambleAndroidModule;
import org.briarproject.bramble.BrambleCoreModule;
import org.briarproject.bramble.account.BriarAccountModule;
import org.briarproject.briar.BriarCoreModule;
import org.briarproject.briar.android.navdrawer.NavDrawerActivityTest;
import javax.inject.Singleton;
import dagger.Component;
@Singleton
@Component(modules = {
AppModule.class,
BriarCoreModule.class,
BrambleAndroidModule.class,
BriarAccountModule.class,
BrambleCoreModule.class
})
public interface BriarUiTestComponent extends AndroidComponent {
void inject(NavDrawerActivityTest test);
}

View File

@@ -6,8 +6,8 @@ import android.view.Gravity;
import org.briarproject.briar.R;
import org.briarproject.briar.android.BriarUiTestComponent;
import org.briarproject.briar.android.UiTest;
import org.briarproject.briar.android.settings.SettingsActivity;
import org.briarproject.briar.android.test.ScreenshotTest;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -23,7 +23,7 @@ import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
@RunWith(AndroidJUnit4.class)
public class NavDrawerActivityTest extends ScreenshotTest {
public class NavDrawerActivityTest extends UiTest {
@Rule
public CleanAccountTestRule<NavDrawerActivity> testRule =

View File

@@ -4,8 +4,7 @@ import org.briarproject.bramble.BrambleAndroidModule;
import org.briarproject.bramble.BrambleCoreModule;
import org.briarproject.bramble.account.BriarAccountModule;
import org.briarproject.briar.BriarCoreModule;
import org.briarproject.briar.android.login.SetupActivityScreenshotTest;
import org.briarproject.briar.android.navdrawer.NavDrawerActivityTest;
import org.briarproject.briar.android.contact.ConversationActivityScreenshotTest;
import org.briarproject.briar.android.settings.SettingsActivityScreenshotTest;
import javax.inject.Singleton;
@@ -22,8 +21,9 @@ import dagger.Component;
})
public interface BriarUiTestComponent extends AndroidComponent {
void inject(SetupActivityScreenshotTest test);
void inject(NavDrawerActivityTest test);
void inject(SetupDataTest test);
void inject(ConversationActivityScreenshotTest test);
void inject(SettingsActivityScreenshotTest test);
}

View File

@@ -0,0 +1,45 @@
package org.briarproject.briar.android;
import android.app.Activity;
import android.util.Log;
import org.briarproject.bramble.api.plugin.ConnectionRegistry;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.briar.api.test.TestDataCreator;
import org.junit.ClassRule;
import javax.inject.Inject;
import tools.fastlane.screengrab.FalconScreenshotStrategy;
import tools.fastlane.screengrab.Screengrab;
import tools.fastlane.screengrab.locale.LocaleTestRule;
public abstract class ScreenshotTest extends UiTest {
@ClassRule
public static final LocaleTestRule localeTestRule = new LocaleTestRule();
@Inject
protected TestDataCreator testDataCreator;
@Inject
protected ConnectionRegistry connectionRegistry;
@Inject
protected Clock clock;
protected void screenshot(String name, Activity activity) {
try {
Screengrab.screenshot(name, new FalconScreenshotStrategy(activity));
} catch (RuntimeException e) {
if (!e.getMessage().equals("Unable to capture screenshot."))
throw e;
// The tests should still pass when run from AndroidStudio
// without manually granting permissions like fastlane does.
Log.w("Screengrab", "Permission to write screenshot is missing.");
}
}
protected long getMinutesAgo(int minutes) {
return clock.currentTimeMillis() - minutes * 60 * 1000;
}
}

View File

@@ -1,4 +1,4 @@
package org.briarproject.briar.android.login;
package org.briarproject.briar.android;
import android.support.test.espresso.intent.rule.IntentsTestRule;
import android.support.test.runner.AndroidJUnit4;
@@ -6,9 +6,12 @@ import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiSelector;
import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.briar.R;
import org.briarproject.briar.android.BriarUiTestComponent;
import org.briarproject.briar.android.test.ScreenshotTest;
import org.briarproject.briar.android.login.OpenDatabaseActivity;
import org.briarproject.briar.android.login.SetupActivity;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -26,14 +29,14 @@ import static android.support.test.espresso.matcher.ViewMatchers.isRoot;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static android.support.test.runner.lifecycle.Stage.PAUSED;
import static junit.framework.Assert.assertTrue;
import static org.briarproject.briar.android.test.ViewActions.waitForActivity;
import static org.briarproject.briar.android.test.ViewActions.waitUntilMatches;
import static org.briarproject.bramble.api.plugin.LanTcpConstants.ID;
import static org.briarproject.briar.android.ViewActions.waitForActivity;
import static org.briarproject.briar.android.ViewActions.waitUntilMatches;
import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting;
import static org.junit.Assert.assertTrue;
@RunWith(AndroidJUnit4.class)
public class SetupActivityScreenshotTest extends ScreenshotTest {
public class SetupDataTest extends ScreenshotTest {
@Rule
public IntentsTestRule<SetupActivity> testRule =
@@ -61,7 +64,7 @@ public class SetupActivityScreenshotTest extends ScreenshotTest {
onView(withId(R.id.nickname_entry))
.perform(waitUntilMatches(withText(USERNAME)));
screenshot("manual_create_account");
screenshot("manual_create_account", testRule.getActivity());
onView(withId(R.id.next))
.check(matches(isDisplayed()))
@@ -94,13 +97,54 @@ public class SetupActivityScreenshotTest extends ScreenshotTest {
}
// wait for OpenDatabaseActivity to show up
onView(withId(R.id.progress))
.check(matches(isDisplayed()));
onView(isRoot())
.perform(waitForActivity(testRule.getActivity(), PAUSED));
intended(hasComponent(OpenDatabaseActivity.class.getName()));
assertTrue(accountManager.hasDatabaseKey());
lifecycleManager.waitForStartup();
createTestData();
// close expiry warning
onView(withId(R.id.expiryWarning))
.perform(waitUntilMatches(isDisplayed()));
onView(withId(R.id.expiryWarningClose))
.check(matches(isDisplayed()));
onView(withId(R.id.expiryWarningClose))
.perform(click());
}
private void createTestData() {
try {
createTestDataExceptions();
} catch (DbException | FormatException e) {
throw new AssertionError(e);
}
}
private void createTestDataExceptions()
throws DbException, FormatException {
String bobName =
getTargetContext().getString(R.string.screenshot_bob);
Contact bob = testDataCreator.addContact(bobName);
String bobHi = getTargetContext()
.getString(R.string.screenshot_message_1);
long bobTime = getMinutesAgo(2);
testDataCreator.addPrivateMessage(bob, bobHi, bobTime, true);
String aliceHi = getTargetContext()
.getString(R.string.screenshot_message_2);
long aliceTime = getMinutesAgo(1);
testDataCreator.addPrivateMessage(bob, aliceHi, aliceTime, false);
String bobHi2 = getTargetContext()
.getString(R.string.screenshot_message_3);
long bobTime2 = getMinutesAgo(0);
testDataCreator.addPrivateMessage(bob, bobHi2, bobTime2, true);
connectionRegistry.registerConnection(bob.getId(), ID, true);
}
}

View File

@@ -0,0 +1,52 @@
package org.briarproject.briar.android.contact;
import android.content.Context;
import android.content.Intent;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import org.briarproject.briar.R;
import org.briarproject.briar.android.BriarUiTestComponent;
import org.briarproject.briar.android.ScreenshotTest;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static android.support.test.InstrumentationRegistry.getInstrumentation;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.briarproject.briar.android.ViewActions.waitUntilMatches;
import static org.briarproject.briar.android.contact.ConversationActivity.CONTACT_ID;
import static org.hamcrest.Matchers.allOf;
@RunWith(AndroidJUnit4.class)
public class ConversationActivityScreenshotTest extends ScreenshotTest {
@Rule
public ActivityTestRule<ConversationActivity> testRule =
new ActivityTestRule<>(ConversationActivity.class, false, false);
@Override
protected void inject(BriarUiTestComponent component) {
component.inject(this);
}
@Test
public void messaging() throws Exception {
Context targetContext = getInstrumentation().getTargetContext();
Intent intent = new Intent(targetContext, ConversationActivity.class);
intent.putExtra(CONTACT_ID, 1);
testRule.launchActivity(intent);
onView(withId(R.id.conversationView))
.perform(waitUntilMatches(allOf(
withText(R.string.screenshot_message_3),
isCompletelyDisplayed())
));
screenshot("manual_messaging", testRule.getActivity());
}
}

View File

@@ -2,14 +2,15 @@ package org.briarproject.briar.android.settings;
import android.content.Intent;
import android.support.test.espresso.contrib.DrawerActions;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import org.briarproject.briar.R;
import org.briarproject.briar.android.BriarUiTestComponent;
import org.briarproject.briar.android.ScreenshotTest;
import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
import org.briarproject.briar.android.test.ScreenshotTest;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -26,15 +27,15 @@ import static android.support.test.espresso.matcher.ViewMatchers.withChild;
import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.briarproject.briar.android.test.ViewActions.waitUntilMatches;
import static org.briarproject.briar.android.ViewActions.waitUntilMatches;
import static org.hamcrest.CoreMatchers.is;
@RunWith(AndroidJUnit4.class)
public class SettingsActivityScreenshotTest extends ScreenshotTest {
@Rule
public CleanAccountTestRule<SettingsActivity> testRule =
new CleanAccountTestRule<>(SettingsActivity.class);
public ActivityTestRule<SettingsActivity> testRule =
new ActivityTestRule<>(SettingsActivity.class);
@Override
protected void inject(BriarUiTestComponent component) {
@@ -46,7 +47,7 @@ public class SettingsActivityScreenshotTest extends ScreenshotTest {
onView(withText(R.string.settings_button))
.check(matches(isDisplayed()));
screenshot("manual_dark_theme_settings");
screenshot("manual_dark_theme_settings", testRule.getActivity());
// switch to dark theme
onView(withText(R.string.pref_theme_title))
@@ -56,10 +57,20 @@ public class SettingsActivityScreenshotTest extends ScreenshotTest {
.check(matches(isDisplayed()))
.perform(click());
// open nav drawer and remove expiry warning
openNavDrawer(true);
openNavDrawer();
screenshot("manual_dark_theme_nav_drawer");
screenshot("manual_dark_theme_nav_drawer", testRule.getActivity());
// switch to back to light theme
onView(withText(R.string.settings_button))
.check(matches(isDisplayed()))
.perform(click());
onView(withText(R.string.pref_theme_title))
.check(matches(isDisplayed()))
.perform(click());
onView(withText(R.string.pref_theme_light))
.check(matches(isDisplayed()))
.perform(click());
}
@Test
@@ -83,12 +94,11 @@ public class SettingsActivityScreenshotTest extends ScreenshotTest {
.check(matches(isDisplayed()))
.check(matches(isEnabled()));
screenshot("manual_app_lock");
screenshot("manual_app_lock", testRule.getActivity());
// no more expiry warning to remove, because sharedprefs cached?
openNavDrawer(false);
openNavDrawer();
screenshot("manual_app_lock_nav_drawer");
screenshot("manual_app_lock_nav_drawer", testRule.getActivity());
}
@Test
@@ -104,23 +114,15 @@ public class SettingsActivityScreenshotTest extends ScreenshotTest {
.check(matches(isDisplayed()))
.perform(waitUntilMatches(isEnabled()));
screenshot("manual_tor_settings");
screenshot("manual_tor_settings", testRule.getActivity());
}
private void openNavDrawer(boolean expiry) {
private void openNavDrawer() {
// start main activity
Intent i =
new Intent(testRule.getActivity(), NavDrawerActivity.class);
testRule.getActivity().startActivity(i);
// close expiry warning
if (expiry) {
onView(withId(R.id.expiryWarningClose))
.check(matches(isDisplayed()));
onView(withId(R.id.expiryWarningClose))
.perform(click());
}
// open navigation drawer
onView(withId(R.id.drawer_layout))
.check(matches(isClosed(Gravity.START)))

View File

@@ -0,0 +1,84 @@
package org.briarproject.briar.android.panic;
import info.guardianproject.trustedintents.ApkSignaturePin;
// needs to be public, because TrustedIntents will instantiate
public final class FDroidSignaturePin extends ApkSignaturePin {
public FDroidSignaturePin() {
this.fingerprints = new String[] {
"927f7e38b6acbecd84e02dace33efa9a7a2f0979750f28f585688ee38b3a4e28"};
this.certificates = new byte[][] {
{48, -126, 3, 95, 48, -126, 2, 71, -96, 3, 2, 1, 2, 2, 4, 28,
-30, 107, -102, 48, 13, 6, 9, 42, -122, 72, -122, -9,
13, 1, 1, 11, 5, 0, 48, 96, 49, 11, 48, 9, 6, 3, 85, 4,
6, 19, 2, 85, 75, 49, 12, 48, 10, 6, 3, 85, 4, 8, 19, 3,
79, 82, 71, 49, 12, 48, 10, 6, 3, 85, 4, 7, 19, 3, 79,
82, 71, 49, 19, 48, 17, 6, 3, 85, 4, 10, 19, 10, 102,
100, 114, 111, 105, 100, 46, 111, 114, 103, 49, 15, 48,
13, 6, 3, 85, 4, 11, 19, 6, 70, 68, 114, 111, 105, 100,
49, 15, 48, 13, 6, 3, 85, 4, 3, 19, 6, 70, 68, 114, 111,
105, 100, 48, 30, 23, 13, 49, 55, 49, 50, 48, 55, 49,
55, 51, 48, 52, 50, 90, 23, 13, 52, 53, 48, 52, 50, 52,
49, 55, 51, 48, 52, 50, 90, 48, 96, 49, 11, 48, 9, 6, 3,
85, 4, 6, 19, 2, 85, 75, 49, 12, 48, 10, 6, 3, 85, 4, 8,
19, 3, 79, 82, 71, 49, 12, 48, 10, 6, 3, 85, 4, 7, 19,
3, 79, 82, 71, 49, 19, 48, 17, 6, 3, 85, 4, 10, 19, 10,
102, 100, 114, 111, 105, 100, 46, 111, 114, 103, 49, 15,
48, 13, 6, 3, 85, 4, 11, 19, 6, 70, 68, 114, 111, 105,
100, 49, 15, 48, 13, 6, 3, 85, 4, 3, 19, 6, 70, 68, 114,
111, 105, 100, 48, -126, 1, 34, 48, 13, 6, 9, 42, -122,
72, -122, -9, 13, 1, 1, 1, 5, 0, 3, -126, 1, 15, 0, 48,
-126, 1, 10, 2, -126, 1, 1, 0, -107, -115, -106, 1, -26,
72, -105, -99, 62, 3, -55, 34, 99, -112, -68, -20, -115,
31, 34, 118, -50, 12, -32, -59, 74, -58, -37, -87, 21,
105, 36, -82, 13, -51, 66, 4, 55, -111, 13, -46, -7,
-69, -15, 36, 118, -7, 101, -86, 123, -83, -103, 110,
116, -54, 112, 46, 12, 96, -76, -48, -70, -33, -81, 52,
59, 73, 107, -126, -72, -25, 32, 93, 29, -20, 5, -41,
-27, 123, -9, 104, -31, -59, -1, -83, -93, 99, 85, -116,
-62, -55, 18, -63, 6, -51, -110, 33, 9, 7, -49, 102,
-20, -122, -124, -68, 93, -102, 31, 48, 86, 96, -99,
105, -52, 95, 12, 57, 99, 12, -24, 70, 40, -99, -20,
-21, -85, -70, -105, 95, 117, -31, 126, -126, -39, 46,
-62, 59, -23, -74, 108, -12, -56, -40, -96, 79, -37,
-82, 1, 99, -104, 48, -60, 92, 14, 109, 127, -22, 31,
115, -27, 108, 9, 92, 118, -45, 103, 117, 57, -50, -82,
114, -113, 68, -82, 87, 96, 111, 72, 65, -63, 12, 31,
-34, -31, -55, -101, 101, 101, 59, 73, -119, -122, 82,
28, 47, -108, -85, 59, 46, 89, -93, -1, 9, -11, -51, 63,
-44, 109, -76, -103, -26, -49, -80, 6, 52, -27, 73,
-104, 40, 2, -101, -124, 60, -52, -105, -70, -24, -62,
88, 38, 53, -99, -92, 31, 119, 26, 79, 60, -124, 25,
-115, -89, -115, -109, 0, 6, 122, -78, 116, 82, 3, 39,
-67, 45, -43, 17, -39, 2, 3, 1, 0, 1, -93, 33, 48, 31,
48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 63, 109, -42,
-109, 25, 22, 7, -37, -22, -41, -38, 58, -56, 2, -68,
-38, -22, 65, -28, -60, 48, 13, 6, 9, 42, -122, 72,
-122, -9, 13, 1, 1, 11, 5, 0, 3, -126, 1, 1, 0, 94, 17,
31, 36, 85, -11, 85, 44, 19, -80, -20, -92, -118, 93,
40, 45, 96, 31, -3, -37, -110, -96, 102, 81, 61, -74,
-125, -117, -112, 58, -47, 17, 78, -18, 111, -116, 26,
-91, 73, 100, 84, -99, 21, 87, 73, -106, 108, -51, -125,
-21, 119, -88, -78, 2, 82, -109, -64, -9, -86, -112,
-115, 66, -86, 46, 71, 107, -65, 96, -102, 47, 35, -45,
-126, 33, 34, 121, -25, -85, -121, -56, -42, 22, -1,
-95, -86, 81, 100, -70, 113, 104, -73, 22, -19, 79, -19,
52, 62, 42, 76, -112, 94, -34, 42, -57, -75, -90, -58,
118, 127, -106, -39, 108, -56, -79, 103, -33, 22, 3, 47,
103, -76, -81, 53, -22, -44, -26, -102, 63, -99, 39, 38,
-108, 75, 33, 10, 25, -110, -125, -115, 114, -69, 73,
-112, 36, 74, 77, -82, -44, 29, -123, -8, -117, 71,
-105, 15, -109, 51, 22, 4, 80, 1, 43, 118, 121, -113,
-70, 83, -56, 82, -110, 4, -63, 16, -57, 126, -70, 81,
73, 61, 2, -61, 24, -14, -10, 4, -21, 90, 24, 66, 41,
-57, -60, -113, -18, -54, -1, 103, -75, 32, -64, 67,
103, 109, -79, -12, -113, -27, 114, 89, 116, 115, -13,
-123, -70, 61, -41, -46, -118, 29, -105, -97, -75, 39,
-51, 60, 88, 125, 55, -46, -95, 52, 57, 52, -115, 80,
44, 109, 119, -116, -62, -77, -74, -88, 41, 57, -65,
-71, -115, -67, 23, 66, -21, 56, 51, -91, 109}};
}
}

View File

@@ -31,13 +31,12 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat
public static final String KEY_LOCK = "pref_key_lock";
public static final String KEY_PANIC_APP = "pref_key_panic_app";
public static final String KEY_PURGE = "pref_key_purge";
public static final String KEY_UNINSTALL = "pref_key_uninstall";
private static final Logger LOG =
Logger.getLogger(PanicPreferencesFragment.class.getName());
private PackageManager pm;
private SwitchPreference lockPref, purgePref, uninstallPref;
private SwitchPreference lockPref, purgePref;
private ListPreference panicAppPref;
@Override
@@ -49,7 +48,6 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat
lockPref = (SwitchPreference) findPreference(KEY_LOCK);
panicAppPref = (ListPreference) findPreference(KEY_PANIC_APP);
purgePref = (SwitchPreference) findPreference(KEY_PURGE);
uninstallPref = (SwitchPreference) findPreference(KEY_UNINSTALL);
// check for connect/disconnect intents from panic trigger apps
if (PanicResponder.checkForDisconnectIntent(getActivity())) {
@@ -97,16 +95,11 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat
showPanicApp(packageName);
if (packageName.equals(Panic.PACKAGE_NAME_NONE)) {
lockPref.setEnabled(false);
purgePref.setChecked(false);
purgePref.setEnabled(false);
uninstallPref.setChecked(false);
uninstallPref.setEnabled(false);
getActivity().setResult(Activity.RESULT_CANCELED);
} else {
lockPref.setEnabled(true);
purgePref.setEnabled(true);
uninstallPref.setEnabled(true);
}
return true;
@@ -145,27 +138,15 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
if (key.equals(KEY_PURGE)) {
// enable locking if purging gets enabled
if (sharedPreferences.getBoolean(KEY_PURGE, false)) {
lockPref.setChecked(true);
}
// disable uninstall if purging gets disabled
else {
uninstallPref.setChecked(false);
}
}
// enable purging and locking if uninstall gets enabled
if (key.equals(KEY_UNINSTALL) &&
sharedPreferences.getBoolean(KEY_UNINSTALL, false)) {
// enable locking if purging gets enabled
if (key.equals(KEY_PURGE) &&
sharedPreferences.getBoolean(KEY_PURGE, false)) {
lockPref.setChecked(true);
purgePref.setChecked(true);
}
// disable purging and uninstalling if locking gets disabled
// disable purging if locking gets disabled
if (key.equals(KEY_LOCK) &&
!sharedPreferences.getBoolean(KEY_LOCK, true)) {
purgePref.setChecked(false);
uninstallPref.setChecked(false);
}
}
@@ -179,10 +160,8 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat
panicAppPref.setIcon(
android.R.drawable.ic_menu_close_clear_cancel);
// disable panic actions
lockPref.setEnabled(false);
// disable destructive panic actions
purgePref.setEnabled(false);
uninstallPref.setEnabled(false);
} else {
// display connected panic app
try {
@@ -192,10 +171,8 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat
panicAppPref.setIcon(
pm.getApplicationIcon(triggerPackageName));
// enable panic actions
lockPref.setEnabled(true);
// enable destructive panic actions
purgePref.setEnabled(true);
uninstallPref.setEnabled(true);
} catch (PackageManager.NameNotFoundException e) {
// revert back to no app, just to be safe
PanicResponder.setTriggerPackageName(getActivity(),

View File

@@ -2,7 +2,6 @@ package org.briarproject.briar.android.panic;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.preference.PreferenceManager;
@@ -11,7 +10,6 @@ import org.briarproject.bramble.api.account.AccountManager;
import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity;
import org.iilab.IilabEngineeringRSA2048Pin;
import java.util.logging.Logger;
@@ -22,10 +20,8 @@ import info.guardianproject.panic.Panic;
import info.guardianproject.panic.PanicResponder;
import info.guardianproject.trustedintents.TrustedIntents;
import static android.content.Intent.ACTION_DELETE;
import static org.briarproject.briar.android.panic.PanicPreferencesFragment.KEY_LOCK;
import static org.briarproject.briar.android.panic.PanicPreferencesFragment.KEY_PURGE;
import static org.briarproject.briar.android.panic.PanicPreferencesFragment.KEY_UNINSTALL;
public class PanicResponderActivity extends BriarActivity {
@@ -44,8 +40,8 @@ public class PanicResponderActivity extends BriarActivity {
TrustedIntents trustedIntents = TrustedIntents.get(this);
// Guardian Project Ripple
trustedIntents.addTrustedSigner(GuardianProjectRSA4096.class);
// Amnesty International's Panic Button, made by iilab.org
trustedIntents.addTrustedSigner(IilabEngineeringRSA2048Pin.class);
// F-Droid
trustedIntents.addTrustedSigner(FDroidSignaturePin.class);
Intent intent = trustedIntents.getIntentFromTrustedSender(this);
if (intent != null) {
@@ -60,23 +56,16 @@ public class PanicResponderActivity extends BriarActivity {
LOG.info("Panic Trigger came from connected app");
// Performing panic responses
if (sharedPref.getBoolean(KEY_UNINSTALL, false)) {
if (sharedPref.getBoolean(KEY_PURGE, false)) {
LOG.info("Purging all data...");
deleteAllData();
LOG.info("Uninstalling...");
Intent uninstall = new Intent(ACTION_DELETE);
uninstall.setData(
Uri.parse("package:" + getPackageName()));
startActivity(uninstall);
} else if (sharedPref.getBoolean(KEY_PURGE, false)) {
LOG.info("Purging all data...");
deleteAllData();
} else if (sharedPref.getBoolean(KEY_LOCK, true)) {
LOG.info("Signing out...");
signOut(true);
}
}
// non-destructive actions are allowed by non-connected trusted apps
if (sharedPref.getBoolean(KEY_LOCK, true)) {
LOG.info("Signing out...");
signOut(true);
}
}
}

View File

@@ -2,7 +2,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:autoMirrored="true"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path

View File

@@ -2,7 +2,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:autoMirrored="true"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path

View File

@@ -2,7 +2,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:autoMirrored="true"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path

View File

@@ -2,7 +2,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:autoMirrored="true"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path

View File

@@ -28,6 +28,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_large"
android:layout_marginLeft="@dimen/margin_large"
android:layout_marginRight="@dimen/margin_large"
android:layout_marginStart="@dimen/margin_large"
android:layout_marginTop="@dimen/margin_large"
app:hintEnabled="false"
@@ -50,6 +52,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_large"
android:layout_marginLeft="@dimen/margin_large"
android:layout_marginRight="@dimen/margin_large"
android:layout_marginStart="@dimen/margin_large"
app:hintEnabled="false"
app:layout_constraintEnd_toEndOf="parent"

View File

@@ -40,6 +40,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_medium"
android:layout_marginLeft="@dimen/margin_medium"
android:layout_marginRight="@dimen/margin_medium"
android:layout_marginStart="@dimen/margin_medium"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_small"

View File

@@ -9,6 +9,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/margin_activity_horizontal"
android:layout_marginStart="@dimen/margin_activity_horizontal"
android:layout_marginTop="@dimen/margin_activity_vertical"
android:checked="false"
android:text="@string/don_t_ask_again"/>

View File

@@ -11,6 +11,8 @@
android:layout_width="128dp"
android:layout_height="128dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:src="@drawable/alerts_and_states_error"
@@ -25,6 +27,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="@string/sorry"

View File

@@ -27,6 +27,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_large"
android:layout_marginLeft="@dimen/margin_large"
android:layout_marginRight="@dimen/margin_large"
android:layout_marginStart="@dimen/margin_large"
android:layout_marginTop="@dimen/margin_medium"
android:gravity="center"
@@ -66,6 +68,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_large"
android:layout_marginLeft="@dimen/margin_large"
android:layout_marginRight="@dimen/margin_large"
android:layout_marginStart="@dimen/margin_large"
android:layout_marginTop="@dimen/margin_medium"
android:gravity="center"

View File

@@ -19,6 +19,8 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/listitem_horizontal_margin"
android:layout_marginEnd="@dimen/listitem_vertical_margin"
android:layout_marginLeft="@dimen/listitem_vertical_margin"
android:layout_marginRight="@dimen/listitem_vertical_margin"
android:layout_marginStart="@dimen/listitem_vertical_margin"
android:layout_marginTop="@dimen/listitem_vertical_margin"
app:layout_constraintEnd_toStartOf="@+id/commentView"
@@ -32,10 +34,11 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/listitem_horizontal_margin"
android:layout_marginEnd="@dimen/listitem_vertical_margin"
android:layout_marginLeft="@dimen/listitem_vertical_margin"
android:layout_marginRight="@dimen/listitem_vertical_margin"
android:layout_marginStart="@dimen/listitem_vertical_margin"
android:layout_marginTop="@dimen/listitem_vertical_margin"
app:layout_constraintEnd_toStartOf="@+id/commentView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/rebloggerView"/>

View File

@@ -48,6 +48,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_medium"
android:layout_marginLeft="@dimen/margin_medium"
android:layout_marginRight="@dimen/margin_medium"
android:layout_marginStart="@dimen/margin_medium"
android:layout_marginTop="@dimen/listitem_vertical_margin"
android:paddingEnd="@dimen/margin_medium"
@@ -67,6 +69,8 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/listitem_vertical_margin"
android:layout_marginEnd="@dimen/margin_medium"
android:layout_marginLeft="@dimen/margin_medium"
android:layout_marginRight="@dimen/margin_medium"
android:layout_marginStart="@dimen/margin_medium"
android:paddingEnd="@dimen/margin_medium"
android:paddingStart="@dimen/margin_medium"

View File

@@ -24,6 +24,8 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/margin_medium"
android:layout_marginLeft="@dimen/margin_medium"
android:layout_marginRight="@dimen/margin_medium"
android:layout_marginStart="@dimen/margin_medium"
android:layout_weight="1"
android:maxLines="2"

View File

@@ -5,11 +5,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/message_bubble_margin"
android:layout_marginEnd="@dimen/message_bubble_margin_non_tail"
android:layout_marginLeft="@dimen/message_bubble_margin_tail"
android:layout_marginRight="@dimen/message_bubble_margin_non_tail"
android:layout_marginStart="@dimen/message_bubble_margin_tail"
android:layout_marginTop="@dimen/message_bubble_margin"
android:orientation="vertical">
@@ -18,6 +13,10 @@
style="@style/TextMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/message_bubble_margin_non_tail"
android:layout_marginLeft="@dimen/message_bubble_margin_tail"
android:layout_marginRight="@dimen/message_bubble_margin_non_tail"
android:layout_marginStart="@dimen/message_bubble_margin_tail"
android:background="@drawable/msg_in_top"
android:elevation="@dimen/message_bubble_elevation"
tools:text="Short message"/>
@@ -26,6 +25,11 @@
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/message_bubble_margin"
android:layout_marginEnd="@dimen/message_bubble_margin_non_tail"
android:layout_marginLeft="@dimen/message_bubble_margin_tail"
android:layout_marginRight="@dimen/message_bubble_margin_non_tail"
android:layout_marginStart="@dimen/message_bubble_margin_tail"
android:background="@drawable/notice_in_bottom"
android:elevation="@dimen/message_bubble_elevation">

View File

@@ -5,11 +5,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/message_bubble_margin"
android:layout_marginEnd="@dimen/message_bubble_margin_tail"
android:layout_marginLeft="@dimen/message_bubble_margin_non_tail"
android:layout_marginRight="@dimen/message_bubble_margin_tail"
android:layout_marginStart="@dimen/message_bubble_margin_non_tail"
android:layout_marginTop="@dimen/message_bubble_margin"
android:orientation="vertical">
@@ -18,6 +13,10 @@
style="@style/TextMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/message_bubble_margin_tail"
android:layout_marginLeft="@dimen/message_bubble_margin_non_tail"
android:layout_marginRight="@dimen/message_bubble_margin_tail"
android:layout_marginStart="@dimen/message_bubble_margin_non_tail"
android:background="@drawable/msg_out_top"
android:elevation="@dimen/message_bubble_elevation"
android:textColor="@color/briar_text_primary_inverse"
@@ -27,6 +26,11 @@
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/message_bubble_margin"
android:layout_marginEnd="@dimen/message_bubble_margin_tail"
android:layout_marginLeft="@dimen/message_bubble_margin_non_tail"
android:layout_marginRight="@dimen/message_bubble_margin_tail"
android:layout_marginStart="@dimen/message_bubble_margin_non_tail"
android:background="@drawable/notice_out_bottom"
android:elevation="@dimen/message_bubble_elevation">

View File

@@ -5,11 +5,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/message_bubble_margin"
android:layout_marginEnd="@dimen/message_bubble_margin_non_tail"
android:layout_marginLeft="@dimen/message_bubble_margin_tail"
android:layout_marginRight="@dimen/message_bubble_margin_non_tail"
android:layout_marginStart="@dimen/message_bubble_margin_tail"
android:layout_marginTop="@dimen/message_bubble_margin"
android:orientation="vertical">
@@ -18,6 +13,10 @@
style="@style/TextMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/message_bubble_margin_non_tail"
android:layout_marginLeft="@dimen/message_bubble_margin_tail"
android:layout_marginRight="@dimen/message_bubble_margin_non_tail"
android:layout_marginStart="@dimen/message_bubble_margin_tail"
android:background="@drawable/msg_in_top"
android:elevation="@dimen/message_bubble_elevation"
android:textColor="?android:attr/textColorPrimary"
@@ -27,6 +26,11 @@
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/message_bubble_margin"
android:layout_marginEnd="@dimen/message_bubble_margin_non_tail"
android:layout_marginLeft="@dimen/message_bubble_margin_tail"
android:layout_marginRight="@dimen/message_bubble_margin_non_tail"
android:layout_marginStart="@dimen/message_bubble_margin_tail"
android:background="@drawable/notice_in_bottom"
android:elevation="@dimen/message_bubble_elevation">

View File

@@ -22,6 +22,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/listitem_horizontal_margin"
android:layout_marginLeft="@dimen/listitem_horizontal_margin"
android:layout_marginRight="@dimen/listitem_horizontal_margin"
android:layout_marginStart="@dimen/listitem_horizontal_margin"
android:layout_marginTop="@dimen/listitem_horizontal_margin"
android:textColor="?android:attr/textColorPrimary"

View File

@@ -47,6 +47,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/listitem_horizontal_margin"
android:layout_marginLeft="@dimen/listitem_horizontal_margin"
android:layout_marginRight="@dimen/listitem_horizontal_margin"
android:layout_marginStart="@dimen/listitem_horizontal_margin"
android:layout_marginTop="@dimen/margin_medium"
android:textColor="?android:attr/textColorSecondary"
@@ -75,6 +77,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/listitem_horizontal_margin"
android:layout_marginLeft="@dimen/listitem_horizontal_margin"
android:layout_marginRight="@dimen/listitem_horizontal_margin"
android:layout_marginStart="@dimen/listitem_horizontal_margin"
android:layout_marginTop="@dimen/margin_medium"
android:textColor="?android:attr/textColorTertiary"

View File

@@ -20,6 +20,7 @@
android:layout_height="wrap_content"
android:layout_margin="@dimen/listitem_horizontal_margin"
android:layout_marginLeft="@dimen/listitem_horizontal_margin"
android:layout_marginStart="@dimen/listitem_horizontal_margin"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_medium"
app:layout_constraintEnd_toEndOf="parent"
@@ -46,6 +47,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/listitem_horizontal_margin"
android:layout_marginLeft="@dimen/listitem_horizontal_margin"
android:layout_marginRight="@dimen/listitem_horizontal_margin"
android:layout_marginStart="@dimen/listitem_horizontal_margin"
android:layout_marginTop="@dimen/margin_medium"
android:text="@string/forum_invitation_exists"

View File

@@ -23,6 +23,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/listitem_horizontal_margin"
android:layout_marginLeft="@dimen/listitem_horizontal_margin"
android:layout_marginRight="@dimen/listitem_horizontal_margin"
android:layout_marginStart="@dimen/listitem_horizontal_margin"
android:layout_marginTop="@dimen/listitem_vertical_margin"
android:textColor="?android:attr/textColorPrimary"
@@ -51,6 +53,8 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/listitem_vertical_margin"
android:layout_marginEnd="@dimen/margin_small"
android:layout_marginLeft="@dimen/margin_small"
android:layout_marginRight="@dimen/margin_small"
android:layout_marginStart="@dimen/margin_small"
android:text="@string/groups_reveal_visible"
android:textColor="?android:attr/textColorSecondary"

View File

@@ -116,6 +116,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/listitem_horizontal_margin"
android:layout_marginLeft="@dimen/listitem_horizontal_margin"
android:layout_marginRight="@dimen/listitem_horizontal_margin"
android:layout_marginStart="@dimen/listitem_horizontal_margin"
android:layout_marginTop="@dimen/margin_medium"
android:textColor="?android:attr/textColorSecondary"

View File

@@ -24,6 +24,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/listitem_horizontal_margin"
android:layout_marginLeft="@dimen/listitem_horizontal_margin"
android:layout_marginRight="@dimen/listitem_horizontal_margin"
android:layout_marginStart="@dimen/listitem_horizontal_margin"
android:layout_marginTop="@dimen/listitem_horizontal_margin"
android:textColor="?android:attr/textColorPrimary"
@@ -41,6 +43,8 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/listitem_horizontal_margin"
android:layout_marginEnd="@dimen/listitem_horizontal_margin"
android:layout_marginLeft="@dimen/listitem_horizontal_margin"
android:layout_marginRight="@dimen/listitem_horizontal_margin"
android:layout_marginStart="@dimen/listitem_horizontal_margin"
android:maxLines="2"
android:text="@string/forum_invitation_already_sharing"

View File

@@ -96,6 +96,8 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_medium"
android:layout_marginEnd="@dimen/margin_medium"
android:layout_marginLeft="@dimen/margin_medium"
android:layout_marginRight="@dimen/margin_medium"
android:layout_marginStart="@dimen/margin_medium"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btn_reply"
@@ -109,6 +111,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_medium"
android:layout_marginLeft="@dimen/margin_medium"
android:layout_marginRight="@dimen/margin_medium"
android:layout_marginStart="@dimen/margin_medium"
android:text="@string/btn_reply"
android:textSize="@dimen/text_size_tiny"

View File

@@ -13,6 +13,8 @@
android:layout_gravity="bottom|start"
android:layout_marginBottom="@dimen/margin_medium"
android:layout_marginEnd="@dimen/margin_medium"
android:layout_marginLeft="@dimen/margin_medium"
android:layout_marginRight="@dimen/margin_medium"
android:layout_marginStart="@dimen/margin_medium"
android:contentDescription="@string/app_name"
android:src="@drawable/navigation_drawer_header"/>

View File

@@ -12,6 +12,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_large"
android:layout_marginLeft="@dimen/margin_large"
android:layout_marginRight="@dimen/margin_large"
android:layout_marginStart="@dimen/margin_large"
android:layout_marginTop="@dimen/margin_medium"
android:textSize="@dimen/text_size_medium"

View File

@@ -17,6 +17,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginEnd="@dimen/listitem_picture_frame_offset_horizontal"
android:layout_marginRight="@dimen/listitem_picture_frame_offset_horizontal"
android:layout_marginTop="@dimen/listitem_picture_frame_offset_vertical"
android:maxLength="1"

View File

@@ -12,6 +12,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_medium"
android:layout_marginLeft="@dimen/margin_medium"
android:layout_marginRight="@dimen/margin_medium"
android:layout_marginStart="@dimen/margin_medium"
android:layout_marginTop="@dimen/margin_medium"
android:elevation="@dimen/cardview_default_elevation"

View File

@@ -149,7 +149,6 @@
<string name="contact_added_toast">تم إضافة جهة إتصال: %s</string>
<string name="contact_already_exists">جهة الإتصال %s بالفعل موجودة</string>
<string name="qr_code_invalid">رمز QR غير صالح</string>
<string name="qr_code_unsupported">رمز QR الذي تحاول مسحه يعود لإصدار قديم من %s لم يعد مدعومًا.\n\nمن فضلك تأكد أن كليكما يستخدم آخر إصدار ثم حاول مجددًا.</string>
<string name="camera_error">خطأ بالكاميرا</string>
<string name="connecting_to_device">يتم الإتصال بالجهاز\u2026</string>
<string name="authenticating_with_device">يتم التوثيق مع الجهاز\u2026</string>
@@ -379,10 +378,8 @@
<string name="tor_mobile_data_title">إستخدم بيانات الجوال</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">الأمان</string>
<string name="pref_lock_title">قفل الشاشة</string>
<string name="pref_lock_summary">استخدم قفل شاشة الجهاز لحماية Briar (براير) في حال تسجيل الدخول</string>
<string name="pref_lock_disabled_summary">لاستخدام هذه الميزة، قم بإعداد قفل شاشة لجهازك</string>
<string name="pref_lock_timeout_title">زمن قفل الشاشة عند عدم النشاط</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">حينما لا تستخدم Briar (براير)، أقفله تلقائيا بعد %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -434,8 +431,6 @@
<string name="notify_blog_posts_setting_summary">أظهر التنبيهات للتدوينات</string>
<string name="notify_blog_posts_setting_summary_26">اضبط التنبيهات للتدوينات</string>
<string name="notify_vibration_setting">إهتزاز</string>
<string name="notify_lock_screen_setting_title">قفل الشاشة</string>
<string name="notify_lock_screen_setting_summary">أظهر التنبيهات على قفل الشاشة</string>
<string name="notify_sound_setting">الصوت</string>
<string name="notify_sound_setting_default">النغمة الافتراضية</string>
<string name="notify_sound_setting_disabled">لا شيء</string>

View File

@@ -129,7 +129,6 @@
<string name="contact_added_toast">S\'ha afegit el contacte %s</string>
<string name="contact_already_exists">El contacte %s ja existia</string>
<string name="qr_code_invalid">El codi QR és invàlid</string>
<string name="qr_code_unsupported">El codi QR que intenteu escanejar pertany a una versió antiga de %s que ja no és compatible.\n\nAssegureu-vos que tothom està executant la darrera versió i torneu a provar-ho.</string>
<string name="camera_error">Error de la càmera</string>
<string name="connecting_to_device">Connectant-se al dispositiu\u2026</string>
<string name="authenticating_with_device">Autenticant-se amb el dispositiu\u2026</string>
@@ -339,10 +338,8 @@
<string name="tor_mobile_data_title">Usa dades mòbils</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Seguretat</string>
<string name="pref_lock_title">Bloqueig de pantalla</string>
<string name="pref_lock_summary">Usa el bloqueig de pantalla del dispositiu per protegir Briar mentre inicieu la sessió</string>
<string name="pref_lock_disabled_summary">Per utilitzar aquesta funció, configureu el bloqueig de pantalla en el vostre dispositiu</string>
<string name="pref_lock_timeout_title">Temps d\'inactivitat del bloqueig de pantalla</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Briar es bloquejarà automàticament després de %s de no usar-se.</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -394,8 +391,6 @@
<string name="notify_blog_posts_setting_summary">Mostra avisos pels apunts als blogs</string>
<string name="notify_blog_posts_setting_summary_26">Configura els avisos pels apunts als blogs</string>
<string name="notify_vibration_setting">Vibra</string>
<string name="notify_lock_screen_setting_title">Bloca la pantalla</string>
<string name="notify_lock_screen_setting_summary">Mostra les notificacions a la pantalla de bloqueig</string>
<string name="notify_sound_setting">So</string>
<string name="notify_sound_setting_default">So d\'avís predeterminat</string>
<string name="notify_sound_setting_disabled">Cap</string>

View File

@@ -132,7 +132,6 @@
<string name="contact_added_toast">Kontakt byl přidán: %s</string>
<string name="contact_already_exists">Kontakt %s již existuje</string>
<string name="qr_code_invalid">QR kód je neplatný</string>
<string name="qr_code_unsupported">QR kód, který se pokoušíte skenovat, patří k starší verzi %s, která již není podporována.\n\nJe potřebné, aby oba kontakty používali nejnovější verzi a následně to zkuste znovu.</string>
<string name="camera_error">Vyskytla se chyba fotoaparátu</string>
<string name="connecting_to_device">Připojování k zařízení\u2026</string>
<string name="authenticating_with_device">Ověřování se zařízením\u2026</string>
@@ -366,8 +365,6 @@
<string name="notify_blog_posts_setting_summary">Zobrazit upozornění pro příspěvky v blogu</string>
<string name="notify_blog_posts_setting_summary_26">Nastavení upozornění pro příspěvky blogu</string>
<string name="notify_vibration_setting">Vibrovat</string>
<string name="notify_lock_screen_setting_title">Zamčená obrazovka</string>
<string name="notify_lock_screen_setting_summary">Zobrazit oznámení na zamčené obrazovce</string>
<string name="notify_sound_setting">Zvuk</string>
<string name="notify_sound_setting_default">Výchozí vyzvánění</string>
<string name="notify_sound_setting_disabled">Žádný</string>

View File

@@ -129,7 +129,6 @@
<string name="contact_added_toast">Kontakt hinzugefügt: %s</string>
<string name="contact_already_exists">Kontakt %s existiert bereits</string>
<string name="qr_code_invalid">Der QR-Code ist ungültig</string>
<string name="qr_code_unsupported">Der QR-Code, den du zu scannen versuchst, gehört zu einer alten Version von %s, welche nicht mehr unterstützt wird.\n\nBitte versichert euch, dass bei euch beiden die neueste Version läuft und versucht es dann erneut.</string>
<string name="camera_error">Kamerafehler</string>
<string name="connecting_to_device">Verbinde mit Gerät\u2026</string>
<string name="authenticating_with_device">Authentifiziere Gerät\u2026</string>
@@ -339,10 +338,8 @@
<string name="tor_mobile_data_title">Mobile Daten benutzen</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Sicherheit</string>
<string name="pref_lock_title">Bildschirmsperre</string>
<string name="pref_lock_summary">Systemsperrbildschirm benutzen um Briar zu schützen, während angemeldet</string>
<string name="pref_lock_disabled_summary">Um dieses Feature zu benutzen aktiviere den Systemsperrbildschirm</string>
<string name="pref_lock_timeout_title">Inaktivitätstimeout Systemsperrbildschirm</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Briar automatisch nach %s sperren, wenn unbenutzt.</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -394,8 +391,6 @@
<string name="notify_blog_posts_setting_summary">Benachrichtigungen für Blogbeiträge anzeigen</string>
<string name="notify_blog_posts_setting_summary_26">Benachrichtigungen für Blogbeiträge konfigurieren</string>
<string name="notify_vibration_setting">Vibration</string>
<string name="notify_lock_screen_setting_title">Sperrbildschirm</string>
<string name="notify_lock_screen_setting_summary">Benachrichtigungen auf dem Sperrbildschirm anzeigen</string>
<string name="notify_sound_setting">Ton</string>
<string name="notify_sound_setting_default">Standardklingelton</string>
<string name="notify_sound_setting_disabled">Keine</string>

View File

@@ -129,7 +129,8 @@
<string name="contact_added_toast">Contacto añadido: %s</string>
<string name="contact_already_exists">El contacto %s ya existe</string>
<string name="qr_code_invalid">El código QR no es válido</string>
<string name="qr_code_unsupported">El código QR que intentas escanear pertenece a una versión anterior de %s que ya no es compatible.\n\nAsegúrate de que ambos estén ejecutando la última versión y luego inténtalo de nuevo.</string>
<string name="qr_code_too_old">El código QR que has escaneado proviene de una versión anterior de %s.\n\nPor favor solicita a tu contacto que actualice a la última versión y luego intenta nuevamente.</string>
<string name="qr_code_too_new">El código QR que has escaneado proviene de una versión posterior de %s.\n\nPor favor actualiza a la última versión y luego intenta nuevamente.</string>
<string name="camera_error">Error de cámara</string>
<string name="connecting_to_device">Conectando al dispositivo\u2026</string>
<string name="authenticating_with_device">Autentificándose con el dispositivo\u2026</string>
@@ -339,10 +340,10 @@
<string name="tor_mobile_data_title">Usar datos móviles</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Seguridad</string>
<string name="pref_lock_title">Bloqueo de pantalla</string>
<string name="pref_lock_title">Bloqueo de apli</string>
<string name="pref_lock_summary">Usar el bloqueo de pantalla del dispositivo para proteger Briar mientras estés con sesión iniciada.</string>
<string name="pref_lock_disabled_summary">Para usar esta característica, configurar un bloqueo de pantalla para tu dispositivo</string>
<string name="pref_lock_timeout_title">Expiración por inactividad. Pantalla bloqueada</string>
<string name="pref_lock_timeout_title">Tiempo alcanzado para bloqueo de apli por inactividad</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Cuando no se está usando Briar, bloquearlo automáticamente luego de %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -371,6 +372,7 @@
<string name="panic_app_setting_none">Ninguna</string>
<string name="dialog_title_connect_panic_app">Confirmar aplicación de pánico</string>
<string name="dialog_message_connect_panic_app">¿Seguro que quieres permitir que %1$s desencadene acciones destructivas de botón de pánico?</string>
<string name="panic_setting_destructive_action">Acciones destructivas</string>
<string name="panic_setting_signout_title">Cerrar sesión</string>
<string name="panic_setting_signout_summary">Cerrar la sesión de Briar si se pulsa un botón de pánico</string>
<string name="purge_setting_title">Eliminar cuenta</string>
@@ -394,8 +396,6 @@
<string name="notify_blog_posts_setting_summary">Mostrar notificaciones para artículos de blog</string>
<string name="notify_blog_posts_setting_summary_26">Configurar notificaciones para artículos de blog</string>
<string name="notify_vibration_setting">Vibrar</string>
<string name="notify_lock_screen_setting_title">Bloqueo de Pantalla</string>
<string name="notify_lock_screen_setting_summary">Notificaciones en la pantalla de bloqueo</string>
<string name="notify_sound_setting">Sonido</string>
<string name="notify_sound_setting_default">Tono de notificación predeterminado</string>
<string name="notify_sound_setting_disabled">Ninguno</string>

View File

@@ -129,7 +129,6 @@
<string name="contact_added_toast">Kontaktua gehitu da: %s</string>
<string name="contact_already_exists">%s kontaktua badago aurretik ere</string>
<string name="qr_code_invalid">QR kodea baliogabea da</string>
<string name="qr_code_unsupported">Eskaneatzen saiatu zaren QR kodea %s programaren bertsio zahar bati dagokio eta ez da onartzen jada.\n\nZiurtatu biek azken bertsioa erabiltzen duzuela eta saiatu berriro.</string>
<string name="camera_error">Kameraren errorea</string>
<string name="connecting_to_device">Gailura konektatzen\u2026</string>
<string name="authenticating_with_device">Gailuarekin autentifikatzen\u2026</string>
@@ -339,10 +338,8 @@
<string name="tor_mobile_data_title">Erabili datu mugikorrak</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Segurtasuna</string>
<string name="pref_lock_title">Pantaila-blokeoa</string>
<string name="pref_lock_summary">Erabili gailuaren pantaila-blokeoa Briar babesteko saioa irekita dagoen bitartean</string>
<string name="pref_lock_disabled_summary">Eginbide hau erabiltzeko, ezarri zure gailuarentzako pantaila-blokeo bat</string>
<string name="pref_lock_timeout_title">Pantaila-blokeatzeko jarduera ezaren denbora-muga</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Briar ez erabiltzean, hura automatikoki blokeatu %s eta gero</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -394,8 +391,6 @@
<string name="notify_blog_posts_setting_summary">Erakutsi blogetako sarreren alertak</string>
<string name="notify_blog_posts_setting_summary_26">Konfiguratu blogetako sarreren alertak</string>
<string name="notify_vibration_setting">Bibratu</string>
<string name="notify_lock_screen_setting_title">Blokeo-pantaila</string>
<string name="notify_lock_screen_setting_summary">Erakutsi jakinarazpenak blokeo-pantailan</string>
<string name="notify_sound_setting">Soinua</string>
<string name="notify_sound_setting_default">Lehenetsitako dei-doinua</string>
<string name="notify_sound_setting_disabled">Bat ere ez</string>

View File

@@ -136,9 +136,6 @@
<string name="contact_added_toast">مخاطب اضافه شد: %s</string>
<string name="contact_already_exists">مخاطب %s از قبل وجود دارد</string>
<string name="qr_code_invalid">کد QR نامعتبر می باشد</string>
<string name="qr_code_unsupported">کد QR که شما سعی دارید اسکن کنید متعلق به یک نسخه قدیمی از %s میباشد که دیگر پشتیبانی نمی شود.
لطفا مطمئن شوید که هردوی شما از آخرین نسخه استفاده میکنید و دوباره امتحان کنید.</string>
<string name="camera_error">خطای دوربین</string>
<string name="connecting_to_device">اتصال به دستگاهu2026\</string>
<string name="authenticating_with_device">تصدیق سازی با دستگاه u2026\</string>
@@ -370,10 +367,8 @@
<string name="tor_mobile_data_title">استفاده از داده موبایل</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">امنیت</string>
<string name="pref_lock_title">قفل صفحه</string>
<string name="pref_lock_summary">استفاده از قفل صفحه دستگاه به منظور محافظت از Briar (برایر) در هنگام استفاده از آن</string>
<string name="pref_lock_disabled_summary">برای استفاده از این ویژگی، قفل صفحه را برای دستگاه خود برپا کنید</string>
<string name="pref_lock_timeout_title">اتمام وقت عدم فعالیت قفل صفحه</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">زمانی که از Briar (برایر) استفاده نمی شود، به صورت خودکار بعد از %s آن را قفل کن</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -425,8 +420,6 @@
<string name="notify_blog_posts_setting_summary">نمایش هشدار برای پست های بلاگ</string>
<string name="notify_blog_posts_setting_summary_26">تنظیم هشدار برای پست های بلاگ</string>
<string name="notify_vibration_setting">لرزش</string>
<string name="notify_lock_screen_setting_title">قفل صفحه</string>
<string name="notify_lock_screen_setting_summary">نمایش نوتیفیکشن روی صفحه قفل</string>
<string name="notify_sound_setting">صدا</string>
<string name="notify_sound_setting_default">رینگتون پیش فرض</string>
<string name="notify_sound_setting_disabled">هیچکدام</string>

View File

@@ -129,7 +129,6 @@
<string name="contact_added_toast">Yhteystieto lisätty: %s</string>
<string name="contact_already_exists">Yhteystieto %s on jo olemassa</string>
<string name="qr_code_invalid">QR koodi on virheellinen</string>
<string name="qr_code_unsupported">Skannaamasi QR-koodi kuuluu %s:in vanhaan versioon, jonka tuki on loppunut.\n\nVarmista että kumpikin teistä käyttää uusinta versiota ja yritä uudelleen.</string>
<string name="camera_error">Kameravirhe</string>
<string name="connecting_to_device">Yhdistetään laitteeseen\u2026</string>
<string name="authenticating_with_device">Tunnistaudutaan laitteen kanssa\u2026</string>
@@ -339,10 +338,8 @@
<string name="tor_mobile_data_title">Käytä mobiilitiedonsiirtoa</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Turvallisuus</string>
<string name="pref_lock_title">Näytön lukitus</string>
<string name="pref_lock_summary">Käytä laitteen näytön lukitusta suojataksesi Briar kun olet kirjautunut sisään</string>
<string name="pref_lock_disabled_summary">Käyttääksesi tätä ominaisuutta, ota käyttöön laitteesi näytön lukitus</string>
<string name="pref_lock_timeout_title">Näytön lukituksen inaktiviteetti aikakatkaisu</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Kun Briar ei ole käytössä, lukitse se automaattisesti %s jälkeen</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -394,8 +391,6 @@
<string name="notify_blog_posts_setting_summary">Näytä ilmoitukset blogikirjoituksista</string>
<string name="notify_blog_posts_setting_summary_26">Aseta ilmoitukset blogikirjoituksille</string>
<string name="notify_vibration_setting">Värinä</string>
<string name="notify_lock_screen_setting_title">Lukitusnäyttö</string>
<string name="notify_lock_screen_setting_summary">Näytä ilmoitukset lukitusnäytöllä</string>
<string name="notify_sound_setting">Ääni</string>
<string name="notify_sound_setting_default">Oletussoittoääni</string>
<string name="notify_sound_setting_disabled">Ei mikään</string>

View File

@@ -129,7 +129,6 @@
<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_unsupported">Le code QR que vous tentez de lire appartient à une ancienne version de %s qui nest plus prise en charge.\n\nVeuillez vous assurer dutiliser tous les deux la dernière version et ressayer.</string>
<string name="camera_error">Erreur de la caméra</string>
<string name="connecting_to_device">Connexion à lappareil\u2026</string>
<string name="authenticating_with_device">Autentification avec lappareil\u2026</string>
@@ -339,10 +338,10 @@
<string name="tor_mobile_data_title">Utiliser les données cellulaires</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Sécurité</string>
<string name="pref_lock_title">Verrouillage de lécran</string>
<string name="pref_lock_title">Verrou de lappli</string>
<string name="pref_lock_summary">Utiliser le verrouillage de lécran de lappareil pour protéger Briar une fois connecté</string>
<string name="pref_lock_disabled_summary">Pour utiliser cette fonction, configurez le verrouillage de lécran sur votre appareil</string>
<string name="pref_lock_timeout_title">Délai dinactivité avant verrouillage de lécran</string>
<string name="pref_lock_timeout_title">Délai dinactivité avant verrouillage de lappli</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Si Briar nest pas utilisée, verrouiller automatiquement après %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -394,8 +393,6 @@
<string name="notify_blog_posts_setting_summary">Afficher des alertes pour les billets de blogue</string>
<string name="notify_blog_posts_setting_summary_26">Configurer les alertes pour les billets de forum</string>
<string name="notify_vibration_setting">Vibrer</string>
<string name="notify_lock_screen_setting_title">Écran de verrouillage</string>
<string name="notify_lock_screen_setting_summary">Afficher les notifications sur lécran de verrouillage</string>
<string name="notify_sound_setting">Son</string>
<string name="notify_sound_setting_default">Sonnerie par défaut</string>
<string name="notify_sound_setting_disabled">Aucun</string>

View File

@@ -129,7 +129,6 @@
<string name="contact_added_toast">Contacto engadido: %s</string>
<string name="contact_already_exists">O contacto %s xa existe</string>
<string name="qr_code_invalid">O código QR non é válido</string>
<string name="qr_code_unsupported">O código QR que intenta escanear pertence a unha versión antiga de %s que xa non ten mantemento.\n\nPor favor, asegúrese que ambas utilizan a última versión e inténteno de novo.</string>
<string name="camera_error">Fallo na cámara</string>
<string name="connecting_to_device">Conectando co dispositivo\u2026</string>
<string name="authenticating_with_device">Autenticándose co dispositivo\u2026</string>
@@ -339,10 +338,10 @@
<string name="tor_mobile_data_title">Utilizar datos móbiles</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Seguridade</string>
<string name="pref_lock_title">Bloquear pantalla</string>
<string name="pref_lock_title">Bloquear app</string>
<string name="pref_lock_summary">Utilizar o bloqueo de pantalla do dispositiov para protexer Briar mentras está conectada</string>
<string name="pref_lock_disabled_summary">Para utilizar esta función, axuste o bloqueo de pantalla do dispositivo</string>
<string name="pref_lock_timeout_title">Tempo de inactividade para o bloqueo da pantalla</string>
<string name="pref_lock_timeout_title">Tempo de espera en inactividade para o bloqueo</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Cando non utilice Briar, bloquear automáticamente tras %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -394,8 +393,6 @@
<string name="notify_blog_posts_setting_summary">Amosar alertas para entradas no blog</string>
<string name="notify_blog_posts_setting_summary_26">Configurar alertas para entradas no blog</string>
<string name="notify_vibration_setting">Vibrar</string>
<string name="notify_lock_screen_setting_title">Bloquear pantalla</string>
<string name="notify_lock_screen_setting_summary">Amosar notificacións na pantalla bloqueada</string>
<string name="notify_sound_setting">Son</string>
<string name="notify_sound_setting_default">Ton por omisión</string>
<string name="notify_sound_setting_disabled">Ningún</string>

View File

@@ -129,7 +129,6 @@
<string name="contact_added_toast">संपर्क जोड़ा गया:%s</string>
<string name="contact_already_exists">संपर्क%s पहले से मौजूद है</string>
<string name="qr_code_invalid">QR कोड अमान्य है</string>
<string name="qr_code_unsupported">क्यूआर कोड जिसे आप स्कैन करने का प्रयास कर रहे हैं वह पुराने संस्करण से संबंधित है %sजिसका अब समर्थित नहीं है। \ N \ n कृपया सुनिश्चित करें कि आप दोनों नवीनतम संस्करण चला रहे हैं और फिर पुन: प्रयास करें।</string>
<string name="camera_error">कैमरा त्रुटि</string>
<string name="connecting_to_device">उपकरण \ u2026 से कनेक्ट हो रहा है</string>
<string name="authenticating_with_device">डिवाइस के साथ प्रमाणीकरण \ u2026</string>
@@ -339,10 +338,8 @@
<string name="tor_mobile_data_title">मोबाइल डेटा का प्रयोग करें</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">सुरक्षा</string>
<string name="pref_lock_title">स्क्रीन लॉक</string>
<string name="pref_lock_summary">साइन इन करते समय Briar की सुरक्षा के लिए डिवाइस के स्क्रीन लॉक का उपयोग करें</string>
<string name="pref_lock_disabled_summary">इस सुविधा का उपयोग करने के लिए, अपने डिवाइस के लिए एक स्क्रीन लॉक सेट करें</string>
<string name="pref_lock_timeout_title">स्क्रीन लॉक निष्क्रियता टाइमआउट</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Briar का उपयोग नहीं करते समय, इसे स्वचालित रूप से बाद में लॉक करें %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -394,8 +391,6 @@
<string name="notify_blog_posts_setting_summary">ब्लॉग पोस्ट के लिए अलर्ट्स दिखाएं</string>
<string name="notify_blog_posts_setting_summary_26">ब्लॉग पोस्ट के लिए अलर्ट कॉन्फ़िगर करें</string>
<string name="notify_vibration_setting">कांपना</string>
<string name="notify_lock_screen_setting_title">लॉक स्क्रीन</string>
<string name="notify_lock_screen_setting_summary">लॉक स्क्रीन पर सूचनाएं दिखाएं</string>
<string name="notify_sound_setting">ध्वनि</string>
<string name="notify_sound_setting_default">बकाया घंटी</string>
<string name="notify_sound_setting_disabled">कोई नहीं</string>

View File

@@ -129,7 +129,6 @@
<string name="contact_added_toast">Kapcsolat hozzáadva: %s</string>
<string name="contact_already_exists">%s kapcsolat már létezik</string>
<string name="qr_code_invalid">A QR kód érvénytelen</string>
<string name="qr_code_unsupported">A QR kód amit le szeretne olvasni egy korábbi %s verzióhoz tartozik, ami már nem támogatott többé.\n\nKérjük biztosítsák, hogy mindketten a legfrissebb verziót használják és próbálják újra.</string>
<string name="camera_error">Kamera hiba</string>
<string name="connecting_to_device">Csatlakozás az eszközhöz\u2026</string>
<string name="authenticating_with_device">Azonosítás az eszközzel\u2026</string>
@@ -341,10 +340,8 @@
<string name="tor_mobile_data_title">Mobil adat használata</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Biztonság</string>
<string name="pref_lock_title">Képernyőzár</string>
<string name="pref_lock_summary">Az eszköz képernyő zárának használata a Briar védelmére, ha be van jelentkezve</string>
<string name="pref_lock_disabled_summary">Ahhoz, hogy használni tudja ezt az opciót, állítson be zárképernyőt az eszközén</string>
<string name="pref_lock_timeout_title">Képernyőzár inaktivítási idő </string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Ha nem használja a Briar-t, automatikusan zárol %s után</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -397,8 +394,6 @@ Vigyázat: Ez végleg törli az identitásait, kapcsolatait és üzeneteit</stri
<string name="notify_blog_posts_setting_summary">Értesítés megjelenítése blog bejegyzésekről</string>
<string name="notify_blog_posts_setting_summary_26">Értesítés beállítása blog bejegyésekhez</string>
<string name="notify_vibration_setting">Rezgés</string>
<string name="notify_lock_screen_setting_title">Zárolási képernyő</string>
<string name="notify_lock_screen_setting_summary">Értesítések megjelenítése a zárolási képernyőn</string>
<string name="notify_sound_setting">Hang</string>
<string name="notify_sound_setting_default">Alapértelmezett csengőhang</string>
<string name="notify_sound_setting_disabled">Egyik sem</string>

View File

@@ -129,7 +129,8 @@
<string name="contact_added_toast">Contatto aggiunto: %s</string>
<string name="contact_already_exists">Il contatto %s esiste già</string>
<string name="qr_code_invalid">Il codice QR non è valido</string>
<string name="qr_code_unsupported">Il codice QR che state tentando di scansionare appartiene ad una vecchia versione di %s che non è più supportata.\n\nAssicuratevi entrambi di utilizzare la versione più recente e poi riprovare.</string>
<string name="qr_code_too_old">Il codice QR che hai scansionato proviene da una vecchia versione di %s.\n\nChiedi al tuo contatto di aggiornare all\'ultima versione e poi riprova.</string>
<string name="qr_code_too_new">Il codice QR che hai scansionato proviene da una versione più recente di %s.\n\nAggiorna all\'ultima versione e poi riprova.</string>
<string name="camera_error">Errore fotocamera</string>
<string name="connecting_to_device">Connessione al dispositivo\u2026</string>
<string name="authenticating_with_device">Autenticazione con il dispositivo\u2026</string>
@@ -339,10 +340,10 @@
<string name="tor_mobile_data_title">Usa dati mobili</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Sicurezza</string>
<string name="pref_lock_title">Blocco schermo</string>
<string name="pref_lock_title">Blocco dell\'app</string>
<string name="pref_lock_summary">Usa il blocco schermo del dispositivo per proteggere Briar mentre sei connesso</string>
<string name="pref_lock_disabled_summary">Per usare questa funzione, imposta un blocco schermo per il dispositivo</string>
<string name="pref_lock_timeout_title">Blocco schermo per inattività</string>
<string name="pref_lock_timeout_title">Tempo inattività per blocco app</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Quando non usi Briar, bloccalo automaticamente dopo %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -371,6 +372,7 @@
<string name="panic_app_setting_none">Nessuno</string>
<string name="dialog_title_connect_panic_app">Conferma App Panico</string>
<string name="dialog_message_connect_panic_app">Sei sicuro di voler consentire %1$s di attivare le azioni distruttive del pulsante panico?</string>
<string name="panic_setting_destructive_action">Azioni distruttive</string>
<string name="panic_setting_signout_title">Esci</string>
<string name="panic_setting_signout_summary">Uscire da Briar se viene premuto un pulsante di panico</string>
<string name="purge_setting_title">Elimina Account</string>
@@ -394,8 +396,6 @@
<string name="notify_blog_posts_setting_summary">Mostra avvisi per post di blog</string>
<string name="notify_blog_posts_setting_summary_26">Configurare avvisi per post di blog</string>
<string name="notify_vibration_setting">Vibrazione</string>
<string name="notify_lock_screen_setting_title">Blocca schermo</string>
<string name="notify_lock_screen_setting_summary">Mostra notifiche sul blocca schermo</string>
<string name="notify_sound_setting">Suono</string>
<string name="notify_sound_setting_default">Suoneria di default</string>
<string name="notify_sound_setting_disabled">Nessuno</string>

View File

@@ -129,7 +129,6 @@
<string name="contact_added_toast">Contact toegevoegd: %s</string>
<string name="contact_already_exists">Contact %s bestaat al</string>
<string name="qr_code_invalid">De QR-code is ongeldig</string>
<string name="qr_code_unsupported">De QR-code die je probeert te scannen is van een oude versie van %s die niet meer wordt ondersteund.\n\nControleer alsjeblieft dat jullie beiden de laatste versie gebruiken en probeer het nog een keer.</string>
<string name="camera_error">Camerafout</string>
<string name="connecting_to_device">Aan het verbinden met apparaat\u2026</string>
<string name="authenticating_with_device">Aan het authenticeren met apparaat\u2026</string>
@@ -339,10 +338,8 @@
<string name="tor_mobile_data_title">Gebruik mobiele data</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Beveiliging</string>
<string name="pref_lock_title">Schermvergrendeling</string>
<string name="pref_lock_summary">Gebruik de schermvergrendeling van het apparaat om Briar te beschermen terwijl je bent ingelogd</string>
<string name="pref_lock_disabled_summary">Stel een schermvergrendeling in op je apparaat om deze feature te gebruiken</string>
<string name="pref_lock_timeout_title">Time-out van schermvergrendeling bij inactiviteit</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Als Briar niet wordt gebruikt, vergrendel automatisch na %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -394,8 +391,6 @@
<string name="notify_blog_posts_setting_summary">Toon meldingen voor blogposts</string>
<string name="notify_blog_posts_setting_summary_26">Configureer meldingen voor blogposts</string>
<string name="notify_vibration_setting">Tril</string>
<string name="notify_lock_screen_setting_title">Schermvergrendeling</string>
<string name="notify_lock_screen_setting_summary">Toon notificaties over de schermvergrendeling</string>
<string name="notify_sound_setting">Geluid</string>
<string name="notify_sound_setting_default">Standaard meldingsgeluid</string>
<string name="notify_sound_setting_disabled">Geen</string>

View File

@@ -131,7 +131,6 @@ Volètz suprimir vòstre compte e ne crear un nòu?\n
<string name="contact_added_toast">Contacte apondut:%s</string>
<string name="contact_already_exists">Lo contacte %s existís ja</string>
<string name="qr_code_invalid">Lo QR còdi es invalid</string>
<string name="qr_code_unsupported">Lo còdi QR quensajatz de numerizar ven duna anciana version de %s ques pas mai desvolopada.\n\nMercés de vos assegurar que los dos avètz la darrièra version e de tornar ensajar.</string>
<string name="camera_error">Error de camèra</string>
<string name="connecting_to_device">Connexion a laparelh\u2026</string>
<string name="authenticating_with_device">Autentificacion amb laparelh\u2026</string>
@@ -344,10 +343,8 @@ contactes quavètz partejat aqueste flux quitaràn benlèu de recebre las mes
<string name="tor_mobile_data_title">Utilizar la connexion del mobil</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Seguretat</string>
<string name="pref_lock_title">Verrolhatge de lecran</string>
<string name="pref_lock_summary">Utilizar lecran de verrolhatge per protegir Briar quand es connectat</string>
<string name="pref_lock_disabled_summary">Per utilizar aquesta foncion, configuratz un ecran de verrolatge per laparelh</string>
<string name="pref_lock_timeout_title">Relambi pel verrolhatge de lecran aprèp inactivitat</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Sens utilizar Briar, lo verrolhar aprèp %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -399,8 +396,6 @@ contactes quavètz partejat aqueste flux quitaràn benlèu de recebre las mes
<string name="notify_blog_posts_setting_summary">Notificar los articles de blòg</string>
<string name="notify_blog_posts_setting_summary_26">Configurar las alèrtas darticles de blòg</string>
<string name="notify_vibration_setting">Vibracion</string>
<string name="notify_lock_screen_setting_title">Verrolhar lecran</string>
<string name="notify_lock_screen_setting_summary">Mostrar las notificacions sus lecran verrolhat</string>
<string name="notify_sound_setting">Sonariá</string>
<string name="notify_sound_setting_default">Sonariá per defaut</string>
<string name="notify_sound_setting_disabled">Cap</string>

View File

@@ -139,7 +139,6 @@
<string name="contact_added_toast">Kontakt dodany: %s</string>
<string name="contact_already_exists">Kontakt %s już istnieje</string>
<string name="qr_code_invalid">Kod QR jest nie prawidłowy</string>
<string name="qr_code_unsupported">Kod QR który chcecsz zeskanować jest z wersji %s która nie jest już wspierana.\n\nProszę upewnić się czy oboje używacie najnowszej wersji i spróbować ponownie.</string>
<string name="camera_error">Błąd aparatu</string>
<string name="connecting_to_device">Łączenie z urządzeniem\u2026</string>
<string name="authenticating_with_device">Autoryzowanie z urządzeniem\u2026</string>
@@ -359,10 +358,8 @@
<string name="tor_mobile_data_title">Używaj danych komórkowych</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Bezpieczeństwo</string>
<string name="pref_lock_title">Blokada ekranu</string>
<string name="pref_lock_summary">Użyj blokady ekranu urządzenia by chronić Briar gdy zalogowany</string>
<string name="pref_lock_disabled_summary">Aby użyć tej funkcji skonfiguruj blokadę ekranu na swoim urządzeniu</string>
<string name="pref_lock_timeout_title">Blokada ekranu gdy wykryto aktywności</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Gdy nie używam Briar, automatycznie zablokuj po %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -414,8 +411,6 @@
<string name="notify_blog_posts_setting_summary">Pokazuj powiadomienia dla wpisów na blogach</string>
<string name="notify_blog_posts_setting_summary_26">Skonfiguruj alerty dla wpisów na blogach</string>
<string name="notify_vibration_setting">Wibruj</string>
<string name="notify_lock_screen_setting_title">Ekran blokady</string>
<string name="notify_lock_screen_setting_summary">Pokaż powiadomienia na zablokowanym ekranie</string>
<string name="notify_sound_setting">Dźwięk</string>
<string name="notify_sound_setting_default">Domyślny dzwonek</string>
<string name="notify_sound_setting_disabled">Brak</string>

View File

@@ -129,7 +129,6 @@
<string name="contact_added_toast">Contato adicionado: %s</string>
<string name="contact_already_exists">Contato %s já existe</string>
<string name="qr_code_invalid">O código QR é inválido</string>
<string name="qr_code_unsupported">O código QR que você está tentando escanear é de uma versão antiga do %s, que não é mais suportada.\n\nPor favor, verifique que você e a outra pessoa está usando a versão mais recente e tentem de novo.</string>
<string name="camera_error">Erro da câmera</string>
<string name="connecting_to_device">Conectando a device\u2026</string>
<string name="authenticating_with_device">Autenticando com o dispositivo\u2026</string>
@@ -339,10 +338,8 @@
<string name="tor_mobile_data_title">Usar dados moveis</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Segurança</string>
<string name="pref_lock_title">Bloqueio de Tela</string>
<string name="pref_lock_summary">Use o bloqueio de tela do dispositivo para proteger o Briar enquanto estiver conectado</string>
<string name="pref_lock_disabled_summary">Para usar esse recurso, configure um bloqueio de tela para seu dispositivo</string>
<string name="pref_lock_timeout_title">Tempo limite de inatividade de bloqueio de tela</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Quando o briar não estiver sendo usando, bloquear automaticamente após %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -394,8 +391,6 @@
<string name="notify_blog_posts_setting_summary">Mostrar alertas para postagens nos blogs</string>
<string name="notify_blog_posts_setting_summary_26">Configurar alertas para posts de blogs</string>
<string name="notify_vibration_setting">Vibrar</string>
<string name="notify_lock_screen_setting_title">Bloquear a tela</string>
<string name="notify_lock_screen_setting_summary">Mostrar notificações enquanto a tela estiver bloqueada</string>
<string name="notify_sound_setting">Som</string>
<string name="notify_sound_setting_default">Toque padrão</string>
<string name="notify_sound_setting_disabled">Nenhum</string>

View File

@@ -134,7 +134,8 @@
<string name="contact_added_toast">Contact adăugat: %s</string>
<string name="contact_already_exists">Contactul %s există deja</string>
<string name="qr_code_invalid">Codul QR este invalid!</string>
<string name="qr_code_unsupported">Codul QR pe care încercați să îl scanați aparține unei versiuni vechi %s care nu mai este acceptată.\n\nVă rugăm să vă asigurați că amândoi aveți cea mai recentă versiune și încercați din nou.</string>
<string name="qr_code_too_old">Codul QR pe care l-ați scanat aparține unei versiuni vechi %s.\n\nRugați-vă contactul să actualizeze aplicația la cea mai recentă versiune și apoi încercați din nou.</string>
<string name="qr_code_too_new">Codul QR pe care l-ați scanat aparține unei versiuni mai noi %s.\n\nVă rugăm să actualizați aplicația la cea mai recentă versiune și apoi încercați din nou.</string>
<string name="camera_error">Eroare la camera foto</string>
<string name="connecting_to_device">Conectare la dispozitiv\u2026</string>
<string name="authenticating_with_device">Autentificare cu dispozitivul\u2026</string>
@@ -349,10 +350,10 @@
<string name="tor_mobile_data_title">Utilizează date mobile</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Securitate</string>
<string name="pref_lock_title">Blocare ecran</string>
<string name="pref_lock_title">Blocare aplicație</string>
<string name="pref_lock_summary">Folosește blocarea ecranului dispozitivului pentru a proteja Briar atunci cand sunteți autentificați</string>
<string name="pref_lock_disabled_summary">Pentru a utiliza această caracteristică, setați blocarea ecranului dispozitivului dumneavoastră</string>
<string name="pref_lock_timeout_title">Perioada de inactivitate înainte de blocarea ecranului</string>
<string name="pref_lock_timeout_title">Perioada de inactivitate înainte de blocarea aplicației</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Când Briar nu este folosit, va fi blocat automat după %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -381,6 +382,7 @@
<string name="panic_app_setting_none">Nici una</string>
<string name="dialog_title_connect_panic_app">Confirmare aplicație de panică</string>
<string name="dialog_message_connect_panic_app">Sigur doriți să permiteți %1$s să declanșeze acțiuni destructive pentru butonul de panică?</string>
<string name="panic_setting_destructive_action">Acțiuni distructive</string>
<string name="panic_setting_signout_title">Ieșire</string>
<string name="panic_setting_signout_summary">Ieși din Briar dacă un buton de panică este apăsat</string>
<string name="purge_setting_title">Șterge cont</string>
@@ -404,8 +406,6 @@
<string name="notify_blog_posts_setting_summary">Arată alerte pentru mesajele de pe blog</string>
<string name="notify_blog_posts_setting_summary_26">Configurare alerte pentru mesajele de pe blog</string>
<string name="notify_vibration_setting">Vibrează</string>
<string name="notify_lock_screen_setting_title">Ecran de blocare</string>
<string name="notify_lock_screen_setting_summary">Arată notificări pe ecranul de blocare</string>
<string name="notify_sound_setting">Sunet</string>
<string name="notify_sound_setting_default">Sunet implicit</string>
<string name="notify_sound_setting_disabled">Nici unul</string>

View File

@@ -141,7 +141,6 @@
<string name="contact_added_toast">Контакт добавлен: %s</string>
<string name="contact_already_exists">Контакт %s уже существует</string>
<string name="qr_code_invalid">Неверный QR-код</string>
<string name="qr_code_unsupported">QR-код, который вы пытаетесь отсканировать, создан в старой версии %s, которая больше не поддерживается.\n\nУбедитесь, что у вас обоих установлена ​​последняя версия, а затем повторите попытку.</string>
<string name="camera_error">Ошибка камеры</string>
<string name="connecting_to_device">Подключение к устройству\u2026</string>
<string name="authenticating_with_device">Аутентификация с устройством\u2026</string>
@@ -361,10 +360,8 @@
<string name="tor_mobile_data_title">Использовать мобильные данные</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Безопасность</string>
<string name="pref_lock_title">Блокировка экрана</string>
<string name="pref_lock_summary">Использовать блокировку экрана устройства для защиты Briar при входе</string>
<string name="pref_lock_disabled_summary">Чтобы использовать эту функцию, установите блокировку экрана вашего устройства</string>
<string name="pref_lock_timeout_title">Тайм-аут блокировки блокировки экрана</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Автоматически блокировать Briar через %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -416,8 +413,6 @@
<string name="notify_blog_posts_setting_summary">Показывать оповещения для постов блога</string>
<string name="notify_blog_posts_setting_summary_26">Настройка оповещений для постов блога</string>
<string name="notify_vibration_setting">Вибрация</string>
<string name="notify_lock_screen_setting_title">Экран блокировки</string>
<string name="notify_lock_screen_setting_summary">Показывать уведомления на экране блокировки</string>
<string name="notify_sound_setting">Звук</string>
<string name="notify_sound_setting_default">Мелодия по умолчанию</string>
<string name="notify_sound_setting_disabled">Нет</string>

View File

@@ -33,10 +33,10 @@
<string name="startup_failed_notification_title">Briar-i s\u nis dot</string>
<string name="startup_failed_notification_text">Prekeni për më tepër të dhëna.</string>
<string name="startup_failed_activity_title">Dështim Nisjeje i Briar-it</string>
<string name="startup_failed_db_error">Për ndonjë arsye, baza e të dhënave të Briar-it është e dëmtuar sa nuk ndreqet dot. Llogaria juaj, të dhënat tuaja dhe krejt kontaktet tuaja humbën. Mjerisht, ju duhet të ri-instaloni Briar-in dhe të rregulloni një llogari të re duke zgjedhur \'Kam harruar fjalëkalimin tim\' te hapi për fjalëkalimin.</string>
<string name="startup_failed_data_too_old_error">Llogaria juaj qe krijuar me një version të vjetër të këtij aplikacioni dhe smund të hapet me këtë version. Ose duhet të ri-instaloni versionin e vjetër, ose të fshini llogarinë tuaj të vjetër duke zgjedhur \'Kam harruar fjalëkalimin tim\' te hapi për fjalëkalimin.</string>
<string name="startup_failed_db_error">Për ndonjë arsye, baza e të dhënave të Briar-it është e dëmtuar sa nuk ndreqet dot. Llogaria juaj, të dhënat tuaja dhe krejt kontaktet tuaja humbën. Mjerisht, ju duhet të ri-instaloni Briar-in dhe të rregulloni një llogari të re, duke zgjedhur \'Kam harruar fjalëkalimin tim\' te hapi për fjalëkalimin.</string>
<string name="startup_failed_data_too_old_error">Llogaria juaj qe krijuar me një version të vjetër të këtij aplikacioni dhe s\mund të hapet me këtë version. Ose duhet të ri-instaloni versionin e vjetër, ose të fshini llogarinë tuaj të vjetër duke zgjedhur \'Kam harruar fjalëkalimin tim\' te hapi për fjalëkalimin.</string>
<string name="startup_failed_data_too_new_error">Ky version i aplikacionit është shumë i vjetër. Ju lutemi, përmirësojeni me versionin më të ri dhe riprovoni.</string>
<string name="startup_failed_service_error">Briar-i s\arriti të nisë një shtojcë të domosdoshme. Ri-instalimi i Briar-it zakonisht e zgjidh këtë problem. Por, ju lutemi, kini parasysh se me të do të humbni llogarinë tuaj dhe krejt të dhënat e lidhura me të, ngaqë Briar nuk përdor shërbyes qendrorë për të depozituar në ta të dhënat tuaja.</string>
<string name="startup_failed_service_error">Briar-i s\arriti të nisë një shtojcë të domosdoshme. Zakonisht këtë problem e zgjidh Ri-instalimi i Briar-it. Por, ju lutemi, kini parasysh se me të do të humbni llogarinë tuaj dhe krejt të dhënat e lidhura me të, ngaqë Briar nuk përdor shërbyes qendrorë për të depozituar në ta të dhënat tuaja.</string>
<plurals name="expiry_warning">
<item quantity="one">Ky është një version beta i Briar-it. Llogaria juaj do të skadojë për %d ditë dhe s\mund të rinovohet.</item>
<item quantity="other">Ky është një version beta i Briar-it. Llogaria juaj do të skadojë për %d ditë dhe s\mund të rinovohet.</item>
@@ -46,7 +46,7 @@
<string name="download_briar">Që të vazhdoni të përdorni Briar-in, ju lutemi, shkarkoni versionin 1.0.</string>
<string name="create_new_account">Do tju duhet të krijoni një llogari të re, por mund të përdorni të njëjtën nofkë.</string>
<string name="download_briar_button">Shkarko Briar 1.0</string>
<string name="startup_open_database">Po shfshehtëzohet Baza e të dhënave…</string>
<string name="startup_open_database">Po shfshehtëzohet Baza e të Dhënave…</string>
<string name="startup_migrate_database">Po përditësohet Baza e të dhënave…</string>
<!--Navigation Drawer-->
<string name="nav_drawer_open_description">Hap sirtarin e lëvizjeve</string>
@@ -129,7 +129,8 @@
<string name="contact_added_toast">Kontakti u shtua: %s</string>
<string name="contact_already_exists">Kontakti %s ekziston tashmë</string>
<string name="qr_code_invalid">Kodi QR është i pavlefshëm</string>
<string name="qr_code_unsupported">Kodi QR që po provoni të skanoni më poshtë i përket një versioni të vjetër të %s-it, i cili nuk mbulohet më.\n\nJu lutemi, sigurohuni që që të dy ju xhironi versionin më të ri dhe mandej riprovoni.</string>
<string name="qr_code_too_old">Kodi QR që keni skanuar vjen prej një versioni të vjetër të %s-it.\n\nJu lutemi, kërkojini kontaktit tuaj ta përmirësojë me versionin më të ri dhe mandej riprovoni.</string>
<string name="qr_code_too_new">Kodi QR që keni skanuar vjen prej një versioni më të ri të %s-it.\n\nJu lutemi, përmirësojeni me versionin më të ri dhe mandej riprovoni.</string>
<string name="camera_error">Gabim kamere</string>
<string name="connecting_to_device">Po lidhet me pajisjen\u2026</string>
<string name="authenticating_with_device">Po bëhet mirëfilltësimi me pajisjen\u2026</string>
@@ -199,15 +200,15 @@
<string name="groups_invitations_invitation_sent">Keni ftuar %1$s të bëhet pjesë e grupit \"%2$s\".</string>
<string name="groups_invitations_invitation_received">%1$s ju ka ftuar të bëheni pjesë e grupit \"%2$s\".</string>
<string name="groups_invitations_joined">U bëtë pjesë e grupit</string>
<string name="groups_invitations_declined">Ftesa e grupit u hodh poshtë</string>
<string name="groups_invitations_declined">Ftesa për në grup u hodh poshtë</string>
<plurals name="groups_invitations_open">
<item quantity="one">%d ftesë grupi e hapur</item>
<item quantity="other">%d ftesa grupi të hapura</item>
</plurals>
<string name="groups_invitations_response_accepted_sent">Pranuat ftesën e grupit nga %s.</string>
<string name="groups_invitations_response_declined_sent">Hodhët poshtë ftesën e grupit nga %s.</string>
<string name="groups_invitations_response_declined_sent">Hodhët poshtë ftesën për në grup nga %s.</string>
<string name="groups_invitations_response_accepted_received">%s e pranoi ftesën e grupit.</string>
<string name="groups_invitations_response_declined_received">%s e hodhi poshtë ftesën e grupit.</string>
<string name="groups_invitations_response_declined_received">%s e hodhi poshtë ftesën për në grup.</string>
<string name="sharing_status_groups">Vetëm krijuesi mund të ftojë anëtarë të rinj në grup. Më poshtë gjenden tërë anëtarët e tanishëm të grupit.</string>
<!--Private Groups Revealing Contacts-->
<string name="groups_reveal_contacts">Shfaqua Kontaktet</string>
@@ -217,7 +218,7 @@
<string name="groups_reveal_visible_revealed_by_contact">Marrëdhënia e kontaktit është e dukshme për grupin (shfaqur nga %s)</string>
<string name="groups_reveal_invisible">Marrëdhënia e kontaktit s\është e dukshme për grupin</string>
<!--Forums-->
<string name="no_forums">Ska forume për shfaqje</string>
<string name="no_forums">S\ka forume për shfaqje</string>
<string name="no_forums_action">Prekni ikonën + që të krijoni një forum, ose kërkojuni kontakteve tuaj të ndajnë forume me ju</string>
<string name="create_forum_title">Krijoje Forumin</string>
<string name="choose_forum_hint">Zgjidhni një emër për forumin tuaj</string>
@@ -278,7 +279,7 @@
<string name="blogs_blog_post_scroll_to">Kalo Te</string>
<string name="blogs_feed_empty_state">S\ka postime për shfaqje</string>
<string name="blogs_feed_empty_state_action">Këtu do të shfaqet postimet nga kontaktet tuaja dhe blogjet që ndiqni\n\nQë të shkruani një postim, prekni ikonën penë</string>
<string name="blogs_remove_blog">hiqe Blogun</string>
<string name="blogs_remove_blog">Hiqe Blogun</string>
<string name="blogs_remove_blog_dialog_message">Jeni i sigurt se doni të hiqet ky blog?\n\nPostimet do të hiqen nga pajisja juaj, por jo nga pajisjet e personave të tjerë.\n\nÇfarëdo kontaktesh me të cilët e keni ndarë këtë blog mund të reshtin së marri përditësime.</string>
<string name="blogs_remove_blog_ok">Hiqe</string>
<string name="blogs_blog_removed">Blogu u hoq</string>
@@ -292,7 +293,7 @@
<string name="blogs_sharing_response_accepted_sent">Pranuat ftesën e blogut nga %s.</string>
<string name="blogs_sharing_response_declined_sent">Hodhët poshtë ftesën e blogut nga %s.</string>
<string name="blogs_sharing_response_accepted_received">%s pranoi ftesën e blogut.</string>
<string name="blogs_sharing_response_declined_received">%s hodhi poshtë ftesën e blogut.</string>
<string name="blogs_sharing_response_declined_received">%s hodhi poshtë ftesë blogu.</string>
<string name="blogs_sharing_invitation_received">%1$s ndau me ju \"%2$s\".</string>
<string name="blogs_sharing_invitation_sent">Ndatë blogun \"%1$s\" me %2$s.</string>
<string name="blogs_sharing_invitations_title">Ftesa Blogu</string>
@@ -309,7 +310,7 @@
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Përditësuar Së Fundi:</string>
<string name="blogs_rss_remove_feed">Hiqe Prurjen</string>
<string name="blogs_rss_remove_feed_dialog_message">Jeni i sigurt se doni të hiqet kjo prurje?\n\nPostimet do të hiqen nga pajisja juaj, por jo nga pajisjet e njerëzve të tjerë.\n\nÇfarëdo kontaktesh me të cilët e keni ndarë këtë prurje mund të reshtin së marri përditësime.</string>
<string name="blogs_rss_remove_feed_dialog_message">Jeni i sigurt se doni të hiqet kjo prurje?\n\nPostimet do të hiqen nga pajisja juaj, por jo nga pajisjet e personave të tjerë.\n\nÇfarëdo kontaktesh me të cilët e keni ndarë këtë prurje mund të reshtin së marri përditësime.</string>
<string name="blogs_rss_remove_feed_ok">Hiqe</string>
<string name="blogs_rss_feeds_manage_delete_error">S\u fshi dot prurja!</string>
<string name="blogs_rss_feeds_manage_empty_state">Ska prurje RSS për shfaqje\n\nPrekni ikonën + që të importohet një prurje</string>
@@ -339,14 +340,14 @@
<string name="tor_mobile_data_title">Përdor të dhëna celulare</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Siguri</string>
<string name="pref_lock_title">Kyçje ekrani</string>
<string name="pref_lock_title">Kyçje aplikacioni</string>
<string name="pref_lock_summary">Përdorni kyçjen e ekranit të pajisjes që të mbroni Briar-in teksa keni bërë hyrjen në llogari </string>
<string name="pref_lock_disabled_summary">Që të përdorni këtë veçori, rregulloni kyçje ekrani për pajisjen tuaj</string>
<string name="pref_lock_timeout_title">Afat mosveprimi për kyçje ekrani</string>
<string name="pref_lock_timeout_title">Skadim kohe mosveprimtarie për kyçje aplikacioni</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Kur Briar-i sështë në përdorim, kyçe vetvetiu pas %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 minuti</string>
<string name="pref_lock_timeout_1">1 minute</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
<string name="pref_lock_timeout_5">5 minutash</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -360,7 +361,7 @@
<string name="change_password">Ndryshoni fjalëkalimin</string>
<string name="current_password">Fjalëkalimi i tanishëm</string>
<string name="choose_new_password">Fjalëkalim i ri</string>
<string name="confirm_new_password">Konfirmo fjalëkalimin e ri</string>
<string name="confirm_new_password">Riopohoni fjalëkalimin e ri</string>
<string name="password_changed">Fjalëkalimi u ndryshua.</string>
<string name="panic_setting">Rregullimi i butonit të panikut</string>
<string name="panic_setting_title">Buton paniku</string>
@@ -371,6 +372,7 @@
<string name="panic_app_setting_none">Asnjë</string>
<string name="dialog_title_connect_panic_app">Ripohoni Aplikacion Paniku</string>
<string name="dialog_message_connect_panic_app">Jeni i sigurt se doni të lejohet %1$s të prodhojë veprime shkatërruese butoni paniku?</string>
<string name="panic_setting_destructive_action">Veprime Shkatërruese</string>
<string name="panic_setting_signout_title">Dilni</string>
<string name="panic_setting_signout_summary">Dil nga Briar-i nëse shtypet një buton paniku</string>
<string name="purge_setting_title">Fshi Llogarinë</string>
@@ -394,8 +396,6 @@
<string name="notify_blog_posts_setting_summary">Shfaq sinjalizime për postime blogu</string>
<string name="notify_blog_posts_setting_summary_26">Formësoni sinjalizime për postime blogu</string>
<string name="notify_vibration_setting">Dridhu</string>
<string name="notify_lock_screen_setting_title">Kyçe Ekranin</string>
<string name="notify_lock_screen_setting_summary">Shfaqi njoftimet edhe me ekran të kyçur</string>
<string name="notify_sound_setting">Tingull</string>
<string name="notify_sound_setting_default">Zilja parazgjedhje</string>
<string name="notify_sound_setting_disabled">Asnjë</string>
@@ -407,10 +407,10 @@
<!--Link Warning-->
<string name="link_warning_title">Sinjalizim Lidhjeje</string>
<string name="link_warning_intro">Ju ndan një hap nga hapja e lidhjes vijuese me një aplikacion të jashtëm.</string>
<string name="link_warning_text">Kjo mund të përdoret për t\ju identifikuar. Mendohuni nëse e besoni apo jo personin që ju dërgoi këtë lidhje dhe shihni mundësinë e hapjes së sja me Orfox</string>
<string name="link_warning_text">Kjo mund të përdoret për t\ju identifikuar. Mendohuni nëse e besoni apo jo personin që ju dërgoi këtë lidhje dhe shihni mundësinë e hapjes së saj me Orfox</string>
<string name="link_warning_open_link">Hape Lidhjen</string>
<!--Crash Reporter-->
<string name="crash_report_title">Njoftim Vithisjesh Briar</string>
<string name="crash_report_title">Njoftim Vithisjesh Briar-i</string>
<string name="briar_crashed">Na ndjeni, Briar-i u vithis.</string>
<string name="not_your_fault">S\është faji juaj.</string>
<string name="please_send_report">Ju lutemi, na ndihmoni të ndërtojmë një Briar më të mirë, duke na dërguar një njoftim vithisjeje.</string>
@@ -429,20 +429,20 @@
<string name="progress_title_logout">Po dilet nga Briar-i…</string>
<!--Screen Filters & Tapjacking-->
<string name="screen_filter_title">U kap dalje jashtë ekrani</string>
<string name="screen_filter_body">Sipër Briar-it po vizaton një tjetër aplikacion. Për të mbrojtur sigurinë tuaj, Briar-i nuk do tu përgjigjet prekjeve kur një tjetër aplikacion vizaton përsipër.\n\nPërsipër mund të jenë duke vizatuar aplikacionet vijues:\n\n%1$s</string>
<string name="screen_filter_body">Sipër Briar-it po vizaton një tjetër aplikacion. Për të mbrojtur sigurinë tuaj, Briar-i nuk do t\u përgjigjet prekjeve kur një tjetër aplikacion vizaton përsipër.\n\nPërsipër mund të jenë duke vizatuar aplikacionet vijues:\n\n%1$s</string>
<string name="screen_filter_allow">Lejoji këto aplikacione të vizatojnë përsipër</string>
<!--Permission Requests-->
<string name="permission_camera_title">Leje mbi kamerën</string>
<string name="permission_camera_request_body">Që të skanojë kodin QR, Briar-i lypset të hyjë te kamera.</string>
<string name="permission_camera_denied_body">Keni mohuar hyrjen në kamera, por shtimi i kontakteve lyp përdorimin e kamerës.\n\nJu lutemi, shihni mundësinë e akordimit të hyrjes.</string>
<string name="permission_camera_denied_toast">S\u dhanë leje mbi kamerën</string>
<string name="permission_camera_denied_toast">S\u akorduan leje mbi kamerën</string>
<string name="qr_code">Kod QR</string>
<string name="show_qr_code_fullscreen">Shfaqe kodin QR sa tërë ekrani</string>
<!--App Locking-->
<string name="lock_unlock">Shkyçe Briar-in</string>
<string name="lock_unlock_verbose">Jepni PIN-in, mostrën ose fjalëkalimin e pajisjes tuaj, që të shkyçet Briar-i</string>
<string name="lock_unlock_fingerprint_description">Prekni sensorin e shenjave të gishtërinjëve me gishtin e regjistruar për të vazhduar</string>
<string name="lock_unlock_password">Përdorni fjalëkalimin</string>
<string name="lock_unlock_verbose">Që të shkyçet Briar-i, jepni PIN-in, mostrën ose fjalëkalimin e pajisjes tuaj</string>
<string name="lock_unlock_fingerprint_description">Që të vazhdohet, prekni me gishtin e regjistruar ndijuesin e shenjave të gishtave</string>
<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>
</resources>

View File

@@ -136,9 +136,6 @@ Izaberite dugačku lozinku koju je teško pogoditi, kao četiri nasumične rije
<string name="contact_added_toast">Kontakt dodat: %s</string>
<string name="contact_already_exists">Kontakt %s već postoji</string>
<string name="qr_code_invalid">QR kod nije validan</string>
<string name="qr_code_unsupported">QR kod koji skenirate pripada staroj verziji %s koja nije više podržana.
Molim vas provjerite da oboje imate posljednju verziju a onda pokušajte ponovo.</string>
<string name="camera_error">Greska kamere</string>
<string name="connecting_to_device">Povezujem se sa uređajem\u2026</string>
<string name="authenticating_with_device">Autentikacija sa uređajem\u2026</string>
@@ -369,10 +366,10 @@ Dotaknite + ikonu da uvezete kanal</string>
<string name="tor_mobile_data_title">Koristi mobilinu mrežu</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">Sigurnost</string>
<string name="pref_lock_title">Zaključavanje ekrana</string>
<string name="pref_lock_title">Zakljucavanje applikacije</string>
<string name="pref_lock_summary">Koristi zaključavanje ekrana uređaja da bi zaštitili Briar dok ste prijavljeni</string>
<string name="pref_lock_disabled_summary">Da bi koristili ovu mogućnost, podesite zaključavanje ekrana za vaš uređaj</string>
<string name="pref_lock_timeout_title">Isteklo vrijeme neaktivnosti zaključavanja ekrana</string>
<string name="pref_lock_timeout_title">Zaključavanje aplikacije po neaktivnosti</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">Kada se ne koristi Briar, automatski zaključaj poslije %s</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -424,8 +421,6 @@ Dotaknite + ikonu da uvezete kanal</string>
<string name="notify_blog_posts_setting_summary">Prikaži upozorenja na blog postove</string>
<string name="notify_blog_posts_setting_summary_26">Podesite upozorenja za blog postove</string>
<string name="notify_vibration_setting">Vibriranje</string>
<string name="notify_lock_screen_setting_title">Zaključaj ekran</string>
<string name="notify_lock_screen_setting_summary">Prikaži obavještenja na zaključanom ekranu</string>
<string name="notify_sound_setting">Zvuk</string>
<string name="notify_sound_setting_default">Podrazumijevanio zvono</string>
<string name="notify_sound_setting_disabled">Ništa</string>

View File

@@ -124,7 +124,6 @@
<string name="contact_added_toast">联系人已添加:%s</string>
<string name="contact_already_exists">联系人 %s 已存在</string>
<string name="qr_code_invalid">二维码无效</string>
<string name="qr_code_unsupported">您正在扫描的是来自旧版本 %s 版的二维码,该版本目前已不再支持。\n\n请确保你们两人都在运行最新版本并重试。</string>
<string name="camera_error">相机出错</string>
<string name="connecting_to_device">正在连接至设备\u2026</string>
<string name="authenticating_with_device">正在验证设备\u2026</string>
@@ -329,10 +328,8 @@
<string name="tor_mobile_data_title">使用移动数据</string>
<!--Settings Security and Panic-->
<string name="security_settings_title">安全</string>
<string name="pref_lock_title">屏幕锁定</string>
<string name="pref_lock_summary">登录后,使用设备的屏幕锁定保护 Briar</string>
<string name="pref_lock_disabled_summary">为了使用该功能,请为设备设置屏幕锁定</string>
<string name="pref_lock_timeout_title">屏幕锁定所需的无操作时间</string>
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
<string name="pref_lock_timeout_summary">当有 %s 不使用 Briar 后,自动将其锁定</string>
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
@@ -384,8 +381,6 @@
<string name="notify_blog_posts_setting_summary">显示博文通知</string>
<string name="notify_blog_posts_setting_summary_26">设置博文通知</string>
<string name="notify_vibration_setting">震动</string>
<string name="notify_lock_screen_setting_title">锁定屏幕</string>
<string name="notify_lock_screen_setting_summary">在锁定屏幕上显示通知</string>
<string name="notify_sound_setting">声音</string>
<string name="notify_sound_setting_default">默认铃声</string>
<string name="notify_sound_setting_disabled"></string>

View File

@@ -398,6 +398,7 @@
<string name="panic_app_setting_none">None</string>
<string name="dialog_title_connect_panic_app">Confirm Panic App</string>
<string name="dialog_message_connect_panic_app">Are you sure that you want to allow %1$s to trigger destructive panic button actions?</string>
<string name="panic_setting_destructive_action">Destructive Actions</string>
<string name="panic_setting_signout_title">Sign Out</string>
<string name="panic_setting_signout_summary">Sign out of Briar if a panic button is pressed</string>
<string name="purge_setting_title">Delete Account</string>
@@ -479,4 +480,20 @@
<string name="lock_is_locked">Briar is locked</string>
<string name="lock_tap_to_unlock">Tap to unlock</string>
<!-- Screenshots -->
<!-- This is a name to be used in screenshots. Feel free to change it to a local name. -->
<string name="screenshot_alice">Alice</string>
<!-- This is a name to be used in screenshots. Feel free to change it to a local name. -->
<string name="screenshot_bob">Bob</string>
<!-- This is a name to be used in screenshots. Feel free to change it to a local name. -->
<string name="screenshot_carol">Carol</string>
<!-- This is a message to be used in screenshots. Please use the same translation for Bob! -->
<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">Hi Alice! Thanks for telling me about Briar!</string>
<!-- This is a message to be used in screenshots. -->
<string name="screenshot_message_3">No problem, hope you like it 😀</string>
</resources>

View File

@@ -2,31 +2,29 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:key="pref_key_panic_app"
android:summary="@string/panic_app_setting_summary"
android:title="@string/panic_app_setting_title"/>
<SwitchPreference
android:defaultValue="true"
android:enabled="false"
android:key="pref_key_lock"
android:summary="@string/panic_setting_signout_summary"
android:title="@string/panic_setting_signout_title"/>
<SwitchPreference
android:defaultValue="false"
android:enabled="false"
android:key="pref_key_purge"
android:summary="@string/purge_setting_summary"
android:title="@string/purge_setting_title"/>
<PreferenceCategory
android:layout="@layout/preferences_category"
android:title="@string/panic_setting_destructive_action">
<SwitchPreference
android:defaultValue="false"
android:enabled="false"
android:key="pref_key_uninstall"
android:summary="@string/uninstall_setting_summary"
android:title="@string/uninstall_setting_title"/>
<ListPreference
android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:key="pref_key_panic_app"
android:summary="@string/panic_app_setting_summary"
android:title="@string/panic_app_setting_title"/>
<SwitchPreference
android:defaultValue="false"
android:enabled="false"
android:key="pref_key_purge"
android:summary="@string/purge_setting_summary"
android:title="@string/purge_setting_title"/>
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -82,6 +82,7 @@ dependencyVerification {
'com.google.zxing:core:3.3.0:core-3.3.0.jar:bba7724e02a997cec38213af77133ee8e24b0d5cf5fa7ecbc16a4fa93f11ee0d',
'com.googlecode.json-simple:json-simple:1.1:json-simple-1.1.jar:2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439',
'com.ibm.icu:icu4j:53.1:icu4j-53.1.jar:e37a4467bac5cdeb02c5c4b8e5063d2f4e67b69e3c7df6d6b610f13185572bab',
'com.jraska:falcon:1.0.4:falcon-1.0.4.aar:6114a48d8b3814f75fc69b5e84dc087c1254883874eae8a36bd778979800630a',
'com.squareup:javawriter:2.1.1:javawriter-2.1.1.jar:f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e',
'com.squareup:javawriter:2.5.0:javawriter-2.5.0.jar:fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0',
'com.sun.activation:javax.activation:1.2.0:javax.activation-1.2.0.jar:993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce',
@@ -171,7 +172,7 @@ dependencyVerification {
'org.robolectric:shadows-framework:3.8:shadows-framework-3.8.jar:83548db7249edf1af87e1a1f4d8f4eec3e85d6220161da601e6f6398476911b2',
'org.robolectric:shadows-support-v4:3.3.2:shadows-support-v4-3.3.2.jar:6f689264738266e70fe08db7c04b7b5a75155994f4e3f7f311960d90486bf005',
'org.robolectric:utils:3.8:utils-3.8.jar:e945d04d40e37554e02d4be1bc3abf9bede45375c843aa36d10ccb6b63edbf34',
'tools.fastlane:screengrab:1.1.0:screengrab-1.1.0.aar:03ce3868ee8a0082d14e7a1de0999f91531c0cc794392688beb08ee9bc4495fd',
'tools.fastlane:screengrab:1.2.0:screengrab-1.2.0.aar:af4ee23bb06f94404d3ab18e2ea69db8265539fc8da29f9ee45b7e472684ba83',
'uk.co.samuelwall:material-tap-target-prompt:2.8.0:material-tap-target-prompt-2.8.0.aar:ac70770c05bbc4675a1d5712c0e53d46ee4fa961b74947589fce50d8003065ec',
'xmlpull:xmlpull:1.1.3.1:xmlpull-1.1.3.1.jar:34e08ee62116071cbb69c0ed70d15a7a5b208d62798c59f2120bb8929324cb63',
'xpp3:xpp3_min:1.1.4c:xpp3_min-1.1.4c.jar:bfc90e9e32d0eab1f397fb974b5f150a815188382ac41f372a7149d5bc178008',

View File

@@ -1,12 +1,16 @@
package org.briarproject.briar.api.test;
import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@NotNullByDefault
public interface TestDataCreator {
/**
* Create fake test data on the DatabaseExecutor
* Create fake test data on the IoExecutor
*
* @param numContacts Number of contacts to create. Must be >= 1
* @param numPrivateMsgs Number of private messages to create for each
@@ -18,4 +22,11 @@ public interface TestDataCreator {
void createTestData(int numContacts, int numPrivateMsgs, int numBlogPosts,
int numForums, int numForumPosts);
@IoExecutor
Contact addContact(String name) throws DbException;
@IoExecutor
void addPrivateMessage(Contact contact, String body, long time,
boolean local) throws DbException, FormatException;
}

View File

@@ -13,9 +13,11 @@ import org.briarproject.bramble.api.db.DatabaseComponent;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.identity.AuthorFactory;
import org.briarproject.bramble.api.identity.AuthorId;
import org.briarproject.bramble.api.identity.IdentityManager;
import org.briarproject.bramble.api.identity.LocalAuthor;
import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.BluetoothConstants;
import org.briarproject.bramble.api.plugin.LanTcpConstants;
import org.briarproject.bramble.api.plugin.TorConstants;
@@ -59,6 +61,7 @@ import static org.briarproject.bramble.util.StringUtils.getRandomString;
import static org.briarproject.briar.test.TestData.AUTHOR_NAMES;
import static org.briarproject.briar.test.TestData.GROUP_NAMES;
@NotNullByDefault
public class TestDataCreatorImpl implements TestDataCreator {
private final Logger LOG =
@@ -146,17 +149,17 @@ public class TestDataCreatorImpl implements TestDataCreator {
List<Contact> contacts = new ArrayList<>(numContacts);
LocalAuthor localAuthor = identityManager.getLocalAuthor();
for (int i = 0; i < numContacts; i++) {
Contact contact = addRandomContact(localAuthor);
LocalAuthor author = getRandomAuthor();
Contact contact = addContact(localAuthor.getId(), author);
contacts.add(contact);
}
return contacts;
}
private Contact addRandomContact(LocalAuthor localAuthor)
private Contact addContact(AuthorId localAuthorId, LocalAuthor author)
throws DbException {
// prepare to add contact
LocalAuthor author = getRandomAuthor();
SecretKey secretKey = getSecretKey();
long timestamp = clock.currentTimeMillis();
boolean verified = random.nextBoolean();
@@ -169,7 +172,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
Transaction txn = db.startTransaction(false);
try {
ContactId contactId = contactManager
.addContact(txn, author, localAuthor.getId(), secretKey,
.addContact(txn, author, localAuthorId, secretKey,
timestamp, true, verified, true);
transportPropertyManager.addRemoteProperties(txn, contactId, props);
contact = db.getContact(txn, contactId);
@@ -186,14 +189,23 @@ public class TestDataCreatorImpl implements TestDataCreator {
return contact;
}
private LocalAuthor getRandomAuthor() {
int i = random.nextInt(AUTHOR_NAMES.length);
String authorName = AUTHOR_NAMES[i];
@Override
public Contact addContact(String name) throws DbException {
LocalAuthor localAuthor = identityManager.getLocalAuthor();
return addContact(localAuthor.getId(), getAuthor(name));
}
private LocalAuthor getAuthor(String name) {
KeyPair keyPair = cryptoComponent.generateSignatureKeyPair();
byte[] publicKey = keyPair.getPublic().getEncoded();
byte[] privateKey = keyPair.getPrivate().getEncoded();
return authorFactory.createLocalAuthor(authorName, publicKey,
privateKey);
return authorFactory.createLocalAuthor(name, publicKey, privateKey);
}
private LocalAuthor getRandomAuthor() {
int i = random.nextInt(AUTHOR_NAMES.length);
String authorName = AUTHOR_NAMES[i];
return getAuthor(authorName);
}
private SecretKey getSecretKey() {
@@ -285,7 +297,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
Group group = messagingManager.getContactGroup(contact);
for (int i = 0; i < numPrivateMsgs; i++) {
try {
createPrivateMessage(group.getId(), i);
createRandomPrivateMessage(group.getId(), i);
} catch (FormatException e) {
throw new RuntimeException(e);
}
@@ -297,14 +309,18 @@ public class TestDataCreatorImpl implements TestDataCreator {
}
}
private void createPrivateMessage(GroupId groupId, int num)
private void createRandomPrivateMessage(GroupId groupId, int num)
throws DbException, FormatException {
long timestamp = clock.currentTimeMillis() - num * 60 * 1000;
String body = getRandomText();
boolean local = random.nextBoolean();
createPrivateMessage(groupId, body, timestamp, local);
}
private void createPrivateMessage(GroupId groupId, String body,
long timestamp, boolean local) throws DbException, FormatException {
PrivateMessage m = privateMessageFactory
.createPrivateMessage(groupId, timestamp, body);
boolean local = random.nextBoolean();
BdfDictionary meta = new BdfDictionary();
meta.put("timestamp", timestamp);
meta.put("local", local);
@@ -321,6 +337,13 @@ public class TestDataCreatorImpl implements TestDataCreator {
}
}
@Override
public void addPrivateMessage(Contact contact, String body, long time,
boolean local) throws DbException, FormatException {
Group group = messagingManager.getContactGroup(contact);
createPrivateMessage(group.getId(), body, time, local);
}
private void createBlogPosts(List<Contact> contacts, int numBlogPosts)
throws DbException {
for (int i = 0; i < numBlogPosts; i++) {