mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 18:59:06 +01:00
Compare commits
140 Commits
client-ver
...
beta-1.5.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d3261a3f9a | ||
|
|
e81ee42eff | ||
|
|
955d9488d0 | ||
|
|
9ad496d91f | ||
|
|
7b6dd54977 | ||
|
|
a53e3f2d47 | ||
|
|
65f4f09d8f | ||
|
|
cbe3f6b114 | ||
|
|
d56d634cc1 | ||
|
|
1c1c6096b5 | ||
|
|
07f85b14ec | ||
|
|
0bec8fa9b1 | ||
|
|
1a7dfa15b0 | ||
|
|
070a0181d9 | ||
|
|
d83ae3a3b4 | ||
|
|
143f04bf1b | ||
|
|
138fa6f39d | ||
|
|
8e1371acf0 | ||
|
|
29f0b9d3c0 | ||
|
|
eb45ccfe9e | ||
|
|
e98b5a9882 | ||
|
|
1a603d52da | ||
|
|
1e74b213e3 | ||
|
|
292808dbfc | ||
|
|
a3f1ce6d87 | ||
|
|
8962fefd14 | ||
|
|
7034524fa1 | ||
|
|
a6153c91ed | ||
|
|
dd0175f4aa | ||
|
|
7c6e351a37 | ||
|
|
05c3e9bf40 | ||
|
|
68d26bf25e | ||
|
|
daa03b1d73 | ||
|
|
1e71361700 | ||
|
|
a89a0cbaa3 | ||
|
|
1dbb8aa512 | ||
|
|
e8ed0b4703 | ||
|
|
c76a76318c | ||
|
|
5a34e2c0ab | ||
|
|
ad5349c8a7 | ||
|
|
863db40f8e | ||
|
|
4f8ac5f734 | ||
|
|
6e4052fa87 | ||
|
|
23ac592f27 | ||
|
|
4a1a09c855 | ||
|
|
2dd0be879e | ||
|
|
d369b9d150 | ||
|
|
4cc7619838 | ||
|
|
2af1e5c421 | ||
|
|
3d60ec5e97 | ||
|
|
48e7ffde92 | ||
|
|
a8b561afb2 | ||
|
|
69db146a03 | ||
|
|
e5f49674ce | ||
|
|
27b8a8a105 | ||
|
|
bfbbdd897f | ||
|
|
f6f5570ac6 | ||
|
|
07ab0146dd | ||
|
|
5bba0daa89 | ||
|
|
dcaf873117 | ||
|
|
19d9e823a8 | ||
|
|
10a24c5966 | ||
|
|
642ac3fbe0 | ||
|
|
675e984eaa | ||
|
|
03196b65ab | ||
|
|
d5f920e9b9 | ||
|
|
6f937eb929 | ||
|
|
e8ee0f4b44 | ||
|
|
ab223da18c | ||
|
|
ccd191b692 | ||
|
|
fd7088389f | ||
|
|
424e022388 | ||
|
|
16385ecafe | ||
|
|
7d95eb4de6 | ||
|
|
0724bb89b2 | ||
|
|
f1662d7311 | ||
|
|
8980cc07d2 | ||
|
|
04e14cfa29 | ||
|
|
8fa0866243 | ||
|
|
a406eb5651 | ||
|
|
8a8c6256a5 | ||
|
|
c076a8e2cd | ||
|
|
c0234ebe13 | ||
|
|
b15d316946 | ||
|
|
e40c0caf97 | ||
|
|
f3af1d90d1 | ||
|
|
fe6ce2fe67 | ||
|
|
65f7a02c33 | ||
|
|
ea7433ffca | ||
|
|
48b6dcf0ff | ||
|
|
ca9181ee3f | ||
|
|
f16875c602 | ||
|
|
551dba9425 | ||
|
|
07f49e4f1e | ||
|
|
ca14b4bd68 | ||
|
|
58883467f7 | ||
|
|
422a99888b | ||
|
|
28453f28d0 | ||
|
|
f00cfe5ca9 | ||
|
|
3ecb281695 | ||
|
|
eb3a5423bf | ||
|
|
73fa1052cf | ||
|
|
14fded3777 | ||
|
|
17f5433ab0 | ||
|
|
1752bca2ae | ||
|
|
9d9a7ff99d | ||
|
|
36e69c54df | ||
|
|
a3b10cc0d1 | ||
|
|
f683d4f3a9 | ||
|
|
ea1c58110f | ||
|
|
b559c7782d | ||
|
|
6ae601e395 | ||
|
|
c5c1fdb61c | ||
|
|
cc9ebe9eda | ||
|
|
05b9dd699e | ||
|
|
09a9a00af6 | ||
|
|
67797d0378 | ||
|
|
87ef5e58ee | ||
|
|
b8b5e6c201 | ||
|
|
4b11f3c0b3 | ||
|
|
cc47c8522a | ||
|
|
b68d24dca5 | ||
|
|
8bb3ea8a85 | ||
|
|
e13563952b | ||
|
|
c74ebabcd1 | ||
|
|
47b8f47f07 | ||
|
|
d0feacd38f | ||
|
|
2844adb8fa | ||
|
|
f02dcc9f70 | ||
|
|
8ab7eb7edf | ||
|
|
1ef1ccc1f7 | ||
|
|
c7e382c1af | ||
|
|
38a7217c3f | ||
|
|
6d3e81a074 | ||
|
|
4591de2017 | ||
|
|
6da34fac84 | ||
|
|
810ac24cee | ||
|
|
704f69c9fd | ||
|
|
b1cc63cd49 | ||
|
|
8cd6546840 |
@@ -7,6 +7,7 @@ stages:
|
|||||||
|
|
||||||
variables:
|
variables:
|
||||||
GIT_SUBMODULE_STRATEGY: recursive
|
GIT_SUBMODULE_STRATEGY: recursive
|
||||||
|
JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
|
||||||
|
|
||||||
workflow:
|
workflow:
|
||||||
# when to create a CI pipeline
|
# when to create a CI pipeline
|
||||||
|
|||||||
7
.idea/codeStyles/Project.xml
generated
7
.idea/codeStyles/Project.xml
generated
@@ -4,6 +4,7 @@
|
|||||||
<option name="ANNOTATION_PARAMETER_WRAP" value="1" />
|
<option name="ANNOTATION_PARAMETER_WRAP" value="1" />
|
||||||
<option name="IMPORT_LAYOUT_TABLE">
|
<option name="IMPORT_LAYOUT_TABLE">
|
||||||
<value>
|
<value>
|
||||||
|
<package name="" withSubpackages="true" static="false" module="true" />
|
||||||
<package name="android" withSubpackages="true" static="false" />
|
<package name="android" withSubpackages="true" static="false" />
|
||||||
<emptyLine />
|
<emptyLine />
|
||||||
<package name="com" withSubpackages="true" static="false" />
|
<package name="com" withSubpackages="true" static="false" />
|
||||||
@@ -28,15 +29,11 @@
|
|||||||
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false" />
|
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false" />
|
||||||
</JavaCodeStyleSettings>
|
</JavaCodeStyleSettings>
|
||||||
<JetCodeStyleSettings>
|
<JetCodeStyleSettings>
|
||||||
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
|
|
||||||
<value />
|
|
||||||
</option>
|
|
||||||
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
|
|
||||||
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
|
|
||||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||||
</JetCodeStyleSettings>
|
</JetCodeStyleSettings>
|
||||||
<codeStyleSettings language="Groovy">
|
<codeStyleSettings language="Groovy">
|
||||||
<indentOptions>
|
<indentOptions>
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||||
<option name="USE_TAB_CHARACTER" value="true" />
|
<option name="USE_TAB_CHARACTER" value="true" />
|
||||||
<option name="SMART_TABS" value="true" />
|
<option name="SMART_TABS" value="true" />
|
||||||
</indentOptions>
|
</indentOptions>
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -1,7 +1,7 @@
|
|||||||
# Briar
|
# Briar
|
||||||
Briar is a messaging app designed for activists, journalists, and anyone else who needs a safe, easy and robust way to communicate.
|
Briar is a messaging app designed for activists, journalists, and anyone else who needs a safe, easy and robust way to communicate.
|
||||||
|
|
||||||
Unlike traditional messaging tools such as email, Twitter or Telegram, Briar doesn't rely on a central server - messages are synchronized directly between the users' devices.
|
Unlike traditional messaging apps, Briar doesn't rely on a central server - messages are synchronized directly between the users' devices.
|
||||||
|
|
||||||
If the Internet's down, Briar can sync via Bluetooth or Wi-Fi, keeping information flowing in a crisis. If the Internet's up, Briar can sync via the Tor network, protecting users and their relationships from surveillance.
|
If the Internet's down, Briar can sync via Bluetooth or Wi-Fi, keeping information flowing in a crisis. If the Internet's up, Briar can sync via the Tor network, protecting users and their relationships from surveillance.
|
||||||
|
|
||||||
@@ -14,14 +14,16 @@ You can also [download the APK file](https://briarproject.org/apk) directly from
|
|||||||
our site.
|
our site.
|
||||||
|
|
||||||
## Useful links
|
## Useful links
|
||||||
[briarproject.org](https://briarproject.org/)
|
[Project website](https://briarproject.org/)
|
||||||
|
|
||||||
[Source code](https://code.briarproject.org/briar/briar/tree/master)
|
[Source code](https://code.briarproject.org/briar/briar/tree/master)
|
||||||
|
|
||||||
[Manual](https://briarproject.org/manual/)
|
[User manual](https://briarproject.org/manual/)
|
||||||
|
|
||||||
[Wiki](https://code.briarproject.org/briar/briar/-/wikis/home)
|
[Wiki](https://code.briarproject.org/briar/briar/-/wikis/home)
|
||||||
|
|
||||||
|
[Privacy policy](https://briarproject.org/privacy)
|
||||||
|
|
||||||
## Reproducible builds
|
## Reproducible builds
|
||||||
|
|
||||||
We provide [docker images](https://code.briarproject.org/briar/briar-reproducer#briar-reproducer)
|
We provide [docker images](https://code.briarproject.org/briar/briar-reproducer#briar-reproducer)
|
||||||
@@ -33,5 +35,5 @@ for reproduction.
|
|||||||
|
|
||||||
## Donate
|
## Donate
|
||||||
|
|
||||||
[](https://liberapay.com/Briar/donate) [](https://flattr.com/t/592836/)
|
[](https://liberapay.com/Briar/donate)
|
||||||
Bitcoin and BCH: 1NZCKkUCtJV2U2Y9hDb9uq8S7ksFCFGR6K
|
Bitcoin and BCH: 1NZCKkUCtJV2U2Y9hDb9uq8S7ksFCFGR6K
|
||||||
|
|||||||
@@ -3,18 +3,18 @@ apply plugin: 'witness'
|
|||||||
apply from: 'witness.gradle'
|
apply from: 'witness.gradle'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 33
|
compileSdkVersion 35
|
||||||
buildToolsVersion '33.0.0'
|
buildToolsVersion '35.0.0'
|
||||||
|
|
||||||
packagingOptions {
|
packagingOptions {
|
||||||
doNotStrip '**/*.so'
|
jniLibs {
|
||||||
|
keepDebugSymbols += ['**/*.so']
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 33
|
targetSdkVersion 35
|
||||||
versionCode 10504
|
|
||||||
versionName "1.5.4"
|
|
||||||
consumerProguardFiles 'proguard-rules.txt'
|
consumerProguardFiles 'proguard-rules.txt'
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
@@ -25,14 +25,11 @@ android {
|
|||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
namespace 'org.briarproject.bramble'
|
||||||
lintOptions {
|
lint {
|
||||||
// FIXME
|
warning 'LintError', 'InvalidPackage', 'MissingPermission', 'InlinedApi', 'ObsoleteSdkInt', 'Override', 'NewApi', 'UnusedAttribute'
|
||||||
warning "LintError"
|
|
||||||
warning "InvalidPackage"
|
|
||||||
warning "MissingPermission"
|
|
||||||
warning "InlinedApi", "ObsoleteSdkInt", "Override", "NewApi", "UnusedAttribute"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
@@ -40,7 +37,7 @@ configurations {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api 'org.briarproject:dont-kill-me-lib:0.2.7'
|
api 'org.briarproject:dont-kill-me-lib:0.2.8'
|
||||||
|
|
||||||
// In theory this dependency shouldn't be needed, but without it Android Studio's linter will
|
// In theory this dependency shouldn't be needed, but without it Android Studio's linter will
|
||||||
// complain about unresolved symbols for bramble-api test classes in bramble-android tests,
|
// complain about unresolved symbols for bramble-api test classes in bramble-android tests,
|
||||||
@@ -54,8 +51,7 @@ dependencies {
|
|||||||
implementation "org.briarproject:onionwrapper-android:$onionwrapper_version"
|
implementation "org.briarproject:onionwrapper-android:$onionwrapper_version"
|
||||||
|
|
||||||
tor "org.briarproject:tor-android:$tor_version"
|
tor "org.briarproject:tor-android:$tor_version"
|
||||||
tor "org.briarproject:obfs4proxy-android:$obfs4proxy_version"
|
tor "org.briarproject:lyrebird-android:$lyrebird_version"
|
||||||
tor "org.briarproject:snowflake-android:$snowflake_version"
|
|
||||||
|
|
||||||
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
package="org.briarproject.bramble">
|
|
||||||
|
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.bluetooth"
|
android:name="android.hardware.bluetooth"
|
||||||
@@ -8,10 +7,8 @@
|
|||||||
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
<!-- The BLUETOOTH permission was supposed to be removed in API 31 but is still needed on some Xiaomi/Redmi/POCO devices running API 31 and Nubia devices running API 32 -->
|
<!-- The BLUETOOTH permission was supposed to be removed in API 31 but is still needed on some Xiaomi/Redmi/POCO devices running API 31 and Nubia devices running API 32/33 -->
|
||||||
<uses-permission
|
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||||
android:name="android.permission.BLUETOOTH"
|
|
||||||
android:maxSdkVersion="32" />
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.BLUETOOTH_ADMIN"
|
android:name="android.permission.BLUETOOTH_ADMIN"
|
||||||
android:maxSdkVersion="30" />
|
android:maxSdkVersion="30" />
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import static android.os.PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED;
|
|||||||
import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGED;
|
import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGED;
|
||||||
import static java.util.logging.Level.INFO;
|
import static java.util.logging.Level.INFO;
|
||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
|
import static org.briarproject.bramble.util.AndroidUtils.registerReceiver;
|
||||||
|
|
||||||
class AndroidBatteryManager implements BatteryManager, Service {
|
class AndroidBatteryManager implements BatteryManager, Service {
|
||||||
|
|
||||||
@@ -52,7 +53,7 @@ class AndroidBatteryManager implements BatteryManager, Service {
|
|||||||
public boolean isCharging() {
|
public boolean isCharging() {
|
||||||
// Get the sticky intent for ACTION_BATTERY_CHANGED
|
// Get the sticky intent for ACTION_BATTERY_CHANGED
|
||||||
IntentFilter filter = new IntentFilter(ACTION_BATTERY_CHANGED);
|
IntentFilter filter = new IntentFilter(ACTION_BATTERY_CHANGED);
|
||||||
Intent i = appContext.registerReceiver(null, filter);
|
Intent i = registerReceiver(appContext, null, filter, false);
|
||||||
if (i == null) return false;
|
if (i == null) return false;
|
||||||
int status = i.getIntExtra(EXTRA_PLUGGED, 0);
|
int status = i.getIntExtra(EXTRA_PLUGGED, 0);
|
||||||
return status != 0;
|
return status != 0;
|
||||||
@@ -71,7 +72,7 @@ class AndroidBatteryManager implements BatteryManager, Service {
|
|||||||
filter.addAction(ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
|
filter.addAction(ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
|
||||||
filter.addAction(ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED);
|
filter.addAction(ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED);
|
||||||
}
|
}
|
||||||
appContext.registerReceiver(batteryReceiver, filter);
|
registerReceiver(appContext, batteryReceiver, filter, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ import static java.util.concurrent.TimeUnit.SECONDS;
|
|||||||
import static java.util.logging.Level.INFO;
|
import static java.util.logging.Level.INFO;
|
||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
|
import static org.briarproject.bramble.util.AndroidUtils.registerReceiver;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
import static org.briarproject.nullsafety.NullSafety.requireNonNull;
|
import static org.briarproject.nullsafety.NullSafety.requireNonNull;
|
||||||
|
|
||||||
@@ -103,7 +104,7 @@ class AndroidNetworkManager implements NetworkManager, Service {
|
|||||||
filter.addAction(WIFI_AP_STATE_CHANGED_ACTION);
|
filter.addAction(WIFI_AP_STATE_CHANGED_ACTION);
|
||||||
filter.addAction(WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
|
filter.addAction(WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
|
||||||
if (SDK_INT >= 23) filter.addAction(ACTION_DEVICE_IDLE_MODE_CHANGED);
|
if (SDK_INT >= 23) filter.addAction(ACTION_DEVICE_IDLE_MODE_CHANGED);
|
||||||
app.registerReceiver(networkStateReceiver, filter);
|
registerReceiver(app, networkStateReceiver, filter, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ import static java.util.logging.Level.INFO;
|
|||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.briarproject.bramble.util.AndroidUtils.hasBtConnectPermission;
|
import static org.briarproject.bramble.util.AndroidUtils.hasBtConnectPermission;
|
||||||
|
import static org.briarproject.bramble.util.AndroidUtils.registerReceiver;
|
||||||
import static org.briarproject.bramble.util.PrivacyUtils.scrubMacAddress;
|
import static org.briarproject.bramble.util.PrivacyUtils.scrubMacAddress;
|
||||||
|
|
||||||
@MethodsNotNullByDefault
|
@MethodsNotNullByDefault
|
||||||
@@ -112,7 +113,7 @@ class AndroidBluetoothPlugin extends
|
|||||||
filter.addAction(ACTION_STATE_CHANGED);
|
filter.addAction(ACTION_STATE_CHANGED);
|
||||||
filter.addAction(ACTION_SCAN_MODE_CHANGED);
|
filter.addAction(ACTION_SCAN_MODE_CHANGED);
|
||||||
receiver = new BluetoothStateReceiver();
|
receiver = new BluetoothStateReceiver();
|
||||||
app.registerReceiver(receiver, filter);
|
registerReceiver(app, receiver, filter, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -237,7 +238,7 @@ class AndroidBluetoothPlugin extends
|
|||||||
filter.addAction(ACTION_DISCOVERY_STARTED);
|
filter.addAction(ACTION_DISCOVERY_STARTED);
|
||||||
filter.addAction(ACTION_DISCOVERY_FINISHED);
|
filter.addAction(ACTION_DISCOVERY_FINISHED);
|
||||||
filter.addAction(ACTION_FOUND);
|
filter.addAction(ACTION_FOUND);
|
||||||
app.registerReceiver(receiver, filter);
|
registerReceiver(app, receiver, filter, true);
|
||||||
try {
|
try {
|
||||||
if (adapter.startDiscovery()) {
|
if (adapter.startDiscovery()) {
|
||||||
long now = clock.currentTimeMillis();
|
long now = clock.currentTimeMillis();
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private InetAddress getIpv6AddressForInterface(InetAddress ipv4) {
|
private InetAddress getIpv6AddressForInterface(InetAddress ipv4) {
|
||||||
try {
|
try {
|
||||||
|
// We may get an NPE from getByInetAddress() on Android 11
|
||||||
NetworkInterface iface = NetworkInterface.getByInetAddress(ipv4);
|
NetworkInterface iface = NetworkInterface.getByInetAddress(ipv4);
|
||||||
if (iface == null) return null;
|
if (iface == null) return null;
|
||||||
for (InetAddress addr : list(iface.getInetAddresses())) {
|
for (InetAddress addr : list(iface.getInetAddresses())) {
|
||||||
@@ -208,7 +209,7 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
|
|||||||
}
|
}
|
||||||
// No suitable address
|
// No suitable address
|
||||||
return null;
|
return null;
|
||||||
} catch (SocketException e) {
|
} catch (SocketException | NullPointerException e) {
|
||||||
logException(LOG, WARNING, e);
|
logException(LOG, WARNING, e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ import javax.annotation.concurrent.Immutable;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.net.SocketFactory;
|
import javax.net.SocketFactory;
|
||||||
|
|
||||||
import static android.os.Build.VERSION.SDK_INT;
|
|
||||||
import static org.briarproject.bramble.util.AndroidUtils.getSupportedArchitectures;
|
import static org.briarproject.bramble.util.AndroidUtils.getSupportedArchitectures;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@@ -86,15 +85,10 @@ public class AndroidTorPluginFactory extends TorPluginFactory {
|
|||||||
TorWrapper tor = new AndroidTorWrapper(app, wakeLockManager,
|
TorWrapper tor = new AndroidTorWrapper(app, wakeLockManager,
|
||||||
ioExecutor, eventExecutor, architecture, torDirectory,
|
ioExecutor, eventExecutor, architecture, torDirectory,
|
||||||
torSocksPort, torControlPort);
|
torSocksPort, torControlPort);
|
||||||
// Android versions 7.1 and newer can verify Let's Encrypt TLS certs
|
|
||||||
// signed with the IdentTrust DST Root X3 certificate. Older versions
|
|
||||||
// of Android consider the certificate to have expired at the end of
|
|
||||||
// September 2021.
|
|
||||||
boolean canVerifyLetsEncryptCerts = SDK_INT >= 25;
|
|
||||||
return new TorPlugin(ioExecutor, wakefulIoExecutor,
|
return new TorPlugin(ioExecutor, wakefulIoExecutor,
|
||||||
networkManager, locationUtils, torSocketFactory,
|
networkManager, locationUtils, torSocketFactory,
|
||||||
circumventionProvider, batteryManager, backoff,
|
circumventionProvider, batteryManager, backoff,
|
||||||
torRendezvousCrypto, tor, callback, MAX_LATENCY,
|
torRendezvousCrypto, tor, callback, MAX_LATENCY,
|
||||||
MAX_IDLE_TIME, canVerifyLetsEncryptCerts);
|
MAX_IDLE_TIME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,10 @@ package org.briarproject.bramble.util;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
@@ -15,22 +18,30 @@ import java.lang.reflect.Field;
|
|||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import static android.Manifest.permission.BLUETOOTH_CONNECT;
|
import static android.Manifest.permission.BLUETOOTH_CONNECT;
|
||||||
import static android.app.PendingIntent.FLAG_IMMUTABLE;
|
import static android.app.PendingIntent.FLAG_IMMUTABLE;
|
||||||
import static android.content.Context.MODE_PRIVATE;
|
import static android.content.Context.MODE_PRIVATE;
|
||||||
|
import static android.content.Context.RECEIVER_EXPORTED;
|
||||||
|
import static android.content.Context.RECEIVER_NOT_EXPORTED;
|
||||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||||
import static android.os.Build.VERSION.SDK_INT;
|
import static android.os.Build.VERSION.SDK_INT;
|
||||||
import static android.os.Process.myPid;
|
import static android.os.Process.myPid;
|
||||||
import static android.os.Process.myUid;
|
import static android.os.Process.myUid;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
|
import static java.util.logging.Level.INFO;
|
||||||
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.briarproject.nullsafety.NullSafety.requireNonNull;
|
import static org.briarproject.nullsafety.NullSafety.requireNonNull;
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class AndroidUtils {
|
public class AndroidUtils {
|
||||||
|
|
||||||
|
private static final Logger LOG =
|
||||||
|
getLogger(AndroidUtils.class.getName());
|
||||||
|
|
||||||
// Fake Bluetooth address returned by BluetoothAdapter on API 23 and later
|
// Fake Bluetooth address returned by BluetoothAdapter on API 23 and later
|
||||||
private static final String FAKE_BLUETOOTH_ADDRESS = "02:00:00:00:00:00";
|
private static final String FAKE_BLUETOOTH_ADDRESS = "02:00:00:00:00:00";
|
||||||
|
|
||||||
@@ -56,18 +67,32 @@ public class AndroidUtils {
|
|||||||
// If we don't have permission to access the adapter's address, let
|
// If we don't have permission to access the adapter's address, let
|
||||||
// the caller know we can't find it
|
// the caller know we can't find it
|
||||||
if (!hasBtConnectPermission(ctx)) return new Pair<>("", "");
|
if (!hasBtConnectPermission(ctx)) return new Pair<>("", "");
|
||||||
// Return the adapter's address if it's valid and not fake
|
|
||||||
@SuppressLint("HardwareIds")
|
@SuppressLint("HardwareIds")
|
||||||
String address = adapter.getAddress();
|
String address;
|
||||||
if (isValidBluetoothAddress(address)) {
|
// Return the adapter's address if it's valid and not fake
|
||||||
return new Pair<>(address, "adapter");
|
try {
|
||||||
|
address = adapter.getAddress();
|
||||||
|
if (isValidBluetoothAddress(address)) {
|
||||||
|
return new Pair<>(address, "adapter");
|
||||||
|
}
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
if (LOG.isLoggable(INFO)) {
|
||||||
|
LOG.info("Security exception when getting BT address: " +
|
||||||
|
e.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Return the address from settings if it's valid and not fake
|
// Return the address from settings if it's valid and not fake
|
||||||
if (SDK_INT < 33) {
|
if (SDK_INT < 33) {
|
||||||
address = Settings.Secure.getString(ctx.getContentResolver(),
|
try {
|
||||||
"bluetooth_address");
|
address = Settings.Secure.getString(ctx.getContentResolver(),
|
||||||
if (isValidBluetoothAddress(address)) {
|
"bluetooth_address");
|
||||||
return new Pair<>(address, "settings");
|
if (isValidBluetoothAddress(address)) {
|
||||||
|
return new Pair<>(address, "settings");
|
||||||
|
}
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
// Some custom ROMs throw this exception on SDK_INT < 33.
|
||||||
|
// Fall through
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Try to get the address via reflection
|
// Try to get the address via reflection
|
||||||
@@ -136,4 +161,21 @@ public class AndroidUtils {
|
|||||||
}
|
}
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Could be replaced to a similar call in ContextCompat once we
|
||||||
|
* use and upgrade to version 1.9.0 or higher of the AndroidX Core library.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
@SuppressLint("UnspecifiedRegisterReceiverFlag") // we specify where needed
|
||||||
|
public static Intent registerReceiver(Context ctx,
|
||||||
|
@Nullable BroadcastReceiver receiver, IntentFilter filter,
|
||||||
|
boolean export) {
|
||||||
|
if (SDK_INT >= 33) {
|
||||||
|
return ctx.registerReceiver(receiver, filter,
|
||||||
|
export ? RECEIVER_EXPORTED : RECEIVER_NOT_EXPORTED);
|
||||||
|
} else {
|
||||||
|
return ctx.registerReceiver(receiver, filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,67 +1,171 @@
|
|||||||
dependencyVerification {
|
dependencyVerification {
|
||||||
verify = [
|
verify = [
|
||||||
'androidx.annotation:annotation:1.5.0:annotation-1.5.0.jar:261fb7c0210858500bab66d34354972a75166ab4182add283780b05513d6ec4a',
|
'androidx.annotation:annotation:1.5.0:annotation-1.5.0.jar:261fb7c0210858500bab66d34354972a75166ab4182add283780b05513d6ec4a',
|
||||||
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
|
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
|
||||||
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
|
'com.android.tools.ddms:ddmlib:31.13.0:ddmlib-31.13.0.jar:839957f961100713ea0eed628a8684cc39aa479631c36249793e6df7e0cd63d8',
|
||||||
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
'com.android.tools.emulator:proto:31.13.0:proto-31.13.0.jar:b77f81cc0751d79393ec4b2eb046f910d21abcd7608b5b0f5a1efea1b3243b48',
|
||||||
'com.google.dagger:dagger-compiler:2.45:dagger-compiler-2.45.jar:5617dfb994537dba5b41f3744a6dd13ec3cd99789c065e0d5c6fa9f21cf7ca25',
|
'com.android.tools.utp:android-device-provider-ddmlib-proto:31.13.0:android-device-provider-ddmlib-proto-31.13.0.jar:047aecdd66e106137f77a52c442f1b83db7d6e8496899800251f206c7f39de65',
|
||||||
'com.google.dagger:dagger-producers:2.45:dagger-producers-2.45.jar:a05abb4c3ccf6bb0f056bdcb5ef973898ecf172952ab5948a824aeea6c86ecaa',
|
'com.android.tools.utp:android-device-provider-ddmlib:31.13.0:android-device-provider-ddmlib-31.13.0.jar:e6c2d4674077610e165524df6e0617b6af0f91358075854d57c1072f5fb0c245',
|
||||||
'com.google.dagger:dagger-spi:2.45:dagger-spi-2.45.jar:7cd6f0b09d88e64a9c97bc80e544ab8ac8fdee9301754413585a74cf64222b27',
|
'com.android.tools.utp:android-device-provider-profile-proto:31.13.0:android-device-provider-profile-proto-31.13.0.jar:3e7b098f6e3ecae31b6f7909c343b4ec09aa18d8a89f41bf92077ba4b056f453',
|
||||||
'com.google.dagger:dagger:2.45:dagger-2.45.jar:f011cae7d2c0fb7ea17c34e05bc10e768b1081a5892ad019cf1fdb0e125c49c1',
|
'com.android.tools.utp:android-device-provider-profile:31.13.0:android-device-provider-profile-31.13.0.jar:1aae6909dd10cf15d100f24871a5b9310fff6d2556d67c3808a1e1663ef471ca',
|
||||||
'com.google.devtools.ksp:symbol-processing-api:1.7.0-1.0.6:symbol-processing-api-1.7.0-1.0.6.jar:adc29417be5ca9ff42118105fea4e36d9ef44987abfc41432309371a60198941',
|
'com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.13.0:android-test-plugin-host-additional-test-output-proto-31.13.0.jar:6ba7e6ac2208d74c1bb5f1d1464abafc6a45d8710b20455a2dc02adf8726bc83',
|
||||||
'com.google.errorprone:error_prone_annotations:2.7.1:error_prone_annotations-2.7.1.jar:cd5257c08a246cf8628817ae71cb822be192ef91f6881ca4a3fcff4f1de1cff3',
|
'com.android.tools.utp:android-test-plugin-host-additional-test-output:31.13.0:android-test-plugin-host-additional-test-output-31.13.0.jar:fc5f224db1b1d21642339dff08e3bcc9bb3b6753c4e6a7d5e750769a7cbbbeb4',
|
||||||
'com.google.errorprone:javac-shaded:9-dev-r4023-3:javac-shaded-9-dev-r4023-3.jar:65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30',
|
'com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.13.0:android-test-plugin-host-apk-installer-proto-31.13.0.jar:4f2b610542e91a35a396b04368a784036e42b8787021460550b9a3495bb8245b',
|
||||||
'com.google.googlejavaformat:google-java-format:1.5:google-java-format-1.5.jar:aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e',
|
'com.android.tools.utp:android-test-plugin-host-apk-installer:31.13.0:android-test-plugin-host-apk-installer-31.13.0.jar:ad4a65f53ed841253b875b3f4232826ca83e92d2f8df2c757944824d9f9bb1e2',
|
||||||
'com.google.guava:failureaccess:1.0.1:failureaccess-1.0.1.jar:a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26',
|
'com.android.tools.utp:android-test-plugin-host-coverage-proto:31.13.0:android-test-plugin-host-coverage-proto-31.13.0.jar:fa86719a3dc5de465f7e0c023184414c27f8fd53a34fd557289c0bf6df340244',
|
||||||
'com.google.guava:guava:31.0.1-jre:guava-31.0.1-jre.jar:d5be94d65e87bd219fb3193ad1517baa55a3b88fc91d21cf735826ab5af087b9',
|
'com.android.tools.utp:android-test-plugin-host-coverage:31.13.0:android-test-plugin-host-coverage-31.13.0.jar:6ef641e612a91dcf5c11eeec7e183ae616bccf18db968f8593c32c215ba45e6b',
|
||||||
'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99',
|
'com.android.tools.utp:android-test-plugin-host-device-info-proto:31.13.0:android-test-plugin-host-device-info-proto-31.13.0.jar:9683ac7648a7a41be9a1349f6981592944f627164898c3c8925a0beede8bb8bb',
|
||||||
'com.google.j2objc:j2objc-annotations:1.3:j2objc-annotations-1.3.jar:21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b',
|
'com.android.tools.utp:android-test-plugin-host-device-info:31.13.0:android-test-plugin-host-device-info-31.13.0.jar:bbf196a617d5f501f2696bfeabbee4b687b4e809d8d56d9c74610094f8a007cb',
|
||||||
'com.squareup:javapoet:1.13.0:javapoet-1.13.0.jar:4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291',
|
'com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.13.0:android-test-plugin-host-emulator-control-proto-31.13.0.jar:a4f34aae0f9ffa026dbf7151436dd7ae53becb72622b40f2c479cac8943d9319',
|
||||||
'com.squareup:kotlinpoet:1.11.0:kotlinpoet-1.11.0.jar:2887ada1ca03dd83baa2758640d87e840d1907564db0ef88d2289c868a980492',
|
'com.android.tools.utp:android-test-plugin-host-emulator-control:31.13.0:android-test-plugin-host-emulator-control-31.13.0.jar:43f5a73b559758c1d3a119277a109ea552a3e4f75368842fb79af7308ad22465',
|
||||||
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
|
'com.android.tools.utp:android-test-plugin-host-logcat-proto:31.13.0:android-test-plugin-host-logcat-proto-31.13.0.jar:c1f6ebbacdad559b6efe4eaa29561552b33156395f069cd9703fda09c462dea6',
|
||||||
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
'com.android.tools.utp:android-test-plugin-host-logcat:31.13.0:android-test-plugin-host-logcat-31.13.0.jar:be7ccad0a7b8d062782b769030e17d573e96d302196b2f9985ec51cb42b6b76b',
|
||||||
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
|
'com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.13.0:android-test-plugin-result-listener-gradle-proto-31.13.0.jar:d429b9312dffa0503381d1ee1b18a999bd901e7456612b2fb48c6a5d5a2caf88',
|
||||||
'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11',
|
'com.android.tools.utp:android-test-plugin-result-listener-gradle:31.13.0:android-test-plugin-result-listener-gradle-31.13.0.jar:a1b95cbed5fd4b8c6a44e7db4642f1acc87f5bff956350e8ae644b505029c120',
|
||||||
'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
|
'com.android.tools.utp:utp-common:31.13.0:utp-common-31.13.0.jar:cde678a64b13041cdd2cc9dad1685990a1d090fb04ff5da2261ff75a83598106',
|
||||||
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
'com.android.tools:annotations:31.13.0:annotations-31.13.0.jar:3b4bb9620c17d19e5bd91ac1988080553573b4c3b739fdd92416f42f2daf3e78',
|
||||||
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
|
'com.android.tools:common:31.13.0:common-31.13.0.jar:b4b6f4ba94843c86e1365f294d9085b5f4f14f63fccd0f0e10da7fdbfa4c3d04',
|
||||||
'org.briarproject:dont-kill-me-lib:0.2.7:dont-kill-me-lib-0.2.7.aar:8a9540941fd927e1c127096a7a9b4aa61ce2f2965d2e24f849be92f9e57213c4',
|
'com.google.android:annotations:4.1.1.4:annotations-4.1.1.4.jar:ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15',
|
||||||
'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
|
'com.google.api.grpc:proto-google-common-protos:2.17.0:proto-google-common-protos-2.17.0.jar:4ef1fe0c327fc1521d1d753b0b1c4a875a54bd14ebded3afff0ca395320b6ea9',
|
||||||
'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
|
'com.google.api.grpc:proto-google-common-protos:2.48.0:proto-google-common-protos-2.48.0.jar:43ec7807459aaa4012e838a1be4ef2d590cf233305da60af5b54f08ec8cf2302',
|
||||||
'org.briarproject:obfs4proxy-android:0.0.14-tor2:obfs4proxy-android-0.0.14-tor2.jar:a0a93770d6760ce57d9dbd31cc7177687374e00c3361dac22ab75e3b6e0f289e',
|
'com.google.auto.service:auto-service-annotations:1.1.1:auto-service-annotations-1.1.1.jar:16a76dd00a2650568447f5d6e3a9e2c809d9a42367d56b45215cfb89731f4d24',
|
||||||
'org.briarproject:onionwrapper-android:0.0.4:onionwrapper-android-0.0.4.aar:d761854dac454616b3e0ca099b2cd17060365ce4316afe495cc7ae86b6c81d15',
|
'com.google.auto.service:auto-service:1.1.1:auto-service-1.1.1.jar:1f48f451503e623daba7d9ed368cca0f81e1e3815653a4560113e12c0129ebd5',
|
||||||
'org.briarproject:onionwrapper-core:0.0.4:onionwrapper-core-0.0.4.jar:28a01a62e96aa763989a8afc325abd3bee54f8021269f91aa48b247a6e717870',
|
'com.google.auto:auto-common:1.2.1:auto-common-1.2.1.jar:f43f29fe2a6ebaf04b2598cdeec32a4e346d49a9404e990f5fc19c19f3a28d0e',
|
||||||
'org.briarproject:snowflake-android:2.5.1:snowflake-android-2.5.1.jar:88ec81c17b1b6fa884d06839dec0330e328b45c89f88c970a213ce91ca8eac87',
|
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
|
||||||
'org.briarproject:tor-android:0.4.7.13-2:tor-android-0.4.7.13-2.jar:453fd463b234a2104edd7f0d02d0649cbb5c5efbe47a76df3828f55a3f90f8b5',
|
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
||||||
'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
|
'com.google.code.gson:gson:2.10.1:gson-2.10.1.jar:4241c14a7727c34feea6507ec801318a3d4a90f070e4525681079fb94ee4c593',
|
||||||
'org.checkerframework:checker-qual:3.12.0:checker-qual-3.12.0.jar:ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb',
|
'com.google.code.gson:gson:2.11.0:gson-2.11.0.jar:57928d6e5a6edeb2abd3770a8f95ba44dce45f3b23b7a9dc2b309c581552a78b',
|
||||||
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
|
'com.google.code.gson:gson:2.8.9:gson-2.8.9.jar:d3999291855de495c94c743761b8ab5176cfeabe281a5ab0d8e8d45326fd703e',
|
||||||
'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
|
'com.google.crypto.tink:tink:1.7.0:tink-1.7.0.jar:88970a456a08ba4c66b01b23e5846ca1095cc14e54cb48363e5d2e15a1307308',
|
||||||
'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
|
'com.google.dagger:dagger-compiler:2.51.1:dagger-compiler-2.51.1.jar:14cf2def1c4c8cd3b977840e297b463191d537cd1c8330992ca5c0b341a641ad',
|
||||||
'org.jacoco:org.jacoco.agent:0.8.7:org.jacoco.agent-0.8.7.jar:9cbcc986e0fbe821a78ff1f8f7d5216f200e5eb124e7f6837d1dc4a77b28b143',
|
'com.google.dagger:dagger-spi:2.51.1:dagger-spi-2.51.1.jar:deb52030b92b27c5dcd76b2c0747f1cf105b60939f6073b43eb06cfe7c9ba601',
|
||||||
'org.jacoco:org.jacoco.ant:0.8.7:org.jacoco.ant-0.8.7.jar:97ca96a382c3f23a44d8eb4c4e6c3742a30cb8005774a76ced0fc4806ce49605',
|
'com.google.dagger:dagger:2.48:dagger-2.48.jar:1fa226d2b4a02cc80950fa4d49a4a235cc8eced499b581fc358a55446a83f579',
|
||||||
'org.jacoco:org.jacoco.core:0.8.7:org.jacoco.core-0.8.7.jar:ad7739b5fb5969aa1a8aead3d74ed54dc82ed012f1f10f336bd1b96e71c1a13c',
|
'com.google.dagger:dagger:2.51.1:dagger-2.51.1.jar:c3891a4c4a4e48682888ca321eaf8497004b286e1d9a2936867373219f7dd86d',
|
||||||
'org.jacoco:org.jacoco.report:0.8.7:org.jacoco.report-0.8.7.jar:cc89258623700a6c932592153cb528785876b6da183d5431f97efbba6f020e5b',
|
'com.google.devtools.ksp:symbol-processing-api:1.9.20-1.0.14:symbol-processing-api-1.9.20-1.0.14.jar:d0339396f40dc9eb3b3f7bc86257f93869ee23448fa31ec4a1de900c6b7ae6d7',
|
||||||
'org.jetbrains.kotlin:kotlin-reflect:1.6.10:kotlin-reflect-1.6.10.jar:3277ac102ae17aad10a55abec75ff5696c8d109790396434b496e75087854203',
|
'com.google.errorprone:error_prone_annotations:2.23.0:error_prone_annotations-2.23.0.jar:ec6f39f068b6ff9ac323c68e28b9299f8c0a80ca512dccb1d4a70f40ac3ec054',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.7.0:kotlin-stdlib-common-1.7.0.jar:59c6ff64fe9a6604afce03e8aaa75f83586c6030ac71fb0b34ee7cdefed3618f',
|
'com.google.errorprone:error_prone_annotations:2.28.0:error_prone_annotations-2.28.0.jar:f3fc8a3a0a4020706a373b00e7f57c2512dd26d1f83d28c7d38768f8682b231e',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0:kotlin-stdlib-common-1.8.0.jar:78ef93b59e603cc0fe51def9bd4c037b07cbace3b3b7806d1a490a42bc1f4cb2',
|
'com.google.errorprone:error_prone_annotations:2.30.0:error_prone_annotations-2.30.0.jar:144f3aefbd6e27daec55d3753b2c6b13c1afdaf0cf04816cdb564588ed92f1bd',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0:kotlin-stdlib-jdk7-1.7.0.jar:07e91be9b2ca20672d2bdb7e181b766e73453a2da13492b5ddaee8fa47aea239',
|
'com.google.errorprone:javac-shaded:9-dev-r4023-3:javac-shaded-9-dev-r4023-3.jar:65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0:kotlin-stdlib-jdk7-1.8.0.jar:4c889d1d9803f5f2eb6c1592a6b7e62369ac7660c9eee15aba16fec059163666',
|
'com.google.googlejavaformat:google-java-format:1.5:google-java-format-1.5.jar:aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0:kotlin-stdlib-jdk8-1.7.0.jar:cf058e11db1dfc9944680c8c61b95ac689aaaa8a3eb30bced028100f038f030b',
|
'com.google.guava:failureaccess:1.0.1:failureaccess-1.0.1.jar:a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib:1.7.0:kotlin-stdlib-1.7.0.jar:aa88e9625577957f3249a46cb6e166ee09b369e600f7a11d148d16b0a6d87f05',
|
'com.google.guava:failureaccess:1.0.2:failureaccess-1.0.2.jar:8a8f81cf9b359e3f6dfa691a1e776985c061ef2f223c9b2c80753e1b458e8064',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib:1.8.0:kotlin-stdlib-1.8.0.jar:c77bef8774640b9fb9d6e217459ff220dae59878beb7d2e4b430506feffc654e',
|
'com.google.guava:guava:32.0.1-jre:guava-32.0.1-jre.jar:bd7fa227591fb8509677d0d1122cf95158f3b8a9f45653f58281d879f6dc48c5',
|
||||||
'org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0:kotlinx-metadata-jvm-0.5.0.jar:ca063a96639b08b9eaa0de4d65e899480740a6efbe28ab9a8681a2ced03055a4',
|
'com.google.guava:guava:33.0.0-jre:guava-33.0.0-jre.jar:f4d85c3e4d411694337cb873abea09b242b664bb013320be6105327c45991537',
|
||||||
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
|
'com.google.guava:guava:33.3.1-jre:guava-33.3.1-jre.jar:4bf0e2c5af8e4525c96e8fde17a4f7307f97f8478f11c4c8e35a0e3298ae4e90',
|
||||||
'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09',
|
'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99',
|
||||||
'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b',
|
'com.google.j2objc:j2objc-annotations:2.8:j2objc-annotations-2.8.jar:f02a95fa1a5e95edb3ed859fd0fb7df709d121a35290eff8b74dce2ab7f4d6ed',
|
||||||
'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd',
|
'com.google.j2objc:j2objc-annotations:3.0.0:j2objc-annotations-3.0.0.jar:88241573467ddca44ffd4d74aa04c2bbfd11bf7c17e0c342c94c9de7a70a7c64',
|
||||||
'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04',
|
'com.google.protobuf:protobuf-java-util:3.22.3:protobuf-java-util-3.22.3.jar:c615f76879dc5c303e4df5b94a6afa39534058c7545db2d483fd95d9f63c8bfe',
|
||||||
'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be',
|
'com.google.protobuf:protobuf-java-util:3.24.4:protobuf-java-util-3.24.4.jar:133c929e2cfe3990a105d18eaccc49122b2d2fb492b420ef02d5d9f937eaebb8',
|
||||||
'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984',
|
'com.google.protobuf:protobuf-java:3.24.4:protobuf-java-3.24.4.jar:e5655522be1aa5cc1f2f092aa036b0445157f294928eedf1332ac938c7b69686',
|
||||||
'org.ow2.asm:asm-analysis:9.1:asm-analysis-9.1.jar:81a88041b1b8beda5a8a99646098046c48709538270c49def68abff25ac3be34',
|
'com.google.protobuf:protobuf-java:3.25.5:protobuf-java-3.25.5.jar:8540247fad9e06baefa8fb45eb313802d019f485f14300e0f9d6b556ed88e753',
|
||||||
'org.ow2.asm:asm-commons:9.1:asm-commons-9.1.jar:afcb26dc1fc12c0c4a99ada670908dd82e18dfc488caf5ee92546996b470c00c',
|
'com.google.protobuf:protobuf-kotlin:3.24.4:protobuf-kotlin-3.24.4.jar:508ca13d97b50f5404eaa37eb4493cb07884162eb7971bf924d8f803d4c21bb4',
|
||||||
'org.ow2.asm:asm-tree:9.1:asm-tree-9.1.jar:fd00afa49e9595d7646205b09cecb4a776a8ff0ba06f2d59b8f7bf9c704b4a73',
|
'com.google.testing.platform:android-device-provider-local:0.0.9-alpha03:android-device-provider-local-0.0.9-alpha03.jar:667a4d35bbba87d3c86f5180dfa521fdbd7a4ef5c60d949154b0301f3e232e1b',
|
||||||
'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
|
'com.google.testing.platform:android-driver-instrumentation:0.0.9-alpha03:android-driver-instrumentation-0.0.9-alpha03.jar:507c632ec7db77bcb299b5519d59b14cc6243aac541767c632fdbeddc6226b07',
|
||||||
'org.ow2.asm:asm:9.1:asm-9.1.jar:cda4de455fab48ff0bcb7c48b4639447d4de859a7afc30a094a986f0936beba2',
|
'com.google.testing.platform:android-test-plugin:0.0.9-alpha03:android-test-plugin-0.0.9-alpha03.jar:d6cb7e126f433037190bcd3c3b904b19ba842d46b17b0fd27c38cc4ccecbec90',
|
||||||
]
|
'com.google.testing.platform:core-proto:0.0.9-alpha03:core-proto-0.0.9-alpha03.jar:d001eb0ccbbfc8cb9eaa193a358e63712974639775647be949ab232c2b29b407',
|
||||||
|
'com.google.testing.platform:core:0.0.9-alpha03:core-0.0.9-alpha03.jar:6e1806d015c416596f53a45a3100e25743c313a6e3fc4f52f24e8b257f2c82ce',
|
||||||
|
'com.google.testing.platform:launcher:0.0.9-alpha03:launcher-0.0.9-alpha03.jar:0012f980a059a0c4c216d0f1d0016867ab31eb8079e3f8f879f1f02b7be3a6e7',
|
||||||
|
'com.squareup:javapoet:1.13.0:javapoet-1.13.0.jar:4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291',
|
||||||
|
'com.squareup:kotlinpoet:1.11.0:kotlinpoet-1.11.0.jar:2887ada1ca03dd83baa2758640d87e840d1907564db0ef88d2289c868a980492',
|
||||||
|
'commons-io:commons-io:2.16.1:commons-io-2.16.1.jar:f41f7baacd716896447ace9758621f62c1c6b0a91d89acee488da26fc477c84f',
|
||||||
|
'io.grpc:grpc-api:1.57.2:grpc-api-1.57.2.jar:42b72e6572c084055ac3ce03e6efe433eb05ef620b3daf5136a4359fc72cc3e1',
|
||||||
|
'io.grpc:grpc-api:1.69.1:grpc-api-1.69.1.jar:a8d3d6dcc71f3ab613d668842282b488bdd93d3e99a0ef5dca7eee6fa734c283',
|
||||||
|
'io.grpc:grpc-context:1.57.2:grpc-context-1.57.2.jar:9b8ac88d9cef2819daffed7bdbd2f22680237d482c6c671fe02d36da3f08cf00',
|
||||||
|
'io.grpc:grpc-context:1.69.1:grpc-context-1.69.1.jar:45ef95b8c158a8b5bdd3acb67b9e682ef25414bb148f488ec847438ab64715d4',
|
||||||
|
'io.grpc:grpc-core:1.57.2:grpc-core-1.57.2.jar:5a10070abfeb4966ec4d580961dcc4e7f69fa83ab25242f92c1765efb07b8606',
|
||||||
|
'io.grpc:grpc-core:1.69.1:grpc-core-1.69.1.jar:51352cadaecbf9a4a4aa42d93f6f1fc728f1fd01b051680383ed09e5631ffbd0',
|
||||||
|
'io.grpc:grpc-inprocess:1.69.1:grpc-inprocess-1.69.1.jar:b7c6ac0e3abf4b8d582610d632d79417bc3da81254e1a4bcf7f01e8db7bd55ef',
|
||||||
|
'io.grpc:grpc-netty:1.57.2:grpc-netty-1.57.2.jar:9809d4c10c94d11e7b2946cdeb5b2884be20a09510289544f37569f02c877a21',
|
||||||
|
'io.grpc:grpc-netty:1.69.1:grpc-netty-1.69.1.jar:52a86ed66f78933e83d1a3fb7162ad1667489564c4556366b7a3579c7024a447',
|
||||||
|
'io.grpc:grpc-protobuf-lite:1.57.2:grpc-protobuf-lite-1.57.2.jar:fc4917dc5d419ac810fb3f27523c14e75e1fe50372154fab29324215ee6a955a',
|
||||||
|
'io.grpc:grpc-protobuf-lite:1.69.1:grpc-protobuf-lite-1.69.1.jar:c29f90fadf3c7620f9359a243c067dd85b73bd765b28f3d95df910ac2d331555',
|
||||||
|
'io.grpc:grpc-protobuf:1.57.2:grpc-protobuf-1.57.2.jar:31630d8a9e9f08a959862015e30a4863908be3680c3a686f4c1f08d2ffeaf706',
|
||||||
|
'io.grpc:grpc-protobuf:1.69.1:grpc-protobuf-1.69.1.jar:4c52ef948fb8987a3baa7d46ba362b7bf307dd3c51f29241cd5c598398a010df',
|
||||||
|
'io.grpc:grpc-services:1.57.2:grpc-services-1.57.2.jar:057a43ba647833756ab2f851bac80a3b9f8dce026fc1ac1f17d4f315648f4172',
|
||||||
|
'io.grpc:grpc-stub:1.57.2:grpc-stub-1.57.2.jar:84d2af12719168f76375f2afdfd6eb5133a865edba9244d40e6b968e3adde1d3',
|
||||||
|
'io.grpc:grpc-stub:1.69.1:grpc-stub-1.69.1.jar:e39c63273d53052ebe9f638d8ae98176735ec567328d9a17092cddb6f239b8c2',
|
||||||
|
'io.grpc:grpc-util:1.69.1:grpc-util-1.69.1.jar:dd597bd675eaa042f3e3578648d9050c813c4595c5de6869ef9ddbb449006031',
|
||||||
|
'io.netty:netty-buffer:4.1.110.Final:netty-buffer-4.1.110.Final.jar:46d74e79125aacc055c31f18152fdc5d4a569aa8d60091203d0baa833973ac3c',
|
||||||
|
'io.netty:netty-buffer:4.1.93.Final:netty-buffer-4.1.93.Final.jar:007c7d9c378df02d390567d0d7ddf542ffddb021b7313dbf502392113ffabb08',
|
||||||
|
'io.netty:netty-codec-http2:4.1.110.Final:netty-codec-http2-4.1.110.Final.jar:b546c75445a487bb7bcd5a94779caecce33582cf7be31b8b39fc0e65b1ee26fc',
|
||||||
|
'io.netty:netty-codec-http2:4.1.93.Final:netty-codec-http2-4.1.93.Final.jar:d96cc09045a1341c6d47494352aa263b87b72fb1d2ea9eca161aa73820bfe8bb',
|
||||||
|
'io.netty:netty-codec-http:4.1.110.Final:netty-codec-http-4.1.110.Final.jar:dc0d6af5054630a70ff0ef354f20aa7a6e46738c9fc5636ed3d4fe77e38bd48d',
|
||||||
|
'io.netty:netty-codec-http:4.1.93.Final:netty-codec-http-4.1.93.Final.jar:dacf78ce78ab2d29570325db4cd2451ea589639807de95881a0fa7155a9e6b55',
|
||||||
|
'io.netty:netty-codec-socks:4.1.110.Final:netty-codec-socks-4.1.110.Final.jar:976052a3c9bb280bc6d99f3a29e6404677cf958c3de05b205093d38c006b880c',
|
||||||
|
'io.netty:netty-codec-socks:4.1.93.Final:netty-codec-socks-4.1.93.Final.jar:0ea47b5ba23ca1da8eb9146c8fc755c1271414633b1e2be2ce1df764ba0fff2a',
|
||||||
|
'io.netty:netty-codec:4.1.110.Final:netty-codec-4.1.110.Final.jar:9eccce9a8d827bb8ce84f9c3183fec58bd1c96a51010cf711297746034af3701',
|
||||||
|
'io.netty:netty-codec:4.1.93.Final:netty-codec-4.1.93.Final.jar:990c378168dc6364c6ff569701f4f2f122fffe8998b3e189eba4c4d868ed1084',
|
||||||
|
'io.netty:netty-common:4.1.110.Final:netty-common-4.1.110.Final.jar:9851ec66548b9e0d41164ce98943cdd4bbe305f68ddbd24eae52e4501a0d7b1a',
|
||||||
|
'io.netty:netty-common:4.1.93.Final:netty-common-4.1.93.Final.jar:443bb316599fb16e3baeba2fb58881814d7ff0b7af176fe76e38071a6e86f8c0',
|
||||||
|
'io.netty:netty-handler-proxy:4.1.110.Final:netty-handler-proxy-4.1.110.Final.jar:ad54ab4fe9c47ef3e723d71251126db53e8db543871adb9eafc94446539eff52',
|
||||||
|
'io.netty:netty-handler-proxy:4.1.93.Final:netty-handler-proxy-4.1.93.Final.jar:2ac5f7fbefa0b73ef783889069344d5515505a14b2303be693c5002c486df2b4',
|
||||||
|
'io.netty:netty-handler:4.1.110.Final:netty-handler-4.1.110.Final.jar:d5a08d7de364912e4285968de4d4cce3f01da4bb048d5c6937e5f2af1f8e148a',
|
||||||
|
'io.netty:netty-handler:4.1.93.Final:netty-handler-4.1.93.Final.jar:4e5f563ae14ed713381816d582f5fcfd0615aefb29203486cdfb782d8a00a02b',
|
||||||
|
'io.netty:netty-resolver:4.1.110.Final:netty-resolver-4.1.110.Final.jar:a2e9b4ae7caa92fc5bd747e11d1dec20d81b18fc00959554302244ac5c56ce70',
|
||||||
|
'io.netty:netty-resolver:4.1.93.Final:netty-resolver-4.1.93.Final.jar:e59770b66e81822e5d111ac4e544d7eb0c543e0a285f52628e53941acd8ed759',
|
||||||
|
'io.netty:netty-transport-native-unix-common:4.1.110.Final:netty-transport-native-unix-common-4.1.110.Final.jar:51717bb7471141950390c6713a449fdb1054d07e60737ee7dda7083796cdee48',
|
||||||
|
'io.netty:netty-transport-native-unix-common:4.1.93.Final:netty-transport-native-unix-common-4.1.93.Final.jar:774165a1c4dbaacb17f9c1ad666b3569a6a59715ae828e7c3d47703f479a53e7',
|
||||||
|
'io.netty:netty-transport:4.1.110.Final:netty-transport-4.1.110.Final.jar:a42dd68390ca14b4ff2d40628a096c76485b4adb7c19602d5289321a0669e704',
|
||||||
|
'io.netty:netty-transport:4.1.93.Final:netty-transport-4.1.93.Final.jar:a5a78019bc1cd43dbc3c7b7cdd3801912ca26d1f498fb560514fee497864ba96',
|
||||||
|
'io.opencensus:opencensus-api:0.31.0:opencensus-api-0.31.0.jar:702ba55d78f39d55195dcf041fdfaab7a7490a9ac45013542487ed9e4d3a4d23',
|
||||||
|
'io.opencensus:opencensus-proto:0.2.0:opencensus-proto-0.2.0.jar:0c192d451e9dd74e98721b27d02f0e2b6bca44b51563b5dabf2e211f7a3ebf13',
|
||||||
|
'io.perfmark:perfmark-api:0.26.0:perfmark-api-0.26.0.jar:b7d23e93a34537ce332708269a0d1404788a5b5e1949e82f5535fce51b3ea95b',
|
||||||
|
'io.perfmark:perfmark-api:0.27.0:perfmark-api-0.27.0.jar:c7b478503ec524e55df19b424d46d27c8a68aeb801664fadd4f069b71f52d0f6',
|
||||||
|
'javax.annotation:javax.annotation-api:1.3.2:javax.annotation-api-1.3.2.jar:e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b',
|
||||||
|
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
|
||||||
|
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
||||||
|
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
|
||||||
|
'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11',
|
||||||
|
'net.java.dev.jna:jna-platform:5.6.0:jna-platform-5.6.0.jar:9ecea8bf2b1b39963939d18b70464eef60c508fed8820f9dcaba0c35518eabf7',
|
||||||
|
'net.java.dev.jna:jna:5.6.0:jna-5.6.0.jar:5557e235a8aa2f9766d5dc609d67948f2a8832c2d796cea9ef1d6cbe0b3b7eaf',
|
||||||
|
'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
|
||||||
|
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
||||||
|
'net.sf.kxml:kxml2:2.3.0:kxml2-2.3.0.jar:f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2',
|
||||||
|
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
|
||||||
|
'org.briarproject:dont-kill-me-lib:0.2.8:dont-kill-me-lib-0.2.8.aar:e21173e480ee3f2364c142cc14db8dc6447be91bde9e62e4985c485ea0af9126',
|
||||||
|
'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
|
||||||
|
'org.briarproject:lyrebird-android:0.6.2:lyrebird-android-0.6.2.jar:2d70a38393ee6f1760a65a33dd971210efa06b5a355ebea829196b61fd9fd11a',
|
||||||
|
'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
|
||||||
|
'org.briarproject:onionwrapper-android:0.1.4:onionwrapper-android-0.1.4.aar:15231f0b2ad44df8eb1dd362a989ba3f88ebdc9b02a9128daa72a8da83651bf0',
|
||||||
|
'org.briarproject:onionwrapper-core:0.1.4:onionwrapper-core-0.1.4.jar:d0a48de7198d48eb0182a25d109bc06811484d1da799c6dfa5e2581285880a49',
|
||||||
|
'org.briarproject:tor-android:0.4.8.19:tor-android-0.4.8.19.jar:14b52a8b798ba7bd91ce508da39a380de65db5ec79aacec79b05b221d42a116c',
|
||||||
|
'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
|
||||||
|
'org.checkerframework:checker-qual:3.33.0:checker-qual-3.33.0.jar:e316255bbfcd9fe50d165314b85abb2b33cb2a66a93c491db648e498a82c2de1',
|
||||||
|
'org.checkerframework:checker-qual:3.41.0:checker-qual-3.41.0.jar:2f9f245bf68e4259d610894f2406dc1f6363dc639302bd566e8272e4f4541172',
|
||||||
|
'org.checkerframework:checker-qual:3.43.0:checker-qual-3.43.0.jar:3fbc2e98f05854c3df16df9abaa955b91b15b3ecac33623208ed6424640ef0f6',
|
||||||
|
'org.codehaus.mojo:animal-sniffer-annotations:1.23:animal-sniffer-annotations-1.23.jar:9ffe526bf43a6348e9d8b33b9cd6f580a7f5eed0cf055913007eda263de974d0',
|
||||||
|
'org.codehaus.mojo:animal-sniffer-annotations:1.24:animal-sniffer-annotations-1.24.jar:c720e6e5bcbe6b2f48ded75a47bccdb763eede79d14330102e0d352e3d89ed92',
|
||||||
|
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
|
||||||
|
'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
|
||||||
|
'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
|
||||||
|
'org.jetbrains.kotlin:kotlin-reflect:1.6.10:kotlin-reflect-1.6.10.jar:3277ac102ae17aad10a55abec75ff5696c8d109790396434b496e75087854203',
|
||||||
|
'org.jetbrains.kotlin:kotlin-reflect:1.8.21:kotlin-reflect-1.8.21.jar:8a6cd5a3cf092acee274ce2c444dc36eefdb631579859dd4d857b3309a529c91',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21:kotlin-stdlib-common-1.8.21.jar:6a44c9ecc9d7754d9e943fb1e3588c74d4a3f1785be51074f49d6c5723682a73',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0:kotlin-stdlib-common-1.9.0.jar:283274204bd7c020789ec46f8f8e72af4244d7f550b3392a57e5ca006ad7aa2c',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib-common:1.9.10:kotlin-stdlib-common-1.9.10.jar:cde3341ba18a2ba262b0b7cf6c55b20c90e8d434e42c9a13e6a3f770db965a88',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20:kotlin-stdlib-jdk7-1.8.20.jar:af1ec40c3b951afdcc0c2a0173c7b81763c5281c2d5bafbf0a8544a24c5dcc0c',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0:kotlin-stdlib-jdk7-1.9.0.jar:b7979a7aac94055f0d9f1fd3b47ce5ffe1cb6032a842ba9fbe7186f085289178',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10:kotlin-stdlib-jdk7-1.9.10.jar:ac6361bf9ad1ed382c2103d9712c47cdec166232b4903ed596e8876b0681c9b7',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.0:kotlin-stdlib-jdk7-2.2.0.jar:0d10bc0d42b8605f23629a3f31ea27c19cdbca9dcdf4f53f6d22cd6366836d18',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20:kotlin-stdlib-jdk8-1.8.20.jar:e398b67977622718bf18ff99b739c7d9da060f33fb458a2e25203221c16af010',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0:kotlin-stdlib-jdk8-1.9.0.jar:a59fa24fdf1ffb594baecdbf0fd10010f977cea10236d487fe3464977a7377fa',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0:kotlin-stdlib-jdk8-2.2.0.jar:adc16648dbbcf35b0d10e7ec301c35d746d1c2fe460c606aba59f12b117cf9b0',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib:1.8.21:kotlin-stdlib-1.8.21.jar:042a1cd1ac976cdcfe5eb63f1d8e0b0b892c9248e15a69c8cfba495d546ea52a',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib:1.9.0:kotlin-stdlib-1.9.0.jar:35aeffbe2db5aa446072cee50fcee48b7fa9e2fc51ca37c0cc7d7d0bc39d952e',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib:1.9.10:kotlin-stdlib-1.9.10.jar:55e989c512b80907799f854309f3bc7782c5b3d13932442d0379d5c472711504',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib:1.9.20:kotlin-stdlib-1.9.20.jar:28a35bcdff46d864f80f346a617e486284b208d17378c41900dfb1de95a90e6c',
|
||||||
|
'org.jetbrains.kotlin:kotlin-stdlib:2.2.0:kotlin-stdlib-2.2.0.jar:65d12d85a3b865c160db9147851712a64b10dadd68b22eea22a95bf8a8670dca',
|
||||||
|
'org.jetbrains.kotlinx:atomicfu-jvm:0.22.0:atomicfu-jvm-0.22.0.jar:2da073727f3ab5e5584e74c12e11519c908ae2dfaf6aeb25ded42b6682297882',
|
||||||
|
'org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3:kotlinx-coroutines-core-jvm-1.7.3.jar:1ab3acc38f3e7355c4f9d1ec62107a46fa73c899f3070d055e5d4373dfe67e12',
|
||||||
|
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
|
||||||
|
'org.jetbrains:annotations:23.0.0:annotations-23.0.0.jar:7b0f19724082cbfcbc66e5abea2b9bc92cf08a1ea11e191933ed43801eb3cd05',
|
||||||
|
'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09',
|
||||||
|
'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b',
|
||||||
|
'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd',
|
||||||
|
'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04',
|
||||||
|
'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be',
|
||||||
|
'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984',
|
||||||
|
'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ configurations {
|
|||||||
}
|
}
|
||||||
task jarTest(type: Jar, dependsOn: testClasses) {
|
task jarTest(type: Jar, dependsOn: testClasses) {
|
||||||
from sourceSets.test.output, sourceSets.main.output
|
from sourceSets.test.output, sourceSets.main.output
|
||||||
classifier = 'test'
|
archiveClassifier = 'test'
|
||||||
}
|
}
|
||||||
artifacts {
|
artifacts {
|
||||||
testOutput jarTest
|
testOutput jarTest
|
||||||
}
|
}
|
||||||
@@ -31,6 +31,12 @@ public abstract class BdfMessageValidator implements MessageValidator {
|
|||||||
protected final Clock clock;
|
protected final Clock clock;
|
||||||
protected final boolean canonical;
|
protected final boolean canonical;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transitional alternative to
|
||||||
|
* {@link #BdfMessageValidator(ClientHelper, MetadataEncoder, Clock)} that
|
||||||
|
* accepts messages in non-canonical form, for backward compatibility.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
protected BdfMessageValidator(ClientHelper clientHelper,
|
protected BdfMessageValidator(ClientHelper clientHelper,
|
||||||
MetadataEncoder metadataEncoder, Clock clock, boolean canonical) {
|
MetadataEncoder metadataEncoder, Clock clock, boolean canonical) {
|
||||||
this.clientHelper = clientHelper;
|
this.clientHelper = clientHelper;
|
||||||
|
|||||||
@@ -49,6 +49,15 @@ public interface ClientHelper {
|
|||||||
BdfList getMessageAsList(Transaction txn, MessageId m) throws DbException,
|
BdfList getMessageAsList(Transaction txn, MessageId m) throws DbException,
|
||||||
FormatException;
|
FormatException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transitional alternative to
|
||||||
|
* {@link #getMessageAsList(Transaction, MessageId)} that allows the
|
||||||
|
* message to be in non-canonical form, for backward compatibility.
|
||||||
|
*
|
||||||
|
* @param canonical True if the message must be in canonical form (a
|
||||||
|
* {@link FormatException} will be thrown if it's not.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
BdfList getMessageAsList(Transaction txn, MessageId m, boolean canonical)
|
BdfList getMessageAsList(Transaction txn, MessageId m, boolean canonical)
|
||||||
throws DbException, FormatException;
|
throws DbException, FormatException;
|
||||||
|
|
||||||
@@ -109,6 +118,14 @@ public interface ClientHelper {
|
|||||||
|
|
||||||
BdfList toList(Message m) throws FormatException;
|
BdfList toList(Message m) throws FormatException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transitional alternative to {@link #toList(Message)} that allows the
|
||||||
|
* message to be in non-canonical form, for backward compatibility.
|
||||||
|
*
|
||||||
|
* @param canonical True if the message must be in canonical form (a
|
||||||
|
* {@link FormatException} will be thrown if it's not.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
BdfList toList(Message m, boolean canonical) throws FormatException;
|
BdfList toList(Message m, boolean canonical) throws FormatException;
|
||||||
|
|
||||||
BdfList toList(Author a);
|
BdfList toList(Author a);
|
||||||
|
|||||||
@@ -10,6 +10,27 @@ import java.util.TreeMap;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.annotation.concurrent.NotThreadSafe;
|
import javax.annotation.concurrent.NotThreadSafe;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A BDF dictionary contains zero or more key-value pairs, where the keys
|
||||||
|
* are strings and the values are BDF objects, which may be primitive types
|
||||||
|
* (null, boolean, integer, float, string, raw) or nested containers (list,
|
||||||
|
* dictionary).
|
||||||
|
* <p>
|
||||||
|
* Note that a BDF integer has the same range as a Java long, while a BDF
|
||||||
|
* float has the same range as a Java double. Method names in this class
|
||||||
|
* correspond to the Java types.
|
||||||
|
* <p>
|
||||||
|
* The getX() methods throw {@link FormatException} if the specified key is
|
||||||
|
* absent, the value is null, or the value does not have the requested type.
|
||||||
|
* <p>
|
||||||
|
* The getOptionalX() methods return null if the specified key is absent or
|
||||||
|
* the value is null, or throw {@link FormatException} if the value does not
|
||||||
|
* have the requested type.
|
||||||
|
* <p>
|
||||||
|
* The getX() methods that take a default value return the default value if
|
||||||
|
* the specified key is absent or the value is null, or throw
|
||||||
|
* {@link FormatException} if the value does not have the requested type.
|
||||||
|
*/
|
||||||
@NotThreadSafe
|
@NotThreadSafe
|
||||||
public final class BdfDictionary extends TreeMap<String, Object> {
|
public final class BdfDictionary extends TreeMap<String, Object> {
|
||||||
|
|
||||||
@@ -80,12 +101,33 @@ public final class BdfDictionary extends TreeMap<String, Object> {
|
|||||||
return value == null ? defaultValue : value;
|
return value == null ? defaultValue : value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer with the specified key.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getLong(key).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if there is no value at the specified key,
|
||||||
|
* or if the value is null or cannot be represented as a Java int.
|
||||||
|
*/
|
||||||
public Integer getInt(String key) throws FormatException {
|
public Integer getInt(String key) throws FormatException {
|
||||||
Integer value = getOptionalInt(key);
|
Integer value = getOptionalInt(key);
|
||||||
if (value == null) throw new FormatException();
|
if (value == null) throw new FormatException();
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer with the specified key, or null if the key is
|
||||||
|
* absent or the value is null.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getOptionalLong(key).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the value at the specified key is not null
|
||||||
|
* and cannot be represented as a Java int.
|
||||||
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public Integer getOptionalInt(String key) throws FormatException {
|
public Integer getOptionalInt(String key) throws FormatException {
|
||||||
Long value = getOptionalLong(key);
|
Long value = getOptionalLong(key);
|
||||||
@@ -96,6 +138,17 @@ public final class BdfDictionary extends TreeMap<String, Object> {
|
|||||||
return value.intValue();
|
return value.intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer with the specified key, or the given default
|
||||||
|
* value if the key is absent or the value is null.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getLong(key, defaultValue).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the value at the specified key is not null
|
||||||
|
* and cannot be represented as a Java int.
|
||||||
|
*/
|
||||||
public Integer getInt(String key, Integer defaultValue)
|
public Integer getInt(String key, Integer defaultValue)
|
||||||
throws FormatException {
|
throws FormatException {
|
||||||
Integer value = getOptionalInt(key);
|
Integer value = getOptionalInt(key);
|
||||||
|
|||||||
@@ -6,6 +6,11 @@ import java.util.Map.Entry;
|
|||||||
|
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A convenience class for building {@link BdfDictionary BdfDictionaries}
|
||||||
|
* via the {@link BdfDictionary#of(Entry[]) factory method}. Entries in
|
||||||
|
* BdfDictionaries do not have to be BdfEntries.
|
||||||
|
*/
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class BdfEntry implements Entry<String, Object>, Comparable<BdfEntry> {
|
public class BdfEntry implements Entry<String, Object>, Comparable<BdfEntry> {
|
||||||
|
|||||||
@@ -12,6 +12,29 @@ import javax.annotation.concurrent.NotThreadSafe;
|
|||||||
|
|
||||||
import static org.briarproject.bramble.api.data.BdfDictionary.NULL_VALUE;
|
import static org.briarproject.bramble.api.data.BdfDictionary.NULL_VALUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A BDF list contains zero or more BDF objects, which may be primitive types
|
||||||
|
* (null, boolean, integer, float, string, raw) or nested containers (list,
|
||||||
|
* dictionary).
|
||||||
|
* <p>
|
||||||
|
* Note that a BDF integer has the same range as a Java long, while a BDF
|
||||||
|
* float has the same range as a Java double. Method names in this class
|
||||||
|
* correspond to the Java types.
|
||||||
|
* <p>
|
||||||
|
* The getX() methods throw {@link FormatException} if the object at the
|
||||||
|
* specified index is null or does not have the requested type.
|
||||||
|
* <p>
|
||||||
|
* The getOptionalX() methods return null if the object at the specified
|
||||||
|
* index is null, or throw {@link FormatException} if the object does not
|
||||||
|
* have the requested type.
|
||||||
|
* <p>
|
||||||
|
* The getX() methods that take a default value return the default value if
|
||||||
|
* the object at the specified index is null, or throw
|
||||||
|
* {@link FormatException} if the object does not have the requested type.
|
||||||
|
* <p>
|
||||||
|
* All of the getters throw {@link FormatException} if the specified index is
|
||||||
|
* out of range.
|
||||||
|
*/
|
||||||
@NotThreadSafe
|
@NotThreadSafe
|
||||||
public final class BdfList extends ArrayList<Object> {
|
public final class BdfList extends ArrayList<Object> {
|
||||||
|
|
||||||
@@ -82,12 +105,34 @@ public final class BdfList extends ArrayList<Object> {
|
|||||||
return value == null ? defaultValue : value;
|
return value == null ? defaultValue : value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer at the specified index.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getLong(index).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the index is out of range, or if the
|
||||||
|
* value at the specified index is null or cannot be represented as a
|
||||||
|
* Java int.
|
||||||
|
*/
|
||||||
public Integer getInt(int index) throws FormatException {
|
public Integer getInt(int index) throws FormatException {
|
||||||
Integer value = getOptionalInt(index);
|
Integer value = getOptionalInt(index);
|
||||||
if (value == null) throw new FormatException();
|
if (value == null) throw new FormatException();
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer at the specified index, or null if the object at
|
||||||
|
* the specified index is null.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getOptionalLong(index).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the index is out of range, or if the value
|
||||||
|
* at the specified index cannot be represented as a Java int.
|
||||||
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public Integer getOptionalInt(int index) throws FormatException {
|
public Integer getOptionalInt(int index) throws FormatException {
|
||||||
Long value = getOptionalLong(index);
|
Long value = getOptionalLong(index);
|
||||||
@@ -98,6 +143,17 @@ public final class BdfList extends ArrayList<Object> {
|
|||||||
return value.intValue();
|
return value.intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the integer at the specified index, or the given default value
|
||||||
|
* if the object at the specified index is null.
|
||||||
|
* <p>
|
||||||
|
* This method should be used in preference to
|
||||||
|
* <code>getLong(index, defaultValue).intValue()</code> as it checks for
|
||||||
|
* overflow/underflow.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the index is out of range, or if the value
|
||||||
|
* at the specified index cannot be represented as a Java int.
|
||||||
|
*/
|
||||||
public Integer getInt(int index, Integer defaultValue)
|
public Integer getInt(int index, Integer defaultValue)
|
||||||
throws FormatException {
|
throws FormatException {
|
||||||
Integer value = getOptionalInt(index);
|
Integer value = getOptionalInt(index);
|
||||||
|
|||||||
@@ -1,70 +1,178 @@
|
|||||||
package org.briarproject.bramble.api.data;
|
package org.briarproject.bramble.api.data;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.FormatException;
|
||||||
import org.briarproject.nullsafety.NotNullByDefault;
|
import org.briarproject.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An interface for reading BDF objects from an input stream.
|
||||||
|
* <p>
|
||||||
|
* The readX() methods throw {@link FormatException} if the data is not in
|
||||||
|
* canonical form, but the hasX() and skipX() methods do not check for
|
||||||
|
* canonical form.
|
||||||
|
*/
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public interface BdfReader {
|
public interface BdfReader {
|
||||||
|
|
||||||
int DEFAULT_NESTED_LIMIT = 5;
|
int DEFAULT_NESTED_LIMIT = 5;
|
||||||
int DEFAULT_MAX_BUFFER_SIZE = 64 * 1024;
|
int DEFAULT_MAX_BUFFER_SIZE = 64 * 1024;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the reader has reached the end of its input stream.
|
||||||
|
*/
|
||||||
boolean eof() throws IOException;
|
boolean eof() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the reader's input stream.
|
||||||
|
*/
|
||||||
void close() throws IOException;
|
void close() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF null.
|
||||||
|
*/
|
||||||
boolean hasNull() throws IOException;
|
boolean hasNull() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF null from the input.
|
||||||
|
*/
|
||||||
void readNull() throws IOException;
|
void readNull() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF null.
|
||||||
|
*/
|
||||||
void skipNull() throws IOException;
|
void skipNull() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF boolean.
|
||||||
|
*/
|
||||||
boolean hasBoolean() throws IOException;
|
boolean hasBoolean() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF boolean from the input and returns it.
|
||||||
|
*/
|
||||||
boolean readBoolean() throws IOException;
|
boolean readBoolean() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF boolean.
|
||||||
|
*/
|
||||||
void skipBoolean() throws IOException;
|
void skipBoolean() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF integer, which
|
||||||
|
* has the same range as a Java long.
|
||||||
|
*/
|
||||||
boolean hasLong() throws IOException;
|
boolean hasLong() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF integer from the input and returns it as a Java long.
|
||||||
|
*/
|
||||||
long readLong() throws IOException;
|
long readLong() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF integer.
|
||||||
|
*/
|
||||||
void skipLong() throws IOException;
|
void skipLong() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF integer and the
|
||||||
|
* value would fit within the range of a Java int.
|
||||||
|
*/
|
||||||
boolean hasInt() throws IOException;
|
boolean hasInt() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF integer from the input and returns it as a Java int.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the value exceeds the range of a Java int.
|
||||||
|
*/
|
||||||
int readInt() throws IOException;
|
int readInt() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF integer.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the value exceeds the range of a Java int.
|
||||||
|
*/
|
||||||
void skipInt() throws IOException;
|
void skipInt() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF float, which has
|
||||||
|
* the same range as a Java double.
|
||||||
|
*/
|
||||||
boolean hasDouble() throws IOException;
|
boolean hasDouble() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF float from the input and returns it as a Java double.
|
||||||
|
*/
|
||||||
double readDouble() throws IOException;
|
double readDouble() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF float.
|
||||||
|
*/
|
||||||
void skipDouble() throws IOException;
|
void skipDouble() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF string.
|
||||||
|
*/
|
||||||
boolean hasString() throws IOException;
|
boolean hasString() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF string from the input.
|
||||||
|
*
|
||||||
|
* @throws IOException If the string is not valid UTF-8.
|
||||||
|
*/
|
||||||
String readString() throws IOException;
|
String readString() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF string without checking whether it is valid UTF-8.
|
||||||
|
*/
|
||||||
void skipString() throws IOException;
|
void skipString() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF raw.
|
||||||
|
*/
|
||||||
boolean hasRaw() throws IOException;
|
boolean hasRaw() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF raw from the input and returns it as a byte array.
|
||||||
|
*/
|
||||||
byte[] readRaw() throws IOException;
|
byte[] readRaw() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF raw.
|
||||||
|
*/
|
||||||
void skipRaw() throws IOException;
|
void skipRaw() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF list.
|
||||||
|
*/
|
||||||
boolean hasList() throws IOException;
|
boolean hasList() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF list from the input and returns it. The list's contents
|
||||||
|
* are parsed and validated.
|
||||||
|
*/
|
||||||
BdfList readList() throws IOException;
|
BdfList readList() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF list. The list's contents are parsed (to determine
|
||||||
|
* their length) but not validated.
|
||||||
|
*/
|
||||||
void skipList() throws IOException;
|
void skipList() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the next object in the input is a BDF dictionary.
|
||||||
|
*/
|
||||||
boolean hasDictionary() throws IOException;
|
boolean hasDictionary() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a BDF dictionary from the input and returns it. The dictionary's
|
||||||
|
* contents are parsed and validated.
|
||||||
|
*/
|
||||||
BdfDictionary readDictionary() throws IOException;
|
BdfDictionary readDictionary() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips over a BDF dictionary. The dictionary's contents are parsed
|
||||||
|
* (to determine their length) but not validated.
|
||||||
|
*/
|
||||||
void skipDictionary() throws IOException;
|
void skipDictionary() throws IOException;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,12 @@ public interface BdfReaderFactory {
|
|||||||
|
|
||||||
BdfReader createReader(InputStream in);
|
BdfReader createReader(InputStream in);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transitional alternative to {@link #createReader(InputStream)} that
|
||||||
|
* can create a reader that accepts non-canonical input, for backward
|
||||||
|
* compatibility.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
BdfReader createReader(InputStream in, boolean canonical);
|
BdfReader createReader(InputStream in, boolean canonical);
|
||||||
|
|
||||||
BdfReader createReader(InputStream in, int nestedLimit,
|
BdfReader createReader(InputStream in, int nestedLimit,
|
||||||
|
|||||||
@@ -1,28 +1,74 @@
|
|||||||
package org.briarproject.bramble.api.data;
|
package org.briarproject.bramble.api.data;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.FormatException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An interface for writing BDF objects to an output stream. The BDF output
|
||||||
|
* is in canonical form, ie integers and length fields are represented using
|
||||||
|
* the minimum number of bytes and dictionary keys are unique and sorted in
|
||||||
|
* lexicographic order.
|
||||||
|
*/
|
||||||
public interface BdfWriter {
|
public interface BdfWriter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flushes the writer's output stream.
|
||||||
|
*/
|
||||||
void flush() throws IOException;
|
void flush() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the writer's output stream.
|
||||||
|
*/
|
||||||
void close() throws IOException;
|
void close() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF null to the output stream.
|
||||||
|
*/
|
||||||
void writeNull() throws IOException;
|
void writeNull() throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF boolean to the output stream.
|
||||||
|
*/
|
||||||
void writeBoolean(boolean b) throws IOException;
|
void writeBoolean(boolean b) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF integer (which has the same range as a Java long) to the
|
||||||
|
* output stream.
|
||||||
|
*/
|
||||||
void writeLong(long l) throws IOException;
|
void writeLong(long l) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF float (which has the same range as a Java double) to the
|
||||||
|
* output stream.
|
||||||
|
*/
|
||||||
void writeDouble(double d) throws IOException;
|
void writeDouble(double d) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF string (which uses UTF-8 encoding) to the output stream.
|
||||||
|
*/
|
||||||
void writeString(String s) throws IOException;
|
void writeString(String s) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF raw to the output stream.
|
||||||
|
*/
|
||||||
void writeRaw(byte[] b) throws IOException;
|
void writeRaw(byte[] b) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF list to the output stream.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the contents of the given collection cannot
|
||||||
|
* be represented as (nested) BDF objects.
|
||||||
|
*/
|
||||||
void writeList(Collection<?> c) throws IOException;
|
void writeList(Collection<?> c) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a BDF dictionary to the output stream.
|
||||||
|
*
|
||||||
|
* @throws FormatException if the contents of the given map cannot be
|
||||||
|
* represented as (nested) BDF objects.
|
||||||
|
*/
|
||||||
void writeDictionary(Map<?, ?> m) throws IOException;
|
void writeDictionary(Map<?, ?> m) throws IOException;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ public interface TorConstants {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Reason flag returned by {@link Plugin#getReasonsDisabled()}.
|
* Reason flag returned by {@link Plugin#getReasonsDisabled()}.
|
||||||
|
* Currently unused, but may be worth keeping for future use.
|
||||||
*/
|
*/
|
||||||
int REASON_COUNTRY_BLOCKED = 8;
|
int REASON_COUNTRY_BLOCKED = 8;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
dependencyVerification {
|
dependencyVerification {
|
||||||
verify = [
|
verify = [
|
||||||
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
|
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
|
||||||
'com.fasterxml.jackson.core:jackson-annotations:2.13.4:jackson-annotations-2.13.4.jar:ac5b27a634942391ca113850ee7db01df1499a240174021263501c05fc653b44',
|
'com.fasterxml.jackson.core:jackson-annotations:2.13.4:jackson-annotations-2.13.4.jar:ac5b27a634942391ca113850ee7db01df1499a240174021263501c05fc653b44',
|
||||||
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
|
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
|
||||||
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
||||||
'com.google.dagger:dagger:2.45:dagger-2.45.jar:f011cae7d2c0fb7ea17c34e05bc10e768b1081a5892ad019cf1fdb0e125c49c1',
|
'com.google.dagger:dagger:2.51.1:dagger-2.51.1.jar:c3891a4c4a4e48682888ca321eaf8497004b286e1d9a2936867373219f7dd86d',
|
||||||
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
||||||
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
|
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
|
||||||
'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11',
|
'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11',
|
||||||
'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
|
'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
|
||||||
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
|
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
|
||||||
'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
|
'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
|
||||||
'org.codehaus.mojo.signature:java16:1.1:java16-1.1.signature:53799223a2c98dba2d0add810bed76315460df285c69e4f397ae6098f87dd619',
|
'org.codehaus.mojo.signature:java16:1.1:java16-1.1.signature:53799223a2c98dba2d0add810bed76315460df285c69e4f397ae6098f87dd619',
|
||||||
'org.codehaus.mojo:animal-sniffer-ant-tasks:1.22:animal-sniffer-ant-tasks-1.22.jar:3f6afeb3e09301d2d7179ed1db21e3ad8846c1e38415ad832a395138ae3f4218',
|
'org.codehaus.mojo:animal-sniffer-annotations:1.24:animal-sniffer-annotations-1.24.jar:c720e6e5bcbe6b2f48ded75a47bccdb763eede79d14330102e0d352e3d89ed92',
|
||||||
'org.codehaus.mojo:animal-sniffer:1.22:animal-sniffer-1.22.jar:f18c11a25bdd8b520b9c6a28cbb6f33007c812ab0051b6be3f0778e660aa501c',
|
'org.codehaus.mojo:animal-sniffer:1.24:animal-sniffer-1.24.jar:65d028de87134f0955e3a964fe438fc3e99e77b237a77e5e165869a8ff59db5f',
|
||||||
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
|
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
|
||||||
'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
|
'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
|
||||||
'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
|
'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
|
||||||
'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09',
|
'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09',
|
||||||
'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b',
|
'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b',
|
||||||
'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd',
|
'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd',
|
||||||
'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04',
|
'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04',
|
||||||
'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be',
|
'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be',
|
||||||
'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984',
|
'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984',
|
||||||
'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
|
'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
|
||||||
'org.ow2.asm:asm:9.3:asm-9.3.jar:1263369b59e29c943918de11d6d6152e2ec6085ce63e5710516f8c67d368e4bc',
|
'org.ow2.asm:asm:9.7:asm-9.7.jar:adf46d5e34940bdf148ecdd26a9ee8eea94496a72034ff7141066b3eea5c4e9d',
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ configurations {
|
|||||||
}
|
}
|
||||||
task jarTest(type: Jar, dependsOn: testClasses) {
|
task jarTest(type: Jar, dependsOn: testClasses) {
|
||||||
from sourceSets.test.output, sourceSets.main.output
|
from sourceSets.test.output, sourceSets.main.output
|
||||||
classifier = 'test'
|
archiveClassifier = 'test'
|
||||||
}
|
}
|
||||||
artifacts {
|
artifacts {
|
||||||
testOutput jarTest
|
testOutput jarTest
|
||||||
}
|
}
|
||||||
@@ -107,6 +107,8 @@ class CryptoComponentImpl implements CryptoComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Based on https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html
|
// Based on https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html
|
||||||
|
// "Applications which run exclusively on Android KitKat (4.4) or above do
|
||||||
|
// not need to take any special action to work around this bug."
|
||||||
private void installSecureRandomProvider(Provider provider) {
|
private void installSecureRandomProvider(Provider provider) {
|
||||||
Provider[] providers = Security.getProviders("SecureRandom.SHA1PRNG");
|
Provider[] providers = Security.getProviders("SecureRandom.SHA1PRNG");
|
||||||
if (providers == null || providers.length == 0
|
if (providers == null || providers.length == 0
|
||||||
|
|||||||
@@ -89,11 +89,17 @@ class H2Database extends JdbcDatabase {
|
|||||||
try {
|
try {
|
||||||
c = createConnection();
|
c = createConnection();
|
||||||
closeAllConnections();
|
closeAllConnections();
|
||||||
setDirty(c, false);
|
LOG.info("Compacting DB");
|
||||||
s = c.createStatement();
|
s = c.createStatement();
|
||||||
s.execute("SHUTDOWN COMPACT");
|
s.execute("SHUTDOWN COMPACT");
|
||||||
|
LOG.info("Finished compacting DB");
|
||||||
s.close();
|
s.close();
|
||||||
c.close();
|
c.close();
|
||||||
|
// Reopen the DB to mark it as clean after compacting
|
||||||
|
c = createConnection();
|
||||||
|
setDirty(c, false);
|
||||||
|
LOG.info("Marked DB as clean");
|
||||||
|
c.close();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
tryToClose(s, LOG, WARNING);
|
tryToClose(s, LOG, WARNING);
|
||||||
tryToClose(c, LOG, WARNING);
|
tryToClose(c, LOG, WARNING);
|
||||||
@@ -126,6 +132,7 @@ class H2Database extends JdbcDatabase {
|
|||||||
closeAllConnections();
|
closeAllConnections();
|
||||||
s = c.createStatement();
|
s = c.createStatement();
|
||||||
s.execute("SHUTDOWN COMPACT");
|
s.execute("SHUTDOWN COMPACT");
|
||||||
|
LOG.info("Finished compacting DB");
|
||||||
s.close();
|
s.close();
|
||||||
c.close();
|
c.close();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|||||||
@@ -388,7 +388,6 @@ abstract class AbstractBluetoothPlugin<S, SS> implements BluetoothPlugin,
|
|||||||
}
|
}
|
||||||
// Validate the UUID
|
// Validate the UUID
|
||||||
try {
|
try {
|
||||||
//noinspection ResultOfMethodCallIgnored
|
|
||||||
UUID.fromString(uuid);
|
UUID.fromString(uuid);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
if (LOG.isLoggable(WARNING)) LOG.warning("Invalid UUID " + uuid);
|
if (LOG.isLoggable(WARNING)) LOG.warning("Invalid UUID " + uuid);
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_ONLY_WHE
|
|||||||
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_PORT;
|
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_PORT;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.PROP_ONION_V3;
|
import static org.briarproject.bramble.api.plugin.TorConstants.PROP_ONION_V3;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_BATTERY;
|
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_BATTERY;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_COUNTRY_BLOCKED;
|
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_MOBILE_DATA;
|
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_MOBILE_DATA;
|
||||||
import static org.briarproject.bramble.plugin.tor.TorRendezvousCrypto.SEED_BYTES;
|
import static org.briarproject.bramble.plugin.tor.TorRendezvousCrypto.SEED_BYTES;
|
||||||
import static org.briarproject.bramble.util.IoUtils.tryToClose;
|
import static org.briarproject.bramble.util.IoUtils.tryToClose;
|
||||||
@@ -106,7 +105,6 @@ class TorPlugin implements DuplexPlugin, EventListener {
|
|||||||
private final PluginCallback callback;
|
private final PluginCallback callback;
|
||||||
private final long maxLatency;
|
private final long maxLatency;
|
||||||
private final int maxIdleTime;
|
private final int maxIdleTime;
|
||||||
private final boolean canVerifyLetsEncryptCerts;
|
|
||||||
private final int socketTimeout;
|
private final int socketTimeout;
|
||||||
private final AtomicBoolean used = new AtomicBoolean(false);
|
private final AtomicBoolean used = new AtomicBoolean(false);
|
||||||
|
|
||||||
@@ -126,8 +124,7 @@ class TorPlugin implements DuplexPlugin, EventListener {
|
|||||||
TorWrapper tor,
|
TorWrapper tor,
|
||||||
PluginCallback callback,
|
PluginCallback callback,
|
||||||
long maxLatency,
|
long maxLatency,
|
||||||
int maxIdleTime,
|
int maxIdleTime) {
|
||||||
boolean canVerifyLetsEncryptCerts) {
|
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
this.wakefulIoExecutor = wakefulIoExecutor;
|
this.wakefulIoExecutor = wakefulIoExecutor;
|
||||||
this.networkManager = networkManager;
|
this.networkManager = networkManager;
|
||||||
@@ -141,7 +138,6 @@ class TorPlugin implements DuplexPlugin, EventListener {
|
|||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
this.maxLatency = maxLatency;
|
this.maxLatency = maxLatency;
|
||||||
this.maxIdleTime = maxIdleTime;
|
this.maxIdleTime = maxIdleTime;
|
||||||
this.canVerifyLetsEncryptCerts = canVerifyLetsEncryptCerts;
|
|
||||||
if (maxIdleTime > Integer.MAX_VALUE / 2) {
|
if (maxIdleTime > Integer.MAX_VALUE / 2) {
|
||||||
socketTimeout = Integer.MAX_VALUE;
|
socketTimeout = Integer.MAX_VALUE;
|
||||||
} else {
|
} else {
|
||||||
@@ -297,7 +293,7 @@ class TorPlugin implements DuplexPlugin, EventListener {
|
|||||||
List<String> bridges = new ArrayList<>();
|
List<String> bridges = new ArrayList<>();
|
||||||
for (BridgeType bridgeType : bridgeTypes) {
|
for (BridgeType bridgeType : bridgeTypes) {
|
||||||
bridges.addAll(circumventionProvider.getBridges(bridgeType,
|
bridges.addAll(circumventionProvider.getBridges(bridgeType,
|
||||||
countryCode, canVerifyLetsEncryptCerts));
|
countryCode));
|
||||||
}
|
}
|
||||||
tor.enableBridges(bridges);
|
tor.enableBridges(bridges);
|
||||||
}
|
}
|
||||||
@@ -491,8 +487,8 @@ class TorPlugin implements DuplexPlugin, EventListener {
|
|||||||
boolean wifi = status.isWifi();
|
boolean wifi = status.isWifi();
|
||||||
boolean ipv6Only = status.isIpv6Only();
|
boolean ipv6Only = status.isIpv6Only();
|
||||||
String country = locationUtils.getCurrentCountry();
|
String country = locationUtils.getCurrentCountry();
|
||||||
boolean blocked =
|
boolean bridgesByDefault =
|
||||||
circumventionProvider.isTorProbablyBlocked(country);
|
circumventionProvider.shouldUseBridges(country);
|
||||||
boolean enabledByUser = settings.getBoolean(PREF_PLUGIN_ENABLE,
|
boolean enabledByUser = settings.getBoolean(PREF_PLUGIN_ENABLE,
|
||||||
DEFAULT_PREF_PLUGIN_ENABLE);
|
DEFAULT_PREF_PLUGIN_ENABLE);
|
||||||
int network = settings.getInt(PREF_TOR_NETWORK,
|
int network = settings.getInt(PREF_TOR_NETWORK,
|
||||||
@@ -502,7 +498,6 @@ class TorPlugin implements DuplexPlugin, EventListener {
|
|||||||
boolean onlyWhenCharging =
|
boolean onlyWhenCharging =
|
||||||
settings.getBoolean(PREF_TOR_ONLY_WHEN_CHARGING,
|
settings.getBoolean(PREF_TOR_ONLY_WHEN_CHARGING,
|
||||||
DEFAULT_PREF_TOR_ONLY_WHEN_CHARGING);
|
DEFAULT_PREF_TOR_ONLY_WHEN_CHARGING);
|
||||||
boolean bridgesWork = circumventionProvider.doBridgesWork(country);
|
|
||||||
boolean automatic = network == PREF_TOR_NETWORK_AUTOMATIC;
|
boolean automatic = network == PREF_TOR_NETWORK_AUTOMATIC;
|
||||||
|
|
||||||
if (LOG.isLoggable(INFO)) {
|
if (LOG.isLoggable(INFO)) {
|
||||||
@@ -532,10 +527,6 @@ class TorPlugin implements DuplexPlugin, EventListener {
|
|||||||
LOG.info("Configured not to use mobile data");
|
LOG.info("Configured not to use mobile data");
|
||||||
reasonsDisabled |= REASON_MOBILE_DATA;
|
reasonsDisabled |= REASON_MOBILE_DATA;
|
||||||
}
|
}
|
||||||
if (automatic && blocked && !bridgesWork) {
|
|
||||||
LOG.info("Country is blocked");
|
|
||||||
reasonsDisabled |= REASON_COUNTRY_BLOCKED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reasonsDisabled != 0) {
|
if (reasonsDisabled != 0) {
|
||||||
LOG.info("Disabling network due to settings");
|
LOG.info("Disabling network due to settings");
|
||||||
@@ -543,7 +534,7 @@ class TorPlugin implements DuplexPlugin, EventListener {
|
|||||||
LOG.info("Enabling network");
|
LOG.info("Enabling network");
|
||||||
enableNetwork = true;
|
enableNetwork = true;
|
||||||
if (network == PREF_TOR_NETWORK_WITH_BRIDGES ||
|
if (network == PREF_TOR_NETWORK_WITH_BRIDGES ||
|
||||||
(automatic && bridgesWork)) {
|
(automatic && bridgesByDefault)) {
|
||||||
if (ipv6Only) {
|
if (ipv6Only) {
|
||||||
bridgeTypes = asList(MEEK, SNOWFLAKE);
|
bridgeTypes = asList(MEEK, SNOWFLAKE);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -311,6 +311,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
|
|||||||
if (latest == null) {
|
if (latest == null) {
|
||||||
merged = new TransportProperties(p);
|
merged = new TransportProperties(p);
|
||||||
Iterator<String> it = merged.values().iterator();
|
Iterator<String> it = merged.values().iterator();
|
||||||
|
//noinspection Java8CollectionRemoveIf
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
if (isNullOrEmpty(it.next())) it.remove();
|
if (isNullOrEmpty(it.next())) it.remove();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import org.briarproject.bramble.api.sync.GroupId;
|
|||||||
import org.briarproject.bramble.api.sync.InvalidMessageException;
|
import org.briarproject.bramble.api.sync.InvalidMessageException;
|
||||||
import org.briarproject.bramble.api.sync.Message;
|
import org.briarproject.bramble.api.sync.Message;
|
||||||
import org.briarproject.bramble.api.sync.MessageId;
|
import org.briarproject.bramble.api.sync.MessageId;
|
||||||
import org.briarproject.bramble.api.sync.MessageStatus;
|
|
||||||
import org.briarproject.bramble.api.sync.validation.IncomingMessageHook;
|
import org.briarproject.bramble.api.sync.validation.IncomingMessageHook;
|
||||||
import org.briarproject.bramble.api.system.Clock;
|
import org.briarproject.bramble.api.system.Clock;
|
||||||
import org.briarproject.bramble.api.versioning.ClientMajorVersion;
|
import org.briarproject.bramble.api.versioning.ClientMajorVersion;
|
||||||
@@ -37,20 +36,17 @@ import java.util.Collections;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
import static java.util.logging.Logger.getLogger;
|
|
||||||
import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE;
|
import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE;
|
||||||
import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
|
import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
|
||||||
import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE;
|
import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE;
|
||||||
@@ -62,9 +58,6 @@ import static org.briarproject.bramble.versioning.ClientVersioningConstants.MSG_
|
|||||||
class ClientVersioningManagerImpl implements ClientVersioningManager,
|
class ClientVersioningManagerImpl implements ClientVersioningManager,
|
||||||
Service, OpenDatabaseHook, ContactHook, IncomingMessageHook {
|
Service, OpenDatabaseHook, ContactHook, IncomingMessageHook {
|
||||||
|
|
||||||
private static final Logger LOG =
|
|
||||||
getLogger(ClientVersioningManagerImpl.class.getName());
|
|
||||||
|
|
||||||
private final DatabaseComponent db;
|
private final DatabaseComponent db;
|
||||||
private final ClientHelper clientHelper;
|
private final ClientHelper clientHelper;
|
||||||
private final ContactGroupFactory contactGroupFactory;
|
private final ContactGroupFactory contactGroupFactory;
|
||||||
@@ -135,68 +128,12 @@ class ClientVersioningManagerImpl implements ClientVersioningManager,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDatabaseOpened(Transaction txn) throws DbException {
|
public void onDatabaseOpened(Transaction txn) throws DbException {
|
||||||
LOG.info("onDatabaseOpened " + localGroup.getId());
|
|
||||||
for (Contact c : db.getContacts(txn)) {
|
|
||||||
try {
|
|
||||||
// FIXME: DO NOT MERGE, this logs the contact name and alias
|
|
||||||
LOG.info(String.format(Locale.US,
|
|
||||||
"find latest updates for %d: %s (%s)",
|
|
||||||
c.getId().getInt(),
|
|
||||||
c.getAuthor().getName(),
|
|
||||||
c.getAlias()));
|
|
||||||
LatestUpdates latestUpdates = findLatestUpdates(txn, c.getId());
|
|
||||||
if (latestUpdates == null) {
|
|
||||||
LOG.info("none found");
|
|
||||||
} else {
|
|
||||||
if (latestUpdates.local != null) {
|
|
||||||
MessageStatus status = db.getMessageStatus(txn,
|
|
||||||
c.getId(), latestUpdates.local.messageId);
|
|
||||||
LOG.info(String.format(Locale.US,
|
|
||||||
"local: %s; sent: %b; seen: %b%n",
|
|
||||||
latestUpdates.local.messageId,
|
|
||||||
status.isSent(),
|
|
||||||
status.isSeen()));
|
|
||||||
Update update =
|
|
||||||
loadUpdate(txn, latestUpdates.local.messageId);
|
|
||||||
printUpdate(update);
|
|
||||||
}
|
|
||||||
if (latestUpdates.remote != null) {
|
|
||||||
MessageStatus status = db.getMessageStatus(txn,
|
|
||||||
c.getId(), latestUpdates.remote.messageId);
|
|
||||||
LOG.info(String.format(Locale.US,
|
|
||||||
"remote: %s; sent: %b; seen: %b%n",
|
|
||||||
latestUpdates.remote.messageId,
|
|
||||||
status.isSent(),
|
|
||||||
status.isSeen()));
|
|
||||||
Update update =
|
|
||||||
loadUpdate(txn, latestUpdates.remote.messageId);
|
|
||||||
printUpdate(update);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (FormatException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (db.containsGroup(txn, localGroup.getId())) return;
|
if (db.containsGroup(txn, localGroup.getId())) return;
|
||||||
db.addGroup(txn, localGroup);
|
db.addGroup(txn, localGroup);
|
||||||
// Set things up for any pre-existing contacts
|
// Set things up for any pre-existing contacts
|
||||||
for (Contact c : db.getContacts(txn)) addingContact(txn, c);
|
for (Contact c : db.getContacts(txn)) addingContact(txn, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printUpdate(Update update) {
|
|
||||||
LOG.info(String.format(Locale.US, "update version: %d%n",
|
|
||||||
update.updateVersion));
|
|
||||||
for (ClientState state : update.states) {
|
|
||||||
LOG.info(String.format(Locale.US,
|
|
||||||
"id: %s, major: %d, minor: %d, active: %b, %n",
|
|
||||||
state.clientVersion.getClientId().getString(),
|
|
||||||
state.clientVersion.getClientMajorVersion()
|
|
||||||
.getMajorVersion(),
|
|
||||||
state.clientVersion.getMinorVersion(),
|
|
||||||
state.active));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startService() throws ServiceException {
|
public void startService() throws ServiceException {
|
||||||
List<ClientVersion> versions = new ArrayList<>(clients);
|
List<ClientVersion> versions = new ArrayList<>(clients);
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package org.briarproject.bramble.crypto;
|
||||||
|
|
||||||
|
import java.security.Provider;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.security.SecureRandomSpi;
|
||||||
|
|
||||||
|
import static java.util.Arrays.fill;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A fake SecureRandom implementation for testing, which returns all zeroes.
|
||||||
|
*/
|
||||||
|
public class NeitherSecureNorRandom extends SecureRandom {
|
||||||
|
|
||||||
|
private static final Provider PROVIDER =
|
||||||
|
new NeitherSecureNorRandomProvider();
|
||||||
|
|
||||||
|
public NeitherSecureNorRandom() {
|
||||||
|
super(new NeitherSecureNorRandomSpi(), PROVIDER);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class NeitherSecureNorRandomSpi extends SecureRandomSpi {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected byte[] engineGenerateSeed(int length) {
|
||||||
|
return new byte[length];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void engineNextBytes(byte[] b) {
|
||||||
|
fill(b, (byte) 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void engineSetSeed(byte[] seed) {
|
||||||
|
// Thank you for your input
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class NeitherSecureNorRandomProvider extends Provider {
|
||||||
|
|
||||||
|
private NeitherSecureNorRandomProvider() {
|
||||||
|
super("NeitherSecureNorRandom", 1.0, "Only for testing");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
package org.briarproject.bramble.crypto;
|
|
||||||
|
|
||||||
import org.bouncycastle.crypto.Digest;
|
|
||||||
import org.bouncycastle.crypto.digests.Blake2bDigest;
|
|
||||||
import org.bouncycastle.crypto.engines.Salsa20Engine;
|
|
||||||
import org.bouncycastle.crypto.params.KeyParameter;
|
|
||||||
import org.bouncycastle.crypto.params.ParametersWithIV;
|
|
||||||
import org.briarproject.nullsafety.NotNullByDefault;
|
|
||||||
|
|
||||||
import javax.annotation.concurrent.NotThreadSafe;
|
|
||||||
|
|
||||||
@NotThreadSafe
|
|
||||||
@NotNullByDefault
|
|
||||||
class PseudoRandom {
|
|
||||||
|
|
||||||
private final Salsa20Engine cipher = new Salsa20Engine();
|
|
||||||
|
|
||||||
PseudoRandom(byte[] seed) {
|
|
||||||
// Hash the seed to produce a 32-byte key
|
|
||||||
byte[] key = new byte[32];
|
|
||||||
Digest digest = new Blake2bDigest(256);
|
|
||||||
digest.update(seed, 0, seed.length);
|
|
||||||
digest.doFinal(key, 0);
|
|
||||||
// Initialise the stream cipher with an all-zero nonce
|
|
||||||
byte[] nonce = new byte[8];
|
|
||||||
cipher.init(true, new ParametersWithIV(new KeyParameter(key), nonce));
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[] nextBytes(int length) {
|
|
||||||
byte[] in = new byte[length], out = new byte[length];
|
|
||||||
cipher.processBytes(in, 0, length, out, 0);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
package org.briarproject.bramble.crypto;
|
|
||||||
|
|
||||||
import java.security.Provider;
|
|
||||||
import java.security.SecureRandom;
|
|
||||||
import java.security.SecureRandomSpi;
|
|
||||||
|
|
||||||
class PseudoSecureRandom extends SecureRandom {
|
|
||||||
|
|
||||||
private static final Provider PROVIDER = new PseudoSecureRandomProvider();
|
|
||||||
|
|
||||||
PseudoSecureRandom(byte[] seed) {
|
|
||||||
super(new PseudoSecureRandomSpi(seed), PROVIDER);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class PseudoSecureRandomSpi extends SecureRandomSpi {
|
|
||||||
|
|
||||||
private final PseudoRandom pseudoRandom;
|
|
||||||
|
|
||||||
private PseudoSecureRandomSpi(byte[] seed) {
|
|
||||||
pseudoRandom = new PseudoRandom(seed);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected byte[] engineGenerateSeed(int length) {
|
|
||||||
return pseudoRandom.nextBytes(length);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void engineNextBytes(byte[] b) {
|
|
||||||
byte[] random = pseudoRandom.nextBytes(b.length);
|
|
||||||
System.arraycopy(random, 0, b, 0, b.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void engineSetSeed(byte[] seed) {
|
|
||||||
// Thank you for your input
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class PseudoSecureRandomProvider extends Provider {
|
|
||||||
|
|
||||||
private PseudoSecureRandomProvider() {
|
|
||||||
super("PseudoSecureRandom", 1.0, "Only for testing");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -15,9 +15,10 @@ import org.briarproject.bramble.test.BrambleMockTestCase;
|
|||||||
import org.briarproject.bramble.test.CaptureArgumentAction;
|
import org.briarproject.bramble.test.CaptureArgumentAction;
|
||||||
import org.briarproject.bramble.test.PredicateMatcher;
|
import org.briarproject.bramble.test.PredicateMatcher;
|
||||||
import org.jmock.Expectations;
|
import org.jmock.Expectations;
|
||||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
@@ -51,17 +52,12 @@ public class KeyAgreementTransportTest extends BrambleMockTestCase {
|
|||||||
private final KeyAgreementConnection keyAgreementConnection =
|
private final KeyAgreementConnection keyAgreementConnection =
|
||||||
new KeyAgreementConnection(duplexTransportConnection, transportId);
|
new KeyAgreementConnection(duplexTransportConnection, transportId);
|
||||||
|
|
||||||
private final InputStream inputStream;
|
private final InputStream inputStream =
|
||||||
private final OutputStream outputStream;
|
new ByteArrayInputStream(new byte[0]);
|
||||||
|
private final OutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
|
||||||
private KeyAgreementTransport kat;
|
private KeyAgreementTransport kat;
|
||||||
|
|
||||||
public KeyAgreementTransportTest() {
|
|
||||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
|
||||||
inputStream = context.mock(InputStream.class);
|
|
||||||
outputStream = context.mock(OutputStream.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSendKey() throws Exception {
|
public void testSendKey() throws Exception {
|
||||||
byte[] key = getRandomBytes(123);
|
byte[] key = getRandomBytes(123);
|
||||||
|
|||||||
@@ -21,11 +21,11 @@ import org.briarproject.bramble.api.properties.TransportProperties;
|
|||||||
import org.briarproject.bramble.api.properties.TransportPropertyManager;
|
import org.briarproject.bramble.api.properties.TransportPropertyManager;
|
||||||
import org.briarproject.bramble.api.system.Clock;
|
import org.briarproject.bramble.api.system.Clock;
|
||||||
import org.briarproject.bramble.api.system.TaskScheduler;
|
import org.briarproject.bramble.api.system.TaskScheduler;
|
||||||
|
import org.briarproject.bramble.crypto.NeitherSecureNorRandom;
|
||||||
import org.briarproject.bramble.test.BrambleMockTestCase;
|
import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||||
import org.briarproject.bramble.test.ImmediateExecutor;
|
import org.briarproject.bramble.test.ImmediateExecutor;
|
||||||
import org.briarproject.bramble.test.RunAction;
|
import org.briarproject.bramble.test.RunAction;
|
||||||
import org.jmock.Expectations;
|
import org.jmock.Expectations;
|
||||||
import org.jmock.imposters.ByteBuddyClassImposteriser;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
@@ -55,7 +55,6 @@ public class PollerImplTest extends BrambleMockTestCase {
|
|||||||
context.mock(TransportPropertyManager.class);
|
context.mock(TransportPropertyManager.class);
|
||||||
private final Clock clock = context.mock(Clock.class);
|
private final Clock clock = context.mock(Clock.class);
|
||||||
private final Cancellable cancellable = context.mock(Cancellable.class);
|
private final Cancellable cancellable = context.mock(Cancellable.class);
|
||||||
private final SecureRandom random;
|
|
||||||
|
|
||||||
private final Executor ioExecutor = new ImmediateExecutor();
|
private final Executor ioExecutor = new ImmediateExecutor();
|
||||||
private final TransportId transportId = getTransportId();
|
private final TransportId transportId = getTransportId();
|
||||||
@@ -67,8 +66,8 @@ public class PollerImplTest extends BrambleMockTestCase {
|
|||||||
private final PollerImpl poller;
|
private final PollerImpl poller;
|
||||||
|
|
||||||
public PollerImplTest() {
|
public PollerImplTest() {
|
||||||
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
|
// Use a fake SecureRandom that returns all zeroes
|
||||||
random = context.mock(SecureRandom.class);
|
SecureRandom random = new NeitherSecureNorRandom();
|
||||||
Executor wakefulIoExecutor = new ImmediateExecutor();
|
Executor wakefulIoExecutor = new ImmediateExecutor();
|
||||||
poller = new PollerImpl(ioExecutor, wakefulIoExecutor, scheduler,
|
poller = new PollerImpl(ioExecutor, wakefulIoExecutor, scheduler,
|
||||||
connectionManager, connectionRegistry, pluginManager,
|
connectionManager, connectionRegistry, pluginManager,
|
||||||
@@ -352,12 +351,10 @@ public class PollerImplTest extends BrambleMockTestCase {
|
|||||||
// Running the polling task schedules the next polling task
|
// Running the polling task schedules the next polling task
|
||||||
oneOf(plugin).getPollingInterval();
|
oneOf(plugin).getPollingInterval();
|
||||||
will(returnValue(pollingInterval));
|
will(returnValue(pollingInterval));
|
||||||
oneOf(random).nextDouble();
|
|
||||||
will(returnValue(0.5));
|
|
||||||
oneOf(clock).currentTimeMillis();
|
oneOf(clock).currentTimeMillis();
|
||||||
will(returnValue(now));
|
will(returnValue(now));
|
||||||
oneOf(scheduler).schedule(with(any(Runnable.class)),
|
oneOf(scheduler).schedule(with(any(Runnable.class)),
|
||||||
with(ioExecutor), with((long) (pollingInterval * 0.5)),
|
with(ioExecutor), with(0L),
|
||||||
with(MILLISECONDS));
|
with(MILLISECONDS));
|
||||||
will(returnValue(cancellable));
|
will(returnValue(cancellable));
|
||||||
// Get the transport properties and connected contacts
|
// Get the transport properties and connected contacts
|
||||||
@@ -396,12 +393,10 @@ public class PollerImplTest extends BrambleMockTestCase {
|
|||||||
// Running the polling task schedules the next polling task
|
// Running the polling task schedules the next polling task
|
||||||
oneOf(plugin).getPollingInterval();
|
oneOf(plugin).getPollingInterval();
|
||||||
will(returnValue(pollingInterval));
|
will(returnValue(pollingInterval));
|
||||||
oneOf(random).nextDouble();
|
|
||||||
will(returnValue(0.5));
|
|
||||||
oneOf(clock).currentTimeMillis();
|
oneOf(clock).currentTimeMillis();
|
||||||
will(returnValue(now));
|
will(returnValue(now));
|
||||||
oneOf(scheduler).schedule(with(any(Runnable.class)),
|
oneOf(scheduler).schedule(with(any(Runnable.class)),
|
||||||
with(ioExecutor), with((long) (pollingInterval * 0.5)),
|
with(ioExecutor), with(0L),
|
||||||
with(MILLISECONDS));
|
with(MILLISECONDS));
|
||||||
will(returnValue(cancellable));
|
will(returnValue(cancellable));
|
||||||
// Get the transport properties and connected contacts
|
// Get the transport properties and connected contacts
|
||||||
|
|||||||
@@ -1,73 +1,67 @@
|
|||||||
dependencyVerification {
|
dependencyVerification {
|
||||||
verify = [
|
verify = [
|
||||||
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
|
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
|
||||||
'com.fasterxml.jackson.core:jackson-annotations:2.13.4:jackson-annotations-2.13.4.jar:ac5b27a634942391ca113850ee7db01df1499a240174021263501c05fc653b44',
|
'com.fasterxml.jackson.core:jackson-annotations:2.13.4:jackson-annotations-2.13.4.jar:ac5b27a634942391ca113850ee7db01df1499a240174021263501c05fc653b44',
|
||||||
'com.fasterxml.jackson.core:jackson-core:2.13.4:jackson-core-2.13.4.jar:4c2e043200edd9ee7ba6fc378bd5c17784a5bf2388e152d208068b51fd0839cf',
|
'com.fasterxml.jackson.core:jackson-core:2.13.4:jackson-core-2.13.4.jar:4c2e043200edd9ee7ba6fc378bd5c17784a5bf2388e152d208068b51fd0839cf',
|
||||||
'com.fasterxml.jackson.core:jackson-databind:2.13.4:jackson-databind-2.13.4.jar:c9faff420d9e2c7e1e4711dbeebec2506a32c9942027211c5c293d8d87807eb6',
|
'com.fasterxml.jackson.core:jackson-databind:2.13.4:jackson-databind-2.13.4.jar:c9faff420d9e2c7e1e4711dbeebec2506a32c9942027211c5c293d8d87807eb6',
|
||||||
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
|
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
|
||||||
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
||||||
'com.google.dagger:dagger-compiler:2.45:dagger-compiler-2.45.jar:5617dfb994537dba5b41f3744a6dd13ec3cd99789c065e0d5c6fa9f21cf7ca25',
|
'com.google.dagger:dagger-compiler:2.51.1:dagger-compiler-2.51.1.jar:14cf2def1c4c8cd3b977840e297b463191d537cd1c8330992ca5c0b341a641ad',
|
||||||
'com.google.dagger:dagger-producers:2.45:dagger-producers-2.45.jar:a05abb4c3ccf6bb0f056bdcb5ef973898ecf172952ab5948a824aeea6c86ecaa',
|
'com.google.dagger:dagger-spi:2.51.1:dagger-spi-2.51.1.jar:deb52030b92b27c5dcd76b2c0747f1cf105b60939f6073b43eb06cfe7c9ba601',
|
||||||
'com.google.dagger:dagger-spi:2.45:dagger-spi-2.45.jar:7cd6f0b09d88e64a9c97bc80e544ab8ac8fdee9301754413585a74cf64222b27',
|
'com.google.dagger:dagger:2.51.1:dagger-2.51.1.jar:c3891a4c4a4e48682888ca321eaf8497004b286e1d9a2936867373219f7dd86d',
|
||||||
'com.google.dagger:dagger:2.45:dagger-2.45.jar:f011cae7d2c0fb7ea17c34e05bc10e768b1081a5892ad019cf1fdb0e125c49c1',
|
'com.google.devtools.ksp:symbol-processing-api:1.9.20-1.0.14:symbol-processing-api-1.9.20-1.0.14.jar:d0339396f40dc9eb3b3f7bc86257f93869ee23448fa31ec4a1de900c6b7ae6d7',
|
||||||
'com.google.devtools.ksp:symbol-processing-api:1.7.0-1.0.6:symbol-processing-api-1.7.0-1.0.6.jar:adc29417be5ca9ff42118105fea4e36d9ef44987abfc41432309371a60198941',
|
'com.google.errorprone:error_prone_annotations:2.23.0:error_prone_annotations-2.23.0.jar:ec6f39f068b6ff9ac323c68e28b9299f8c0a80ca512dccb1d4a70f40ac3ec054',
|
||||||
'com.google.errorprone:error_prone_annotations:2.7.1:error_prone_annotations-2.7.1.jar:cd5257c08a246cf8628817ae71cb822be192ef91f6881ca4a3fcff4f1de1cff3',
|
'com.google.errorprone:javac-shaded:9-dev-r4023-3:javac-shaded-9-dev-r4023-3.jar:65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30',
|
||||||
'com.google.errorprone:javac-shaded:9-dev-r4023-3:javac-shaded-9-dev-r4023-3.jar:65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30',
|
'com.google.googlejavaformat:google-java-format:1.5:google-java-format-1.5.jar:aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e',
|
||||||
'com.google.googlejavaformat:google-java-format:1.5:google-java-format-1.5.jar:aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e',
|
'com.google.guava:failureaccess:1.0.2:failureaccess-1.0.2.jar:8a8f81cf9b359e3f6dfa691a1e776985c061ef2f223c9b2c80753e1b458e8064',
|
||||||
'com.google.guava:failureaccess:1.0.1:failureaccess-1.0.1.jar:a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26',
|
'com.google.guava:guava:33.0.0-jre:guava-33.0.0-jre.jar:f4d85c3e4d411694337cb873abea09b242b664bb013320be6105327c45991537',
|
||||||
'com.google.guava:guava:31.0.1-jre:guava-31.0.1-jre.jar:d5be94d65e87bd219fb3193ad1517baa55a3b88fc91d21cf735826ab5af087b9',
|
'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99',
|
||||||
'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99',
|
'com.h2database:h2:1.4.192:h2-1.4.192.jar:225b22e9857235c46c93861410b60b8c81c10dc8985f4faf188985ba5445126c',
|
||||||
'com.google.j2objc:j2objc-annotations:1.3:j2objc-annotations-1.3.jar:21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b',
|
'com.squareup.okhttp3:mockwebserver:4.10.0:mockwebserver-4.10.0.jar:af29da234e63159d6e0dea43bf8288eea97d71cdf1651a5ee2d6c0d0d4adbf8f',
|
||||||
'com.h2database:h2:1.4.192:h2-1.4.192.jar:225b22e9857235c46c93861410b60b8c81c10dc8985f4faf188985ba5445126c',
|
'com.squareup.okhttp3:okhttp:4.12.0:okhttp-4.12.0.jar:b1050081b14bb7a3a7e55a4d3ef01b5dcfabc453b4573a4fc019767191d5f4e0',
|
||||||
'com.squareup.okhttp3:mockwebserver:4.10.0:mockwebserver-4.10.0.jar:af29da234e63159d6e0dea43bf8288eea97d71cdf1651a5ee2d6c0d0d4adbf8f',
|
'com.squareup.okio:okio-jvm:3.6.0:okio-jvm-3.6.0.jar:67543f0736fc422ae927ed0e504b98bc5e269fda0d3500579337cb713da28412',
|
||||||
'com.squareup.okhttp3:okhttp:4.10.0:okhttp-4.10.0.jar:7580f14fa1691206e37081ad3f92063b1603b328da0bb316f2fef02e0562e7ec',
|
'com.squareup:javapoet:1.13.0:javapoet-1.13.0.jar:4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291',
|
||||||
'com.squareup.okio:okio-jvm:3.0.0:okio-jvm-3.0.0.jar:be64a0cc1f28ea9cd5c970dd7e7557af72c808d738c495b397bf897c9921e907',
|
'com.squareup:kotlinpoet:1.11.0:kotlinpoet-1.11.0.jar:2887ada1ca03dd83baa2758640d87e840d1907564db0ef88d2289c868a980492',
|
||||||
'com.squareup:javapoet:1.13.0:javapoet-1.13.0.jar:4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291',
|
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
||||||
'com.squareup:kotlinpoet:1.11.0:kotlinpoet-1.11.0.jar:2887ada1ca03dd83baa2758640d87e840d1907564db0ef88d2289c868a980492',
|
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
|
||||||
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11',
|
||||||
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
|
'net.i2p.crypto:eddsa:0.2.0:eddsa-0.2.0.jar:a7cb1b85c16e2f0730b9204106929a1d9aaae1df728adc7041a8b8b605692140',
|
||||||
'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11',
|
'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
|
||||||
'net.i2p.crypto:eddsa:0.2.0:eddsa-0.2.0.jar:a7cb1b85c16e2f0730b9204106929a1d9aaae1df728adc7041a8b8b605692140',
|
'net.jodah:concurrentunit:0.4.6:concurrentunit-0.4.6.jar:760e6d4ab7801484de09da621b61141f3b2c2432949da9eb13f076e5d9a5e0a5',
|
||||||
'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
|
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
||||||
'net.jodah:concurrentunit:0.4.6:concurrentunit-0.4.6.jar:760e6d4ab7801484de09da621b61141f3b2c2432949da9eb13f076e5d9a5e0a5',
|
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
|
||||||
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
'org.bitlet:weupnp:0.1.4:weupnp-0.1.4.jar:88df7e6504929d00bdb832863761385c68ab92af945b04f0770b126270a444fb',
|
||||||
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
|
'org.bouncycastle:bcprov-jdk15to18:1.82:bcprov-jdk15to18-1.82.jar:9c9ccecb08a0b00bd2a74afa6567d81d61a02bba1364f24e33fa0c4c1e929821',
|
||||||
'org.bitlet:weupnp:0.1.4:weupnp-0.1.4.jar:88df7e6504929d00bdb832863761385c68ab92af945b04f0770b126270a444fb',
|
'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
|
||||||
'org.bouncycastle:bcprov-jdk15to18:1.71:bcprov-jdk15to18-1.71.jar:143aaa4a40edd5fc2a18db7900059f6c16f4d931b94b94b20f7e2238e6662886',
|
'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
|
||||||
'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
|
'org.briarproject:onionwrapper-core:0.1.4:onionwrapper-core-0.1.4.jar:d0a48de7198d48eb0182a25d109bc06811484d1da799c6dfa5e2581285880a49',
|
||||||
'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
|
'org.briarproject:socks-socket:0.1:socks-socket-0.1.jar:e5898822d10f5390363c5dddb945891648c92cf93ba50709e07f0d173ec0eb4b',
|
||||||
'org.briarproject:onionwrapper-core:0.0.4:onionwrapper-core-0.0.4.jar:28a01a62e96aa763989a8afc325abd3bee54f8021269f91aa48b247a6e717870',
|
'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
|
||||||
'org.briarproject:socks-socket:0.1:socks-socket-0.1.jar:e5898822d10f5390363c5dddb945891648c92cf93ba50709e07f0d173ec0eb4b',
|
'org.checkerframework:checker-qual:3.41.0:checker-qual-3.41.0.jar:2f9f245bf68e4259d610894f2406dc1f6363dc639302bd566e8272e4f4541172',
|
||||||
'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
|
'org.codehaus.mojo.signature:java16:1.1:java16-1.1.signature:53799223a2c98dba2d0add810bed76315460df285c69e4f397ae6098f87dd619',
|
||||||
'org.checkerframework:checker-qual:3.12.0:checker-qual-3.12.0.jar:ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb',
|
'org.codehaus.mojo:animal-sniffer-annotations:1.24:animal-sniffer-annotations-1.24.jar:c720e6e5bcbe6b2f48ded75a47bccdb763eede79d14330102e0d352e3d89ed92',
|
||||||
'org.codehaus.mojo.signature:java16:1.1:java16-1.1.signature:53799223a2c98dba2d0add810bed76315460df285c69e4f397ae6098f87dd619',
|
'org.codehaus.mojo:animal-sniffer:1.24:animal-sniffer-1.24.jar:65d028de87134f0955e3a964fe438fc3e99e77b237a77e5e165869a8ff59db5f',
|
||||||
'org.codehaus.mojo:animal-sniffer-ant-tasks:1.22:animal-sniffer-ant-tasks-1.22.jar:3f6afeb3e09301d2d7179ed1db21e3ad8846c1e38415ad832a395138ae3f4218',
|
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
|
||||||
'org.codehaus.mojo:animal-sniffer:1.22:animal-sniffer-1.22.jar:f18c11a25bdd8b520b9c6a28cbb6f33007c812ab0051b6be3f0778e660aa501c',
|
'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
|
||||||
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
|
'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
|
||||||
'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
|
'org.hsqldb:hsqldb:2.3.5:hsqldb-2.3.5.jar:6676a6977ac98997a80f827ddbd3fe8ca1e0853dad1492512135fd1a222ccfad',
|
||||||
'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
|
'org.jetbrains.kotlin:kotlin-reflect:1.6.10:kotlin-reflect-1.6.10.jar:3277ac102ae17aad10a55abec75ff5696c8d109790396434b496e75087854203',
|
||||||
'org.hsqldb:hsqldb:2.3.5:hsqldb-2.3.5.jar:6676a6977ac98997a80f827ddbd3fe8ca1e0853dad1492512135fd1a222ccfad',
|
'org.jetbrains.kotlin:kotlin-stdlib-common:1.9.10:kotlin-stdlib-common-1.9.10.jar:cde3341ba18a2ba262b0b7cf6c55b20c90e8d434e42c9a13e6a3f770db965a88',
|
||||||
'org.jetbrains.kotlin:kotlin-reflect:1.6.10:kotlin-reflect-1.6.10.jar:3277ac102ae17aad10a55abec75ff5696c8d109790396434b496e75087854203',
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0:kotlin-stdlib-jdk7-1.9.0.jar:b7979a7aac94055f0d9f1fd3b47ce5ffe1cb6032a842ba9fbe7186f085289178',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20:kotlin-stdlib-common-1.6.20.jar:8da40a2520d30dcb1012176fe93d24e82d08a3e346c37e0343b0fb6f64f6be01',
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10:kotlin-stdlib-jdk7-1.9.10.jar:ac6361bf9ad1ed382c2103d9712c47cdec166232b4903ed596e8876b0681c9b7',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.7.0:kotlin-stdlib-common-1.7.0.jar:59c6ff64fe9a6604afce03e8aaa75f83586c6030ac71fb0b34ee7cdefed3618f',
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0:kotlin-stdlib-jdk8-1.9.0.jar:a59fa24fdf1ffb594baecdbf0fd10010f977cea10236d487fe3464977a7377fa',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.31:kotlin-stdlib-jdk7-1.5.31.jar:a25bf47353ce899d843cbddee516d621a73473e7fba97f8d0301e7b4aed7c15f',
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10:kotlin-stdlib-jdk8-1.9.10.jar:a4c74d94d64ce1abe53760fe0389dd941f6fc558d0dab35e47c085a11ec80f28',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.10:kotlin-stdlib-jdk7-1.6.10.jar:2aedcdc6b69b33bdf5cc235bcea88e7cf6601146bb6bcdffdb312bbacd7be261',
|
'org.jetbrains.kotlin:kotlin-stdlib:1.9.10:kotlin-stdlib-1.9.10.jar:55e989c512b80907799f854309f3bc7782c5b3d13932442d0379d5c472711504',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0:kotlin-stdlib-jdk7-1.7.0.jar:07e91be9b2ca20672d2bdb7e181b766e73453a2da13492b5ddaee8fa47aea239',
|
'org.jetbrains.kotlin:kotlin-stdlib:1.9.20:kotlin-stdlib-1.9.20.jar:28a35bcdff46d864f80f346a617e486284b208d17378c41900dfb1de95a90e6c',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.31:kotlin-stdlib-jdk8-1.5.31.jar:b548f7767aacf029d2417e47440742bd6d3ebede19b60386e23554ce5c4c5fdc',
|
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10:kotlin-stdlib-jdk8-1.6.10.jar:1456d82d039ea30d8485b032901f52bbf07e7cdbe8bb1f8708ad32a8574c41ce',
|
'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0:kotlin-stdlib-jdk8-1.7.0.jar:cf058e11db1dfc9944680c8c61b95ac689aaaa8a3eb30bced028100f038f030b',
|
'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib:1.6.20:kotlin-stdlib-1.6.20.jar:eeb51c2b67b26233fd81d0bc4f8044ec849718890905763ceffd84a31e2cb799',
|
'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib:1.7.0:kotlin-stdlib-1.7.0.jar:aa88e9625577957f3249a46cb6e166ee09b369e600f7a11d148d16b0a6d87f05',
|
'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04',
|
||||||
'org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0:kotlinx-metadata-jvm-0.5.0.jar:ca063a96639b08b9eaa0de4d65e899480740a6efbe28ab9a8681a2ced03055a4',
|
'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be',
|
||||||
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
|
'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984',
|
||||||
'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09',
|
'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
|
||||||
'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b',
|
'org.ow2.asm:asm:9.7:asm-9.7.jar:adf46d5e34940bdf148ecdd26a9ee8eea94496a72034ff7141066b3eea5c4e9d',
|
||||||
'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd',
|
'org.whispersystems:curve25519-java:0.5.0:curve25519-java-0.5.0.jar:0aadd43cf01d11e9b58f867b3c4f25c3194e8b0623d1953d32dfbfbee009e38d',
|
||||||
'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04',
|
]
|
||||||
'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be',
|
|
||||||
'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984',
|
|
||||||
'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
|
|
||||||
'org.ow2.asm:asm:9.3:asm-9.3.jar:1263369b59e29c943918de11d6d6152e2ec6085ce63e5710516f8c67d368e4bc',
|
|
||||||
'org.whispersystems:curve25519-java:0.5.0:curve25519-java-0.5.0.jar:0aadd43cf01d11e9b58f867b3c4f25c3194e8b0623d1953d32dfbfbee009e38d',
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import org.briarproject.onionwrapper.CircumventionProvider;
|
|||||||
import org.briarproject.onionwrapper.LocationUtils;
|
import org.briarproject.onionwrapper.LocationUtils;
|
||||||
import org.briarproject.onionwrapper.MacTorWrapper;
|
import org.briarproject.onionwrapper.MacTorWrapper;
|
||||||
import org.briarproject.onionwrapper.TorWrapper;
|
import org.briarproject.onionwrapper.TorWrapper;
|
||||||
import org.briarproject.onionwrapper.UnixTorWrapper;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
@@ -80,6 +79,6 @@ public class MacTorPluginFactory extends TorPluginFactory {
|
|||||||
return new TorPlugin(ioExecutor, wakefulIoExecutor, networkManager,
|
return new TorPlugin(ioExecutor, wakefulIoExecutor, networkManager,
|
||||||
locationUtils, torSocketFactory, circumventionProvider,
|
locationUtils, torSocketFactory, circumventionProvider,
|
||||||
batteryManager, backoff, torRendezvousCrypto, tor, callback,
|
batteryManager, backoff, torRendezvousCrypto, tor, callback,
|
||||||
MAX_LATENCY, MAX_IDLE_TIME, true);
|
MAX_LATENCY, MAX_IDLE_TIME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,6 +81,6 @@ public class UnixTorPluginFactory extends TorPluginFactory {
|
|||||||
return new TorPlugin(ioExecutor, wakefulIoExecutor, networkManager,
|
return new TorPlugin(ioExecutor, wakefulIoExecutor, networkManager,
|
||||||
locationUtils, torSocketFactory, circumventionProvider,
|
locationUtils, torSocketFactory, circumventionProvider,
|
||||||
batteryManager, backoff, torRendezvousCrypto, tor, callback,
|
batteryManager, backoff, torRendezvousCrypto, tor, callback,
|
||||||
MAX_LATENCY, MAX_IDLE_TIME, true);
|
MAX_LATENCY, MAX_IDLE_TIME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,6 +78,6 @@ public class WindowsTorPluginFactory extends TorPluginFactory {
|
|||||||
return new TorPlugin(ioExecutor, wakefulIoExecutor, networkManager,
|
return new TorPlugin(ioExecutor, wakefulIoExecutor, networkManager,
|
||||||
locationUtils, torSocketFactory, circumventionProvider,
|
locationUtils, torSocketFactory, circumventionProvider,
|
||||||
batteryManager, backoff, torRendezvousCrypto, tor, callback,
|
batteryManager, backoff, torRendezvousCrypto, tor, callback,
|
||||||
MAX_LATENCY, MAX_IDLE_TIME, true);
|
MAX_LATENCY, MAX_IDLE_TIME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,52 +1,48 @@
|
|||||||
dependencyVerification {
|
dependencyVerification {
|
||||||
verify = [
|
verify = [
|
||||||
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
|
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
|
||||||
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
|
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
|
||||||
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
||||||
'com.google.dagger:dagger-compiler:2.45:dagger-compiler-2.45.jar:5617dfb994537dba5b41f3744a6dd13ec3cd99789c065e0d5c6fa9f21cf7ca25',
|
'com.google.dagger:dagger-compiler:2.51.1:dagger-compiler-2.51.1.jar:14cf2def1c4c8cd3b977840e297b463191d537cd1c8330992ca5c0b341a641ad',
|
||||||
'com.google.dagger:dagger-producers:2.45:dagger-producers-2.45.jar:a05abb4c3ccf6bb0f056bdcb5ef973898ecf172952ab5948a824aeea6c86ecaa',
|
'com.google.dagger:dagger-spi:2.51.1:dagger-spi-2.51.1.jar:deb52030b92b27c5dcd76b2c0747f1cf105b60939f6073b43eb06cfe7c9ba601',
|
||||||
'com.google.dagger:dagger-spi:2.45:dagger-spi-2.45.jar:7cd6f0b09d88e64a9c97bc80e544ab8ac8fdee9301754413585a74cf64222b27',
|
'com.google.dagger:dagger:2.51.1:dagger-2.51.1.jar:c3891a4c4a4e48682888ca321eaf8497004b286e1d9a2936867373219f7dd86d',
|
||||||
'com.google.dagger:dagger:2.45:dagger-2.45.jar:f011cae7d2c0fb7ea17c34e05bc10e768b1081a5892ad019cf1fdb0e125c49c1',
|
'com.google.devtools.ksp:symbol-processing-api:1.9.20-1.0.14:symbol-processing-api-1.9.20-1.0.14.jar:d0339396f40dc9eb3b3f7bc86257f93869ee23448fa31ec4a1de900c6b7ae6d7',
|
||||||
'com.google.devtools.ksp:symbol-processing-api:1.7.0-1.0.6:symbol-processing-api-1.7.0-1.0.6.jar:adc29417be5ca9ff42118105fea4e36d9ef44987abfc41432309371a60198941',
|
'com.google.errorprone:error_prone_annotations:2.23.0:error_prone_annotations-2.23.0.jar:ec6f39f068b6ff9ac323c68e28b9299f8c0a80ca512dccb1d4a70f40ac3ec054',
|
||||||
'com.google.errorprone:error_prone_annotations:2.7.1:error_prone_annotations-2.7.1.jar:cd5257c08a246cf8628817ae71cb822be192ef91f6881ca4a3fcff4f1de1cff3',
|
'com.google.errorprone:javac-shaded:9-dev-r4023-3:javac-shaded-9-dev-r4023-3.jar:65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30',
|
||||||
'com.google.errorprone:javac-shaded:9-dev-r4023-3:javac-shaded-9-dev-r4023-3.jar:65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30',
|
'com.google.googlejavaformat:google-java-format:1.5:google-java-format-1.5.jar:aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e',
|
||||||
'com.google.googlejavaformat:google-java-format:1.5:google-java-format-1.5.jar:aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e',
|
'com.google.guava:failureaccess:1.0.2:failureaccess-1.0.2.jar:8a8f81cf9b359e3f6dfa691a1e776985c061ef2f223c9b2c80753e1b458e8064',
|
||||||
'com.google.guava:failureaccess:1.0.1:failureaccess-1.0.1.jar:a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26',
|
'com.google.guava:guava:33.0.0-jre:guava-33.0.0-jre.jar:f4d85c3e4d411694337cb873abea09b242b664bb013320be6105327c45991537',
|
||||||
'com.google.guava:guava:31.0.1-jre:guava-31.0.1-jre.jar:d5be94d65e87bd219fb3193ad1517baa55a3b88fc91d21cf735826ab5af087b9',
|
'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99',
|
||||||
'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99',
|
'com.squareup:javapoet:1.13.0:javapoet-1.13.0.jar:4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291',
|
||||||
'com.google.j2objc:j2objc-annotations:1.3:j2objc-annotations-1.3.jar:21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b',
|
'com.squareup:kotlinpoet:1.11.0:kotlinpoet-1.11.0.jar:2887ada1ca03dd83baa2758640d87e840d1907564db0ef88d2289c868a980492',
|
||||||
'com.squareup:javapoet:1.13.0:javapoet-1.13.0.jar:4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291',
|
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
||||||
'com.squareup:kotlinpoet:1.11.0:kotlinpoet-1.11.0.jar:2887ada1ca03dd83baa2758640d87e840d1907564db0ef88d2289c868a980492',
|
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
|
||||||
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11',
|
||||||
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
|
'net.java.dev.jna:jna-platform:5.13.0:jna-platform-5.13.0.jar:474d7b88f6e97009b6ec1d98c3024dd95c23187c65dabfbc35331bcac3d173dd',
|
||||||
'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11',
|
'net.java.dev.jna:jna:5.13.0:jna-5.13.0.jar:66d4f819a062a51a1d5627bffc23fac55d1677f0e0a1feba144aabdd670a64bb',
|
||||||
'net.java.dev.jna:jna-platform:5.13.0:jna-platform-5.13.0.jar:474d7b88f6e97009b6ec1d98c3024dd95c23187c65dabfbc35331bcac3d173dd',
|
'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
|
||||||
'net.java.dev.jna:jna:5.13.0:jna-5.13.0.jar:66d4f819a062a51a1d5627bffc23fac55d1677f0e0a1feba144aabdd670a64bb',
|
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
||||||
'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
|
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
|
||||||
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
|
||||||
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
|
'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
|
||||||
'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
|
'org.briarproject:onionwrapper-core:0.1.4:onionwrapper-core-0.1.4.jar:d0a48de7198d48eb0182a25d109bc06811484d1da799c6dfa5e2581285880a49',
|
||||||
'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
|
'org.briarproject:onionwrapper-java:0.1.4:onionwrapper-java-0.1.4.jar:3efaa84bee71cc46b5a0b033080eaed323242fae88ea05f7309ee9f999cb3ac3',
|
||||||
'org.briarproject:onionwrapper-core:0.0.4:onionwrapper-core-0.0.4.jar:28a01a62e96aa763989a8afc325abd3bee54f8021269f91aa48b247a6e717870',
|
'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
|
||||||
'org.briarproject:onionwrapper-java:0.0.4:onionwrapper-java-0.0.4.jar:7806ef878074498653b557e26eb70e6007df3450d6a910a2e9a322f7eb4df442',
|
'org.checkerframework:checker-qual:3.41.0:checker-qual-3.41.0.jar:2f9f245bf68e4259d610894f2406dc1f6363dc639302bd566e8272e4f4541172',
|
||||||
'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
|
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
|
||||||
'org.checkerframework:checker-qual:3.12.0:checker-qual-3.12.0.jar:ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb',
|
'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
|
||||||
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
|
'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
|
||||||
'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
|
'org.jetbrains.kotlin:kotlin-reflect:1.6.10:kotlin-reflect-1.6.10.jar:3277ac102ae17aad10a55abec75ff5696c8d109790396434b496e75087854203',
|
||||||
'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0:kotlin-stdlib-jdk7-1.9.0.jar:b7979a7aac94055f0d9f1fd3b47ce5ffe1cb6032a842ba9fbe7186f085289178',
|
||||||
'org.jetbrains.kotlin:kotlin-reflect:1.6.10:kotlin-reflect-1.6.10.jar:3277ac102ae17aad10a55abec75ff5696c8d109790396434b496e75087854203',
|
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0:kotlin-stdlib-jdk8-1.9.0.jar:a59fa24fdf1ffb594baecdbf0fd10010f977cea10236d487fe3464977a7377fa',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.7.0:kotlin-stdlib-common-1.7.0.jar:59c6ff64fe9a6604afce03e8aaa75f83586c6030ac71fb0b34ee7cdefed3618f',
|
'org.jetbrains.kotlin:kotlin-stdlib:1.9.20:kotlin-stdlib-1.9.20.jar:28a35bcdff46d864f80f346a617e486284b208d17378c41900dfb1de95a90e6c',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0:kotlin-stdlib-jdk7-1.7.0.jar:07e91be9b2ca20672d2bdb7e181b766e73453a2da13492b5ddaee8fa47aea239',
|
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0:kotlin-stdlib-jdk8-1.7.0.jar:cf058e11db1dfc9944680c8c61b95ac689aaaa8a3eb30bced028100f038f030b',
|
'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09',
|
||||||
'org.jetbrains.kotlin:kotlin-stdlib:1.7.0:kotlin-stdlib-1.7.0.jar:aa88e9625577957f3249a46cb6e166ee09b369e600f7a11d148d16b0a6d87f05',
|
'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b',
|
||||||
'org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0:kotlinx-metadata-jvm-0.5.0.jar:ca063a96639b08b9eaa0de4d65e899480740a6efbe28ab9a8681a2ced03055a4',
|
'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd',
|
||||||
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
|
'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04',
|
||||||
'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09',
|
'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be',
|
||||||
'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b',
|
'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984',
|
||||||
'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd',
|
'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
|
||||||
'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04',
|
]
|
||||||
'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be',
|
|
||||||
'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984',
|
|
||||||
'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[main]
|
[main]
|
||||||
host = https://www.transifex.com
|
host = https://www.transifex.com
|
||||||
lang_map = pt_BR: pt-rBR, nb_NO: nb, zh-Hans: zh-rCN, zh-Hant: zh-rTW
|
lang_map = es_CU: es-rCU, pt_BR: pt-rBR, pt_PT: pt-rPT, nb_NO: nb, zh-Hans: zh-rCN, zh-Hant: zh-rTW
|
||||||
|
|
||||||
[o:otf:p:briar:r:google-play-full-description]
|
[o:otf:p:briar:r:google-play-full-description]
|
||||||
file_filter = fastlane/metadata/android/<lang>/full_description.txt
|
file_filter = fastlane/metadata/android/<lang>/full_description.txt
|
||||||
|
|||||||
@@ -1,123 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
version="1.1"
|
|
||||||
id="Ebene_1"
|
|
||||||
x="0px"
|
|
||||||
y="0px"
|
|
||||||
viewBox="0 0 320 179.99999"
|
|
||||||
xml:space="preserve"
|
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
|
||||||
sodipodi:docname="briar-android_tv_artwork_logo_horizontal_black.svg"
|
|
||||||
width="320"
|
|
||||||
height="180"
|
|
||||||
inkscape:export-filename="C:\Users\hughi\Downloads\briar-android_tv_artwork_logo_horizontal_black.png"
|
|
||||||
inkscape:export-xdpi="95.967941"
|
|
||||||
inkscape:export-ydpi="95.967941"><metadata
|
|
||||||
id="metadata71"><rdf:RDF><cc:Work
|
|
||||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
|
||||||
id="defs69" /><sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1366"
|
|
||||||
inkscape:window-height="705"
|
|
||||||
id="namedview67"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="2"
|
|
||||||
inkscape:cx="215.47343"
|
|
||||||
inkscape:cy="62.929329"
|
|
||||||
inkscape:window-x="-8"
|
|
||||||
inkscape:window-y="-8"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="Ebene_1" /><style
|
|
||||||
type="text/css"
|
|
||||||
id="style3">
|
|
||||||
.st0{display:none;fill:#87C214;}
|
|
||||||
.st1{fill:#87C214;}
|
|
||||||
.st2{display:none;fill:#FFFFFF;}
|
|
||||||
.st3{fill:#95D220;}
|
|
||||||
.st4{display:none;fill:#95D220;}
|
|
||||||
</style><rect
|
|
||||||
style="opacity:1;fill:#ffffff;fill-opacity:0.98492461;stroke:none;stroke-width:0;stroke-miterlimit:1.41420996;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="rect3747"
|
|
||||||
width="320"
|
|
||||||
height="180"
|
|
||||||
x="0"
|
|
||||||
y="0" /><rect
|
|
||||||
style="display:none;fill:#87c214"
|
|
||||||
id="rect11"
|
|
||||||
height="43.700001"
|
|
||||||
width="43.700001"
|
|
||||||
class="st0"
|
|
||||||
y="-82.800049"
|
|
||||||
x="47.200001" /><path
|
|
||||||
class="st2"
|
|
||||||
d="m 73.2,-130 c 9.7,0 17.7,8 17.7,17.7 V 87.4 c 0,9.7 -8,17.7 -17.7,17.7 h -8.3 c -9.7,0 -17.7,-8 -17.7,-17.7 v -199.7 c 0,-9.7 7.9,-17.7 17.6,-17.7 h 8.4 m 0,-7 h -8.3 c -13.7,0 -24.7,11.1 -24.7,24.7 V 87.4 c 0,13.6 11.1,24.7 24.7,24.7 h 8.3 c 13.6,0 24.7,-11.1 24.7,-24.7 V -112.3 C 97.8,-125.9 86.8,-137 73.2,-137 Z"
|
|
||||||
id="path17"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="display:none;fill:#ffffff" /><rect
|
|
||||||
style="display:none;fill:#87c214"
|
|
||||||
id="rect25"
|
|
||||||
height="43.700001"
|
|
||||||
width="43.700001"
|
|
||||||
class="st0"
|
|
||||||
y="14.199951"
|
|
||||||
x="144.2" /><path
|
|
||||||
class="st2"
|
|
||||||
d="m 170.2,-130 c 9.7,0 17.7,8 17.7,17.7 V 87.4 c 0,9.7 -7.9,17.7 -17.7,17.7 h -8.3 c -9.7,0 -17.7,-8 -17.7,-17.7 v -199.7 c 0,-9.7 8,-17.7 17.7,-17.7 h 8.3 m 0,-7 h -8.3 c -13.6,0 -24.7,11.1 -24.7,24.7 V 87.4 c 0,13.6 11.1,24.7 24.7,24.7 h 8.3 c 13.6,0 24.7,-11.1 24.7,-24.7 v -199.7 c -0.1,-13.6 -11.1,-24.7 -24.7,-24.7 z"
|
|
||||||
id="path29"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="display:none;fill:#ffffff" /><g
|
|
||||||
id="g3745"
|
|
||||||
transform="matrix(0.65979376,0,0,0.65979376,0,-1020.103)"><path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
id="path13"
|
|
||||||
d="m 64.900391,1565 c -9.7,0 -17.701172,7.9992 -17.701172,17.6992 v 22.5 h 43.601562 v -22.5 c 0,-9.7 -7.901562,-17.6992 -17.601562,-17.6992 z m 96.999999,0 c -9.7,0 -17.70117,7.9992 -17.70117,17.6992 v 119.5 h 43.60156 v -119.5 c 0,-9.7 -7.90156,-17.6992 -17.60156,-17.6992 z m -114.701171,97.8008 v 119.5 c 0,9.7 7.901172,17.6992 17.701172,17.6992 h 8.298828 c 9.7,0 17.701172,-7.9992 17.701172,-17.6992 v -119.5 z m 97.000001,97 v 22.5 c 0,9.7 8.00117,17.6992 17.70117,17.6992 h 8.29883 c 9.7,0 17.70117,-7.9992 17.70117,-17.6992 v -22.5 z"
|
|
||||||
style="fill:#87c214" /><path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
id="path35"
|
|
||||||
d="M 17.699219,1612.1992 C 7.9992186,1612.1992 0,1620.1004 0,1629.9004 v 8.2988 c 0,9.7 7.8992186,17.7012 17.699219,17.7012 H 137.19922 v -43.7012 z m 177.101561,0 v 43.7012 h 22.5 c 9.7,0 17.69922,-7.9012 17.69922,-17.7012 v -8.2988 c 0,-9.8 -7.99922,-17.7012 -17.69922,-17.7012 z m -177.101561,97 C 7.9992186,1709.1992 0,1717.1004 0,1726.9004 v 8.2988 c 0,9.7 7.8992186,17.7012 17.699219,17.7012 h 22.5 v -43.7012 z m 80.101562,0 v 43.7012 H 217.30078 c 9.7,0 17.69922,-8.0012 17.69922,-17.7012 v -8.2988 c 0,-9.8 -7.99922,-17.7012 -17.69922,-17.7012 z"
|
|
||||||
style="fill:#95d220" /></g><rect
|
|
||||||
style="display:none;fill:#95d220"
|
|
||||||
id="rect37"
|
|
||||||
height="43.700001"
|
|
||||||
width="43.700001"
|
|
||||||
class="st4"
|
|
||||||
y="14.199951"
|
|
||||||
x="47.200001" /><path
|
|
||||||
class="st2"
|
|
||||||
d="m 217.3,14.2 c 9.7,0 17.7,7.9 17.7,17.7 v 8.3 c 0,9.7 -8,17.7 -17.7,17.7 H 17.7 C 8,57.9 0,49.9 0,40.2 V 31.9 C 0,22.2 7.9,14.2 17.7,14.2 h 199.6 m 0,-7 H 17.7 C 4.1,7.2 -7,18.3 -7,31.9 v 8.3 c 0,13.6 11.1,24.7 24.7,24.7 h 199.7 c 13.6,0 24.7,-11.1 24.7,-24.7 V 31.9 C 242,18.2 230.9,7.2 217.3,7.2 Z"
|
|
||||||
id="path41"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="display:none;fill:#ffffff" /><rect
|
|
||||||
style="display:none;fill:#95d220"
|
|
||||||
id="rect47"
|
|
||||||
height="43.700001"
|
|
||||||
width="43.700001"
|
|
||||||
class="st4"
|
|
||||||
y="-82.800049"
|
|
||||||
x="144.2" /><path
|
|
||||||
class="st2"
|
|
||||||
d="m 217.3,-82.8 c 9.7,0 17.7,7.9 17.7,17.7 v 8.3 c 0,9.7 -8,17.7 -17.7,17.7 H 17.7 C 8,-39.1 0,-47 0,-56.8 v -8.3 c 0,-9.7 7.9,-17.7 17.7,-17.7 h 199.6 m 0,-7 H 17.7 c -13.6,0 -24.7,11 -24.7,24.6 v 8.3 c 0,13.6 11.1,24.7 24.7,24.7 h 199.7 c 13.6,0 24.7,-11.1 24.7,-24.7 v -8.3 C 242,-78.8 230.9,-89.8 217.3,-89.8 Z"
|
|
||||||
id="path53"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="display:none;fill:#ffffff" /><path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
d="m 164.94845,130.5118 v 37.0142 h 17.3299 c 8.17094,0 12.45497,-4.0911 12.45497,-10.4911 0,-4.156 -1.91138,-7.2578 -5.73332,-8.9728 v -0.083 c 2.89934,-1.7808 4.15207,-4.0233 4.15207,-7.521 0,-5.2791 -3.62408,-9.9627 -11.26806,-9.9627 z m 35.97934,0 v 37.0142 h 4.34796 v -14.8454 l -0.45977,-0.4615 h 8.76264 c 4.87623,0 7.64484,1.7133 9.424,5.5433 l 4.61191,9.7636 h 4.87655 l -5.46909,-11.5461 c -1.18614,-2.5738 -3.0974,-4.2227 -4.81061,-4.9483 v -0.083 c 4.0196,-1.0565 7.38013,-4.6856 7.38013,-9.5024 0,-7.3236 -5.66649,-10.9515 -12.45366,-10.9515 z m 36.10959,0 v 37.0142 h 4.34922 v -37.0142 z m 25.56832,0 -16.27714,37.0142 h 4.74504 l 3.95341,-8.9069 -0.19703,-0.4619 h 20.2293 l -0.19713,0.4619 3.9535,8.9069 h 4.74491 l -16.34284,-37.0142 z m 25.82985,0 v 37.0142 h 4.34912 v -14.8454 l -0.4612,-0.4615 h 8.76406 c 4.87643,0 7.64485,1.7133 9.42429,5.5433 l 4.61186,9.7636 H 320 l -5.46903,-11.5461 c -1.18594,-2.5738 -3.09737,-4.2227 -4.81072,-4.9483 v -0.083 c 4.01975,-1.0565 7.38026,-4.6856 7.38026,-9.5024 0,-7.3236 -5.6664,-10.9515 -12.45361,-10.9515 z m -119.59919,4.0908 h 12.58636 c 4.7444,0 7.24733,1.9136 7.24733,5.8723 0,3.2982 -1.97576,5.9394 -7.24733,5.9394 h -12.58636 l 0.46124,-0.4633 v -10.8868 z m 35.97962,0 h 12.32187 c 4.48085,0 7.907,1.8468 7.97296,6.7961 0,3.9585 -3.09676,6.7292 -8.43423,6.7292 h -11.8606 l 0.45977,-0.4614 v -12.6023 z m 87.44177,0 h 12.32223 c 4.54673,0 7.97414,1.8468 7.97414,6.7961 0,3.9585 -3.09683,6.7292 -8.43417,6.7292 h -11.8622 l 0.46141,-0.4614 v -12.6023 z m -27.28106,0.4616 h 0.0674 l 1.11984,3.6954 6.52328,14.8464 0.46124,0.46 h -16.27578 l 0.46131,-0.46 6.52318,-14.8464 z m -96.14033,15.4387 h 13.44199 c 5.46934,0 7.97421,2.5073 7.97421,6.532 0,4.0908 -2.30722,6.401 -7.97421,6.401 h -13.44199 l 0.46124,-0.463 V 150.966 Z"
|
|
||||||
id="path57"
|
|
||||||
style="stroke-width:0.65979397" /></svg>
|
|
||||||
|
Before Width: | Height: | Size: 7.8 KiB |
@@ -16,27 +16,29 @@ def getStdout = { command, defaultValue ->
|
|||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 33
|
compileSdk 35
|
||||||
buildToolsVersion '33.0.0'
|
buildToolsVersion '35.0.0'
|
||||||
|
|
||||||
packagingOptions {
|
packagingOptions {
|
||||||
doNotStrip '**/*.so'
|
jniLibs {
|
||||||
|
keepDebugSymbols += ['**/*.so']
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 33
|
targetSdkVersion 35
|
||||||
versionCode 10504
|
versionCode 10515
|
||||||
versionName "1.5.4"
|
versionName "1.5.15"
|
||||||
applicationId "org.briarproject.briar.android"
|
applicationId "org.briarproject.briar.android"
|
||||||
buildConfigField "String", "TorVersion", "\"$tor_version\""
|
buildConfigField "String", "TorVersion", "\"$tor_version\""
|
||||||
|
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
buildConfigField "String", "GitHash",
|
buildConfigField "String", "GitHash",
|
||||||
"\"${getStdout(['git', 'rev-parse', '--short=7', 'HEAD'], 'No commit hash')}\""
|
"\"${getStdout(['git', 'rev-parse', '--short=7', 'HEAD'], 'No commit hash')}\""
|
||||||
def now = (long) (System.currentTimeMillis() / 1000)
|
def now = (long) (System.currentTimeMillis() / 1000)
|
||||||
buildConfigField "Long", "BuildTimestamp",
|
buildConfigField "Long", "BuildTimestamp",
|
||||||
"${getStdout(['git', 'log', '-n', '1', '--format=%ct'], now)}000L"
|
"${getStdout(['git', 'log', '-n', '1', '--format=%ct'], now)}000L"
|
||||||
testInstrumentationRunner 'org.briarproject.briar.android.BriarTestRunner'
|
testInstrumentationRunner 'org.briarproject.briar.android.BriarTestRunner'
|
||||||
testInstrumentationRunnerArguments disableAnalytics: 'true'
|
testInstrumentationRunnerArguments disableAnalytics: 'true'
|
||||||
}
|
}
|
||||||
@@ -76,8 +78,8 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_17
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
|
||||||
testOptions {
|
testOptions {
|
||||||
@@ -86,15 +88,11 @@ android {
|
|||||||
includeAndroidResources = true
|
includeAndroidResources = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
namespace 'org.briarproject.briar'
|
||||||
lintOptions {
|
lint {
|
||||||
warning 'MissingTranslation'
|
warning 'MissingTranslation', 'MissingDefaultResource', 'ImpliedQuantity', 'ExtraTranslation', 'InvalidPackage'
|
||||||
warning 'MissingDefaultResource'
|
|
||||||
warning 'ImpliedQuantity'
|
|
||||||
warning 'ExtraTranslation'
|
|
||||||
// FIXME
|
|
||||||
warning 'InvalidPackage'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -108,16 +106,15 @@ dependencies {
|
|||||||
implementation project(':bramble-android')
|
implementation project(':bramble-android')
|
||||||
implementation project(':briar-core')
|
implementation project(':briar-core')
|
||||||
|
|
||||||
implementation 'androidx.fragment:fragment:1.5.5'
|
// newer versions of the libraries below require compileSdk 34
|
||||||
implementation 'androidx.preference:preference:1.2.0'
|
implementation 'androidx.fragment:fragment:1.6.2'
|
||||||
implementation 'androidx.exifinterface:exifinterface:1.3.6'
|
implementation 'androidx.preference:preference:1.2.1'
|
||||||
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
|
implementation 'androidx.exifinterface:exifinterface:1.3.7'
|
||||||
implementation 'androidx.lifecycle:lifecycle-livedata:2.5.1'
|
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2'
|
||||||
|
implementation 'androidx.lifecycle:lifecycle-livedata:2.6.2'
|
||||||
|
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||||
// check https://github.com/material-components/material-components-android/issues/3191
|
implementation 'com.google.android.material:material:1.9.0'
|
||||||
// before upgrading material library
|
|
||||||
implementation 'com.google.android.material:material:1.7.0'
|
|
||||||
implementation 'androidx.recyclerview:recyclerview-selection:1.1.0'
|
implementation 'androidx.recyclerview:recyclerview-selection:1.1.0'
|
||||||
|
|
||||||
// force kotlin standard lib to latest version to prevent jetifier issues
|
// force kotlin standard lib to latest version to prevent jetifier issues
|
||||||
@@ -131,7 +128,7 @@ dependencies {
|
|||||||
implementation 'com.vanniktech:emoji-google:0.9.0' // newer versions are more work to adapt
|
implementation 'com.vanniktech:emoji-google:0.9.0' // newer versions are more work to adapt
|
||||||
implementation 'com.github.kobakei:MaterialFabSpeedDial:1.2.1'
|
implementation 'com.github.kobakei:MaterialFabSpeedDial:1.2.1'
|
||||||
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
|
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
|
||||||
def glideVersion = '4.14.2'
|
def glideVersion = '4.16.0'
|
||||||
implementation("com.github.bumptech.glide:glide:$glideVersion") {
|
implementation("com.github.bumptech.glide:glide:$glideVersion") {
|
||||||
exclude group: 'com.android.support'
|
exclude group: 'com.android.support'
|
||||||
exclude module: 'disklrucache' // when there's no disk cache, we can't accidentally use it
|
exclude module: 'disklrucache' // when there's no disk cache, we can't accidentally use it
|
||||||
@@ -203,7 +200,7 @@ task verifyTranslations {
|
|||||||
}
|
}
|
||||||
if (translations.size() != 0)
|
if (translations.size() != 0)
|
||||||
throw new GradleException("Translations\n" + translations.join("\n")
|
throw new GradleException("Translations\n" + translations.join("\n")
|
||||||
+ "\nhave no matching value folder")
|
+ "\nhave no matching value folder")
|
||||||
|
|
||||||
// Some devices use iw instead of he for hebrew
|
// Some devices use iw instead of he for hebrew
|
||||||
def hebrew_legacy = project.file("src/main/res/values-iw")
|
def hebrew_legacy = project.file("src/main/res/values-iw")
|
||||||
@@ -219,6 +216,8 @@ task verifyTranslations {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Force evaluation of bramble-android before briar-android
|
||||||
|
project.evaluationDependsOn(project.getRootProject().findProject("bramble-android").getPath())
|
||||||
project.afterEvaluate {
|
project.afterEvaluate {
|
||||||
preBuild.dependsOn.add(verifyTranslations)
|
preBuild.dependsOn.add(verifyTranslations)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
Briar е приложение за обменяне на съобщения, предназначено за активисти, журналисти и всички други, които имат нужда от безопасен, лесен и стабилен начин за общуване. За разлика от другите подобни приложения, Briar може да използва Bluetooth или Wi-Fi, за да поддържа потока на информация по време на криза. При наличие на интернет, Briar използва мрежата на Tor и така предпазва потребителите и техните взаимоотношения от наблюдение.
|
Briar е приложение за обменяне на съобщения, предназначено за активисти, журналисти и всички други, които имат нужда от безопасен, лесен и стабилен начин за общуване. За разлика от другите подобни приложения, Briar не използва централен сървър - съобщенията се обменят между устройствата не потребителите. За да поддържа потока на информация по време на криза Briar използва Bluetooth, Wi-Fi или карти с памет. При наличие на интернет, Briar използва мрежата на Tor и така предпазва потребителите и техните взаимоотношения от наблюдение.
|
||||||
|
|
||||||
Приложението предлага лични съобщения, групи, форуми, а също и блогове. Вградена поддръжка на мрежата на Tor. Всичко, което правите в Briar се съхранява само на устройството ви, освен ако не решите да го споделите с други потребители.
|
Приложението предлага лични съобщения, групи, форуми, а също и блогове. Вградена поддръжка на мрежата на Tor. Всичко, което правите в Briar се съхранява само на устройството ви, освен ако не решите да го споделите с други потребители.
|
||||||
|
|
||||||
Няма реклами и проследяване. Изходният код на приложението е достъпен за преглед от всеки и е преминал професионален одит. Всички издания на Briar могат да бъдат пресъздадени и така може да бъде проверено, че публикувания изходен код отговаря на публикуваното тук приложение. Разработката се извършва от малък екип с нестопанска цел.
|
Няма реклами и проследяване. Изходният код на приложението е достъпен за преглед от всеки и е преминал професионален одит. Всички издания на Briar могат да бъдат пресъздадени и така може да бъде проверено, че публикувания изходен код точно отговаря на публикуваното тук приложение. Разработката се извършва от малък екип с нестопанска цел.
|
||||||
|
|
||||||
|
Политика за лични данни: https://briarproject.org/privacy
|
||||||
|
|
||||||
|
Ръководство: https://briarproject.org/manual
|
||||||
|
|
||||||
|
Изходен код: https://code.briarproject.org/briar/briar
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
Briar ist eine Messaging-App für Aktivisten, Journalisten und jeden, der eine sichere, einfache und robuste Art der Kommunikation benötigt. Im Gegensatz zu herkömmlichen Messaging-Apps benötigt Briar keinen zentralen Server. Nachrichten werden direkt zwischen den Geräten der Benutzer ausgetauscht. Wenn das Internet ausfällt, kann Briar diese auch über Bluetooth oder WLAN austauschen, um den Informationsaustausch in einer Krise aufrecht zu erhalten. Mit einer Internetverbindung kann Briar sich über das Tor-Netzwerk synchronisieren und schützt so die Nutzer und ihre Kontakte vor Überwachung.
|
Briar ist eine Messaging-App, die für Aktivisten, Journalisten und alle anderen entwickelt wurde, die eine sichere, einfache und robuste Möglichkeit zur Kommunikation benötigen. Im Gegensatz zu herkömmlichen Messaging-Apps verlässt sich Briar nicht auf einen zentralen Server - Nachrichten werden direkt zwischen den Geräten der Benutzer synchronisiert. Wenn das Internet nicht funktioniert, kann Briar über Bluetooth, WLAN oder Speicherkarten synchronisieren und so den Informationsaustausch in Krisenzeiten aufrechterhalten. Wenn das Internet verfügbar ist, kann Briar über das Tor-Netzwerk synchronisieren und Nutzer sowie ihre Kontakte vor Überwachung schützen.
|
||||||
|
|
||||||
Die App bietet private Nachrichten, Gruppen und Foren sowie Blogs. Die Unterstützung für das Tor-Netzwerk ist in die App integriert. Alles, was du in Briar machst, wird nur auf deinem Gerät gespeichert, es sei denn, du entscheidest dich, es mit anderen Benutzern zu teilen.
|
Die App bietet private Nachrichten, Gruppen und Foren sowie Blogs. Unterstützung für das Tor-Netzwerk ist in die App eingebaut. Alles, was du in Briar tust, wird nur auf deinem Gerät gespeichert, es sei denn, du entscheidest dich, es mit anderen Nutzern zu teilen.
|
||||||
|
|
||||||
Es gibt keine Werbung und kein Tracking. Der Quellcode der App ist komplett offen für jeden einsehbar und wurde bereits professionell auditiert. Alle Versionen von Briar sind reproduzierbar, so dass überprüft werden kann, ob der veröffentlichte Quellcode genau mit der hier veröffentlichten App übereinstimmt. Die Entwicklung wird von einem kleinen Non-Profit-Team durchgeführt.
|
Es gibt keine Werbung und kein Tracking. Der Quellcode der App ist vollständig offen und für jeden zur Inspektion zugänglich und wurde bereits professionell überprüft. Alle Versionen von Briar sind reproduzierbar, was es möglich macht, zu überprüfen, dass der veröffentlichte Quellcode genau mit der hier veröffentlichten App übereinstimmt. Die Entwicklung erfolgt durch ein kleines gemeinnütziges Team.
|
||||||
|
|
||||||
|
Datenschutzrichtlinien: https://briarproject.org/privacy
|
||||||
|
|
||||||
|
Benutzeranleitung: https://briarproject.org/manual
|
||||||
|
|
||||||
|
Quellcode: https://code.briarproject.org/briar/briar
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
Briar is a messaging app designed for activists, journalists, and anyone else who needs a safe, easy and robust way to communicate. Unlike traditional messaging apps, Briar doesn't rely on a central server - messages are synchronized directly between the users' devices. If the internet's down, Briar can sync via Bluetooth or Wi-Fi, keeping the information flowing in a crisis. If the internet's up, Briar can sync via the Tor network, protecting users and their relationships from surveillance.
|
Briar is a messaging app designed for activists, journalists, and anyone else who needs a safe, easy and robust way to communicate. Unlike traditional messaging apps, Briar doesn't rely on a central server - messages are synchronized directly between the users' devices. If the Internet's down, Briar can sync via Bluetooth, Wi-Fi or memory cards, keeping the information flowing in a crisis. If the Internet's up, Briar can sync via the Tor network, protecting users and their relationships from surveillance.
|
||||||
|
|
||||||
The app features private messages, groups and forums as well as blogs. Support for Tor network is built into the app. Everything you do in Briar is only stored on your device unless you decide to share it with other users.
|
The app features private messages, groups and forums as well as blogs. Support for the Tor network is built into the app. Everything you do in Briar is only stored on your device unless you decide to share it with other users.
|
||||||
|
|
||||||
There are no advertisements and no tracking. The source code of the app is completely open for anyone to inspect and has already been professionally audited. All releases of Briar are reproducible, making it possible to verify that the published source code matches exactly the app published here. Development is done by a small non-profit team.
|
There are no advertisements and no tracking. The source code of the app is completely open for anyone to inspect and has already been professionally audited. All releases of Briar are reproducible, making it possible to verify that the published source code exactly matches the app published here. Development is done by a small non-profit team.
|
||||||
|
|
||||||
|
Privacy policy: https://briarproject.org/privacy
|
||||||
|
|
||||||
|
User manual: https://briarproject.org/manual
|
||||||
|
|
||||||
|
Source code: https://code.briarproject.org/briar/briar
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
Briar este o aplicație de mesagerie concepută pentru activiști, jurnaliști și oricine altcineva care are nevoie de o modalitate sigură, ușoară și robustă de a comunica. Spre deosebire de aplicațiile de mesagerie tradiționale, Briar nu se bazează pe un server central, ci mesajele sunt sincronizate direct între dispozitivele utilizatorilor. Dacă nu este disponibilă o conexiune la internet, Briar poate realiza sincronizarea mesajelor prin Bluetooth sau Wi-Fi, permițând schimbul de informații într-o situație de criză. Când se reface conexiunea la internet, Briar poate realiza sincronizarea prin intermediul rețelei Tor, asigurând protecția utilizatorilor și a relațiilor lor împotriva supravegherii.
|
Briar este o aplicație de mesagerie concepută pentru activiști, jurnaliști și oricine altcineva care are nevoie de o modalitate sigură, ușoară și robustă de a comunica. Spre deosebire de aplicațiile de mesagerie tradiționale, Briar nu se bazează pe un server central, ci mesajele sunt sincronizate direct între dispozitivele utilizatorilor. Dacă nu este disponibilă o conexiune la internet, Briar poate realiza sincronizarea mesajelor prin Bluetooth, Wi-Fi sau carduri de memorie, permițând schimbul de informații într-o situație de criză. Când se reface conexiunea la internet, Briar poate realiza sincronizarea prin intermediul rețelei Tor, asigurând protecția utilizatorilor și a relațiilor lor împotriva supravegherii.
|
||||||
|
|
||||||
Aplicația oferă mesaje private, grupuri și forumuri, precum și bloguri. Suportul pentru rețeaua Tor este integrat în aplicație. Tot ceea ce faceți în Briar se stochează doar pe dispozitivul dvs., cu excepția cazului în care decideți partajarea cu alți utilizatori.
|
Aplicația oferă mesaje private, grupuri și forumuri, precum și bloguri. Suportul pentru rețeaua Tor este integrat în aplicație. Tot ceea ce faceți în Briar se stochează doar pe dispozitivul dvs., cu excepția cazului în care decideți partajarea cu alți utilizatori.
|
||||||
|
|
||||||
Nu există reclame și nici urmărire. Codul sursă al aplicației este complet deschis pentru a fi inspectat de oricine și a fost deja auditat de specialiști. Toate versiunile Briar sunt reproductibile, ceea ce face posibilă verificarea potrivirii exacte a codului sursă publicat cu aplicația publicată aici. Dezvoltarea este realizată de o mică echipă non-profit.
|
Nu există reclame și nici urmărire. Codul sursă al aplicației este complet deschis pentru a fi inspectat de oricine și a fost deja auditat de specialiști. Toate versiunile Briar sunt reproductibile, ceea ce face posibilă verificarea potrivirii exacte a codului sursă publicat cu aplicația publicată aici. Dezvoltarea este realizată de o mică echipă non-profit.
|
||||||
|
|
||||||
|
Politica de intimitate: https://briarproject.org/privacy
|
||||||
|
|
||||||
|
Manualul de utilizare: https://briarproject.org/manual
|
||||||
|
|
||||||
|
Codul sursă: https://code.briarproject.org/briar/briar
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
Briar je aplikácia na zasielanie správ určená pre aktivistov, novinárov a všetkých, ktorí potrebujú bezpečný, jednoduchý a spoľahlivý spôsob komunikácie. Na rozdiel od tradičných aplikácií na zasielanie správ, Briar sa nespolieha na centrálny server - správy sa synchronizujú priamo medzi zariadeniami používateľov. Ak vypadne internet, Briar sa dokáže synchronizovať cez Bluetooth alebo Wi-Fi, čím udržiava tok informácií aj v krízových situáciách. Ak internet funguje, Briar sa môže synchronizovať cez sieť Tor, čím chráni používateľov a ich vzťahy pred sledovaním.
|
Briar je aplikácia na zasielanie správ určená pre aktivistov, novinárov a všetkých, ktorí potrebujú bezpečný, jednoduchý a spoľahlivý spôsob komunikácie. Na rozdiel od tradičných aplikácií na zasielanie správ, Briar sa nespolieha na centrálny server - správy sa synchronizujú priamo medzi zariadeniami používateľov. V prípade výpadku internetu sa Briar dokáže synchronizovať cez Bluetooth, Wi-Fi alebo pamäťové karty, čím udržiava tok informácií aj v krízových situáciách. Ak je internet v prevádzke, Briar sa môže synchronizovať prostredníctvom siete Tor, čím chráni používateľov a ich vzťahy pred sledovaním.
|
||||||
|
|
||||||
Aplikácia poskytuje súkromné správy, skupiny a fóra, ako aj blogy. V aplikácii je zabudovaná podpora siete Tor. Všetko, čo robíte v aplikácii Briar, sa ukladá len vo vašom zariadení, pokiaľ sa to nerozhodnete zdieľať s ostatnými používateľmi.
|
Aplikácia poskytuje súkromné správy, skupiny a fóra, ako aj blogy. V aplikácii je zabudovaná podpora siete Tor. Všetko, čo robíte v aplikácii Briar, sa ukladá len vo vašom zariadení, pokiaľ sa to nerozhodnete zdieľať s ostatnými používateľmi.
|
||||||
|
|
||||||
Nie sú tu žiadne reklamy ani sledovanie. Zdrojový kód aplikácie je úplne otvorený, aby si ho mohol ktokoľvek pozrieť a už bol profesionálne skontrolovaný. Všetky vydania aplikácie Briar sú reprodukovateľné, čo umožňuje overiť, či sa zverejnený zdrojový kód presne zhoduje s tu zverejnenou aplikáciou. Vývoj aplikácie vykonáva malý neziskový tím.
|
Nie sú tu žiadne reklamy ani sledovanie. Zdrojový kód aplikácie je úplne otvorený, aby si ho mohol ktokoľvek pozrieť, a už bol profesionálne skontrolovaný. Všetky vydania aplikácie Briar sú reprodukovateľné, čo umožňuje overiť, či sa zverejnený zdrojový kód presne zhoduje s touto zverejnenou aplikáciou. Vývoj vykonáva malý neziskový tím.
|
||||||
|
|
||||||
|
Zásady ochrany osobných údajov: https://briarproject.org/privacy
|
||||||
|
|
||||||
|
Používateľská príručka: https://briarproject.org/manual
|
||||||
|
|
||||||
|
Zdrojový kód: https://code.briarproject.org/briar/briar
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
Briar është një aplikacion për shkëmbim mesazhesh, i konceptuar për veprimtarë, gazetarë, dhe cilido tjetër që ka nevojë për një mënyrë të sigurt, të lehtë dhe të fuqishme komunikimi. Ndryshe nga aplikacionet tradicionale, Briar-i nuk bazohet në një shërbyes qendror - mesazhet njëkohësohen drejtpërdrejt mes pajisjeve të përdoruesve. Nëse s’ka internet, Briar-i mund të bëjë njëkohësimin me Bluetooth ose Wi-Fi, duke mbajtur kështu rrjedhën e informacioneve në rast krizash. Nëse ka Internet, Briar-i mund të bëjë njëkohësimet përmes rrjetit Tor, duke i mbrojtur përdoruesit dhe marrëdhëniet e tyre nga survejimi.
|
Briar është një aplikacion për shkëmbim mesazhesh, i konceptuar për veprimtarë, gazetarë, dhe cilido tjetër që ka nevojë për një mënyrë të sigurt, të lehtë dhe të fuqishme komunikimi. Ndryshe nga aplikacionet tradicionale, Briar-i nuk bazohet në një shërbyes qendror - mesazhet njëkohësohen drejtpërdrejt mes pajisjeve të përdoruesve. Nëse s’ka Internet, Briar-i mund të bëjë njëkohësimin me Bluetooth, Wi-Fi, ose karta kujtese, duke mbajtur kështu rrjedhën e informacioneve në rast krizash. Nëse ka Internet, Briar-i mund të bëjë njëkohësimet përmes rrjetit Tor, duke i mbrojtur përdoruesit dhe marrëdhëniet e tyre nga survejimi.
|
||||||
|
|
||||||
Aplikacioni lejon mesazhe, grupe dhe forume private, si edhe blogje. Rrjeti Tor mbulohet së brendshmi nga aplikacioni. Gjithçka që bëni në Briar depozitohet vetëm në pajisjen tuaj, veç në vendosshi ta ndani me përdorues të tjerë.
|
Aplikacioni lejon mesazhe, grupe dhe forume private, si edhe blogje. Rrjeti Tor mbulohet së brendshmi nga aplikacioni. Gjithçka që bëni në Briar depozitohet vetëm në pajisjen tuaj, veç në vendosshi ta ndani me përdorues të tjerë.
|
||||||
|
|
||||||
S’ka reklama dhe as gjurmim. Kodi burim i aplikacionit është plotësisht i lirë që ta inspektojë cilido dhe është shqyrtuar tashmë profesionalisht. Krejt hedhjet në qarkullim të Briar-it janë të riprodhueshme, duke bërë të mundur të verifikohet se kodi burim i bërë publik përputhet plotësisht me aplikacionin e publikuar këtu. Zhvillimi bëhet nga një ekip i vogël jofitimprurës.
|
S’ka reklama dhe as gjurmim. Kodi burim i aplikacionit është plotësisht i lirë që ta inspektojë cilido dhe është shqyrtuar tashmë profesionalisht. Krejt hedhjet në qarkullim të Briar-it janë të riprodhueshme, duke bërë të mundur të verifikohet se kodi burim i bërë publik përputhet saktësisht me aplikacionin e publikuar këtu. Zhvillimi bëhet nga një ekip i vogël jofitimprurës.
|
||||||
|
|
||||||
|
Rregulla privatësie: https://briarproject.org/privacy
|
||||||
|
|
||||||
|
Doracak përdoruesi: https://briarproject.org/manual
|
||||||
|
|
||||||
|
Kod burim: https://code.briarproject.org/briar/briar
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
Briar aktivistler ve gazeteciler başta olmak üzere güvenli, kolay ve sağlam bir iletişim isteyen herkes için tasarlanmış bir ileti sistemidir. Geleneksel ileti sistemlerinin aksine Briar merkezi bir sunucu kullanmaz, iletiler doğrudan kullanıcıların aygıtları arasında eşleştirilir. Briar, eğer İnternet yoksa Bluetooth veya Wi-Fi aracılığıyla da iletileri iletebilir, böylece kriz durumlarında bilgi akışını sürdürür. İnternet varken Briar Tor ağı aracılığıyla iletim sağlar, böylece kullanıcıları ve ilişkilerini gözetimden korumuş olur.
|
Briar aktivistler ve gazeteciler başta olmak üzere güvenli, kolay ve sağlam bir iletişim isteyen herkes için tasarlanmış bir ileti aktarımı sistemidir. Geleneksel ileti aktarımı sistemlerinin aksine Briar merkezi bir sunucu kullanmaz. İletiler doğrudan kullanıcıların aygıtları arasında eşleştirilir. İnternet erişimi yoksa Briar iletileri Bluetooth veya Wi-Fi üzerinden de aktarabilir ve kriz durumlarında bilgi akışını sürdürür. İnternet erişimi varken Briar iletileri Tor ağı üzerinden aktarır. Böylece kullanıcılar ve yazıştıkları kişiler izlenmekten korunmuş olur.
|
||||||
|
|
||||||
Bu uygulama özel iletiler, gruplar ve forumlarla birlikte blog özelliklerine sahiptir. Tor ağı desteği uygulamada gömülüdür. Briar üzerinde yaptığınız her şey, siz başka kullanıcılarla paylaşmayı seçmediğiniz sürece, sadece kendi aygıtınızda saklanır.
|
Bu uygulamada özel iletiler, gruplar, forumlar ve günlük özellikleri bulunur. Tor ağı desteği uygulama ile bütünleştirilmiştir. Briar üzerinde yaptığınız her şey, siz başka kullanıcılarla paylaşmayı seçmediğiniz sürece, yalnızca kendi aygıtınızda tutulur.
|
||||||
|
|
||||||
Ne reklam var, ne de sizi izleme. Uygulamanın kaynak kodu, incelemek isteyen herkese tamamen açıktır ve zaten profesyonel olarak da denetlenmiştir. Briar'ın tüm sürümleri yeniden üretilebilir, böylece yayınlanan kaynak kodun, burada yayınlanan uygulamayla tam olarak eşlendiğini doğrulamak mümkündür. Uygulama kâr amacı gütmeyen küçük bir ekip tarafından geliştirilmektedir.
|
Reklam yok, izleme yok. Uygulamanın kaynak kodu, incelemek isteyen herkese açıktır ve profesyonel uzmanlar tarafından da denetlenmiştir. Tüm Briar sürümleri yeniden üretilebilir. Böylece yayınlanmış kaynak kodunun, burada yayınlanan uygulamayla bire bir aynı olduğu doğrulanabilir. Uygulama kâr amacı gütmeyen küçük bir ekip tarafından geliştirilmektedir.
|
||||||
|
|
||||||
|
Gizlilik ilkesi: https://briarproject.org/privacy
|
||||||
|
|
||||||
|
Kullanım rehberi: https://briarproject.org/manual
|
||||||
|
|
||||||
|
Kaynak kodu: https://code.briarproject.org/briar/briar
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Güvenli mesajlaşma, nerede olursa olsun.
|
Güvenli ileti gönderimi, her yerde.
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
-keepattributes SourceFile, LineNumberTable, *Annotation*, Signature, InnerClasses, EnclosingMethod
|
-keepattributes SourceFile, LineNumberTable, *Annotation*, Signature, InnerClasses, EnclosingMethod
|
||||||
|
|
||||||
-keep,includedescriptorclasses class org.briarproject.briar.android.**,org.briarproject.briar.api.android.** { *; }
|
-keep,includedescriptorclasses class org.briarproject.briar.android.**,org.briarproject.briar.api.android.** { *; }
|
||||||
|
-keep class org.briarproject.bramble.system.UnixSecureRandomSpi { *; }
|
||||||
|
|
||||||
# QR codes
|
# QR codes
|
||||||
-keep class com.google.zxing.Result
|
-keep class com.google.zxing.Result
|
||||||
@@ -42,3 +43,6 @@
|
|||||||
|
|
||||||
# Dependency injection annotations, needed for UI tests on older API levels
|
# Dependency injection annotations, needed for UI tests on older API levels
|
||||||
-keep class javax.inject.**
|
-keep class javax.inject.**
|
||||||
|
|
||||||
|
# H2 database: keep H2 MVStore classes
|
||||||
|
-keep class org.h2.mvstore.db.MVTableEngine
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
package="org.briarproject.briar">
|
|
||||||
|
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.bluetooth"
|
android:name="android.hardware.bluetooth"
|
||||||
@@ -12,9 +11,6 @@
|
|||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.touchscreen"
|
android:name="android.hardware.touchscreen"
|
||||||
android:required="false" />
|
android:required="false" />
|
||||||
<uses-feature
|
|
||||||
android:name="android.software.leanback"
|
|
||||||
android:required="false" />
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
@@ -36,16 +32,21 @@
|
|||||||
tools:ignore="ScopedStorage" />
|
tools:ignore="ScopedStorage" />
|
||||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"
|
<uses-permission-sdk-23
|
||||||
|
android:name="android.permission.ACCESS_FINE_LOCATION"
|
||||||
android:maxSdkVersion="32" />
|
android:maxSdkVersion="32" />
|
||||||
<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||||
<uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC" />
|
<uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC" />
|
||||||
<uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
<uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
|
||||||
|
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.HIDE_OVERLAY_WINDOWS"
|
||||||
|
tools:targetApi="31" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name="org.briarproject.briar.android.BriarApplicationImpl"
|
android:name="org.briarproject.briar.android.BriarApplicationImpl"
|
||||||
android:allowBackup="false"
|
android:allowBackup="false"
|
||||||
android:banner="@mipmap/tv_banner"
|
|
||||||
android:dataExtractionRules="@xml/backup_extraction_rules"
|
android:dataExtractionRules="@xml/backup_extraction_rules"
|
||||||
android:fullBackupContent="@xml/backup_rules"
|
android:fullBackupContent="@xml/backup_rules"
|
||||||
android:icon="@mipmap/ic_launcher_round"
|
android:icon="@mipmap/ic_launcher_round"
|
||||||
@@ -67,7 +68,8 @@
|
|||||||
|
|
||||||
<service
|
<service
|
||||||
android:name="org.briarproject.briar.android.BriarService"
|
android:name="org.briarproject.briar.android.BriarService"
|
||||||
android:exported="false">
|
android:exported="false"
|
||||||
|
android:foregroundServiceType="connectedDevice">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="org.briarproject.briar.android.BriarService" />
|
<action android:name="org.briarproject.briar.android.BriarService" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@@ -108,12 +110,12 @@
|
|||||||
<activity
|
<activity
|
||||||
android:name="org.briarproject.briar.android.login.StartupActivity"
|
android:name="org.briarproject.briar.android.login.StartupActivity"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:label="@string/app_name" />
|
android:theme="@style/BriarTheme.NoActionBar" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.briarproject.briar.android.account.SetupActivity"
|
android:name="org.briarproject.briar.android.account.SetupActivity"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:label="@string/setup_title" />
|
android:theme="@style/BriarTheme.NoActionBar" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.briarproject.briar.android.splash.SplashScreenActivity"
|
android:name="org.briarproject.briar.android.splash.SplashScreenActivity"
|
||||||
@@ -124,7 +126,6 @@
|
|||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
|
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class BriarAccountManager extends AndroidAccountManager {
|
|||||||
super.deleteAccount();
|
super.deleteAccount();
|
||||||
Localizer.reinitialize();
|
Localizer.reinitialize();
|
||||||
UiUtils.setTheme(appContext,
|
UiUtils.setTheme(appContext,
|
||||||
appContext.getString(R.string.pref_theme_light_value));
|
appContext.getString(R.string.pref_theme_system_value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import static java.util.logging.Level.FINE;
|
|||||||
import static java.util.logging.Level.INFO;
|
import static java.util.logging.Level.INFO;
|
||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
|
import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
|
||||||
|
import static org.briarproject.briar.android.settings.DisplayFragment.PREF_THEME;
|
||||||
|
|
||||||
public class BriarApplicationImpl extends Application
|
public class BriarApplicationImpl extends Application
|
||||||
implements BriarApplication {
|
implements BriarApplication {
|
||||||
@@ -109,11 +110,11 @@ public class BriarApplicationImpl extends Application
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setTheme(Context ctx, SharedPreferences prefs) {
|
private void setTheme(Context ctx, SharedPreferences prefs) {
|
||||||
String theme = prefs.getString("pref_key_theme", null);
|
String theme = prefs.getString(PREF_THEME, null);
|
||||||
if (theme == null) {
|
if (theme == null) {
|
||||||
// set default value
|
// set default value
|
||||||
theme = getString(R.string.pref_theme_light_value);
|
theme = getString(R.string.pref_theme_system_value);
|
||||||
prefs.edit().putString("pref_key_theme", theme).apply();
|
prefs.edit().putString(PREF_THEME, theme).apply();
|
||||||
}
|
}
|
||||||
// set theme
|
// set theme
|
||||||
UiUtils.setTheme(ctx, theme);
|
UiUtils.setTheme(ctx, theme);
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
|||||||
import org.briarproject.bramble.api.lifecycle.LifecycleManager.StartResult;
|
import org.briarproject.bramble.api.lifecycle.LifecycleManager.StartResult;
|
||||||
import org.briarproject.bramble.api.system.AndroidExecutor;
|
import org.briarproject.bramble.api.system.AndroidExecutor;
|
||||||
import org.briarproject.bramble.api.system.Clock;
|
import org.briarproject.bramble.api.system.Clock;
|
||||||
|
import org.briarproject.bramble.util.AndroidUtils;
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.logout.HideUiActivity;
|
import org.briarproject.briar.android.logout.HideUiActivity;
|
||||||
import org.briarproject.briar.api.android.AndroidNotificationManager;
|
import org.briarproject.briar.api.android.AndroidNotificationManager;
|
||||||
@@ -174,7 +175,8 @@ public class BriarService extends Service {
|
|||||||
filter.addAction(ACTION_SHUTDOWN);
|
filter.addAction(ACTION_SHUTDOWN);
|
||||||
filter.addAction("android.intent.action.QUICKBOOT_POWEROFF");
|
filter.addAction("android.intent.action.QUICKBOOT_POWEROFF");
|
||||||
filter.addAction("com.htc.intent.action.QUICKBOOT_POWEROFF");
|
filter.addAction("com.htc.intent.action.QUICKBOOT_POWEROFF");
|
||||||
registerReceiver(receiver, filter);
|
AndroidUtils.registerReceiver(getApplicationContext(), receiver,
|
||||||
|
filter, false);
|
||||||
}, "LifecycleStartup");
|
}, "LifecycleStartup");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,17 +217,14 @@ public class BriarService extends Service {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
// Hold a wake lock during shutdown
|
super.onDestroy();
|
||||||
wakeLockManager.runWakefully(() -> {
|
LOG.info("Destroyed");
|
||||||
super.onDestroy();
|
// Stop the lifecycle, if not already stopped
|
||||||
LOG.info("Destroyed");
|
shutdown(false);
|
||||||
stopForeground(true);
|
stopForeground(true);
|
||||||
if (receiver != null) unregisterReceiver(receiver);
|
if (receiver != null) {
|
||||||
// Stop the services in a background thread
|
getApplicationContext().unregisterReceiver(receiver);
|
||||||
wakeLockManager.executeWakefully(() -> {
|
}
|
||||||
if (started) lifecycleManager.stopServices();
|
|
||||||
}, "LifecycleShutdown");
|
|
||||||
}, "LifecycleShutdown");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -295,8 +294,8 @@ public class BriarService extends Service {
|
|||||||
private void shutdownFromBackground() {
|
private void shutdownFromBackground() {
|
||||||
// Hold a wake lock during shutdown
|
// Hold a wake lock during shutdown
|
||||||
wakeLockManager.runWakefully(() -> {
|
wakeLockManager.runWakefully(() -> {
|
||||||
// Stop the service
|
// Begin lifecycle shutdown
|
||||||
stopSelf();
|
shutdown(true);
|
||||||
// Hide the UI
|
// Hide the UI
|
||||||
hideUi();
|
hideUi();
|
||||||
// Wait for shutdown to complete, then exit
|
// Wait for shutdown to complete, then exit
|
||||||
@@ -331,8 +330,18 @@ public class BriarService extends Service {
|
|||||||
/**
|
/**
|
||||||
* Starts the shutdown process.
|
* Starts the shutdown process.
|
||||||
*/
|
*/
|
||||||
public void shutdown() {
|
public void shutdown(boolean stopAndroidService) {
|
||||||
stopSelf(); // This will call onDestroy()
|
// Hold a wake lock during shutdown
|
||||||
|
wakeLockManager.runWakefully(() -> {
|
||||||
|
// Stop the lifecycle services in a background thread,
|
||||||
|
// then stop this Android service if needed
|
||||||
|
wakeLockManager.executeWakefully(() -> {
|
||||||
|
if (started) lifecycleManager.stopServices();
|
||||||
|
if (stopAndroidService) {
|
||||||
|
androidExecutor.runOnUiThread(() -> stopSelf());
|
||||||
|
}
|
||||||
|
}, "LifecycleShutdown");
|
||||||
|
}, "LifecycleShutdown");
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BriarBinder extends Binder {
|
public class BriarBinder extends Binder {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import static android.os.PowerManager.ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED;
|
|||||||
import static android.os.PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED;
|
import static android.os.PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED;
|
||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
|
import static org.briarproject.bramble.util.AndroidUtils.registerReceiver;
|
||||||
|
|
||||||
class DozeWatchdogImpl implements DozeWatchdog, Service {
|
class DozeWatchdogImpl implements DozeWatchdog, Service {
|
||||||
|
|
||||||
@@ -48,7 +49,7 @@ class DozeWatchdogImpl implements DozeWatchdog, Service {
|
|||||||
filter.addAction(ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED);
|
filter.addAction(ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED);
|
||||||
filter.addAction(ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
|
filter.addAction(ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
|
||||||
}
|
}
|
||||||
appContext.registerReceiver(receiver, filter);
|
registerReceiver(appContext, receiver, filter, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ import static android.content.pm.PackageManager.GET_PERMISSIONS;
|
|||||||
import static android.content.pm.PackageManager.GET_SIGNATURES;
|
import static android.content.pm.PackageManager.GET_SIGNATURES;
|
||||||
import static android.os.Build.VERSION.SDK_INT;
|
import static android.os.Build.VERSION.SDK_INT;
|
||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
|
import static org.briarproject.bramble.util.AndroidUtils.registerReceiver;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
@@ -207,7 +208,7 @@ class ScreenFilterMonitorImpl implements ScreenFilterMonitor, Service {
|
|||||||
filter.addAction(ACTION_PACKAGE_REPLACED);
|
filter.addAction(ACTION_PACKAGE_REPLACED);
|
||||||
filter.addDataScheme("package");
|
filter.addDataScheme("package");
|
||||||
receiver = new PackageBroadcastReceiver();
|
receiver = new PackageBroadcastReceiver();
|
||||||
app.registerReceiver(receiver, filter);
|
registerReceiver(app, receiver, filter, false);
|
||||||
cachedApps = null;
|
cachedApps = null;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,9 @@ import javax.annotation.Nullable;
|
|||||||
|
|
||||||
import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
|
import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
|
||||||
import static org.briarproject.bramble.util.StringUtils.toUtf8;
|
import static org.briarproject.bramble.util.StringUtils.toUtf8;
|
||||||
|
import static org.briarproject.briar.android.util.UiUtils.hideViewOnSmallScreen;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.setError;
|
import static org.briarproject.briar.android.util.UiUtils.setError;
|
||||||
|
import static org.briarproject.briar.android.util.UiUtils.showOnboardingDialog;
|
||||||
|
|
||||||
@MethodsNotNullByDefault
|
@MethodsNotNullByDefault
|
||||||
@ParametersNotNullByDefault
|
@ParametersNotNullByDefault
|
||||||
@@ -38,19 +40,27 @@ public class AuthorNameFragment extends SetupFragment {
|
|||||||
public View onCreateView(LayoutInflater inflater,
|
public View onCreateView(LayoutInflater inflater,
|
||||||
@Nullable ViewGroup container,
|
@Nullable ViewGroup container,
|
||||||
@Nullable Bundle savedInstanceState) {
|
@Nullable Bundle savedInstanceState) {
|
||||||
requireActivity().setTitle(getString(R.string.setup_title));
|
|
||||||
View v = inflater.inflate(R.layout.fragment_setup_author_name,
|
View v = inflater.inflate(R.layout.fragment_setup_author_name,
|
||||||
container, false);
|
container, false);
|
||||||
authorNameWrapper = v.findViewById(R.id.nickname_entry_wrapper);
|
authorNameWrapper = v.findViewById(R.id.nickname_entry_wrapper);
|
||||||
authorNameInput = v.findViewById(R.id.nickname_entry);
|
authorNameInput = v.findViewById(R.id.nickname_entry);
|
||||||
|
Button infoButton = v.findViewById(R.id.info_button);
|
||||||
nextButton = v.findViewById(R.id.next);
|
nextButton = v.findViewById(R.id.next);
|
||||||
|
|
||||||
authorNameInput.addTextChangedListener(this);
|
authorNameInput.addTextChangedListener(this);
|
||||||
|
infoButton.setOnClickListener(view ->
|
||||||
|
showOnboardingDialog(requireContext(), getHelpText()));
|
||||||
nextButton.setOnClickListener(this);
|
nextButton.setOnClickListener(this);
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
hideViewOnSmallScreen(requireView().findViewById(R.id.logo));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUniqueTag() {
|
public String getUniqueTag() {
|
||||||
return TAG;
|
return TAG;
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import static android.view.View.VISIBLE;
|
|||||||
import static android.widget.Toast.LENGTH_LONG;
|
import static android.widget.Toast.LENGTH_LONG;
|
||||||
import static org.briarproject.android.dontkillmelib.DozeUtils.getDozeWhitelistingIntent;
|
import static org.briarproject.android.dontkillmelib.DozeUtils.getDozeWhitelistingIntent;
|
||||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_DOZE_WHITELISTING;
|
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_DOZE_WHITELISTING;
|
||||||
|
import static org.briarproject.briar.android.util.UiUtils.hideViewOnSmallScreen;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.showOnboardingDialog;
|
import static org.briarproject.briar.android.util.UiUtils.showOnboardingDialog;
|
||||||
|
|
||||||
@MethodsNotNullByDefault
|
@MethodsNotNullByDefault
|
||||||
@@ -79,6 +80,12 @@ public class DozeFragment extends SetupFragment
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
hideViewOnSmallScreen(requireView().findViewById(R.id.logo));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUniqueTag() {
|
public String getUniqueTag() {
|
||||||
return TAG;
|
return TAG;
|
||||||
|
|||||||
@@ -28,10 +28,12 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
|||||||
import static android.os.Build.VERSION.SDK_INT;
|
import static android.os.Build.VERSION.SDK_INT;
|
||||||
import static android.view.View.INVISIBLE;
|
import static android.view.View.INVISIBLE;
|
||||||
import static android.view.View.VISIBLE;
|
import static android.view.View.VISIBLE;
|
||||||
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
|
|
||||||
import static androidx.core.content.ContextCompat.checkSelfPermission;
|
import static androidx.core.content.ContextCompat.checkSelfPermission;
|
||||||
import static org.briarproject.bramble.api.crypto.PasswordStrengthEstimator.QUITE_WEAK;
|
import static org.briarproject.bramble.api.crypto.PasswordStrengthEstimator.QUITE_WEAK;
|
||||||
|
import static org.briarproject.bramble.api.crypto.PasswordStrengthEstimator.STRONG;
|
||||||
|
import static org.briarproject.briar.android.util.UiUtils.hideViewOnSmallScreen;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.setError;
|
import static org.briarproject.briar.android.util.UiUtils.setError;
|
||||||
|
import static org.briarproject.briar.android.util.UiUtils.showOnboardingDialog;
|
||||||
|
|
||||||
@MethodsNotNullByDefault
|
@MethodsNotNullByDefault
|
||||||
@ParametersNotNullByDefault
|
@ParametersNotNullByDefault
|
||||||
@@ -57,7 +59,6 @@ public class SetPasswordFragment extends SetupFragment {
|
|||||||
public View onCreateView(LayoutInflater inflater,
|
public View onCreateView(LayoutInflater inflater,
|
||||||
@Nullable ViewGroup container,
|
@Nullable ViewGroup container,
|
||||||
@Nullable Bundle savedInstanceState) {
|
@Nullable Bundle savedInstanceState) {
|
||||||
requireActivity().setTitle(getString(R.string.setup_password_intro));
|
|
||||||
View v = inflater.inflate(R.layout.fragment_setup_password, container,
|
View v = inflater.inflate(R.layout.fragment_setup_password, container,
|
||||||
false);
|
false);
|
||||||
|
|
||||||
@@ -67,17 +68,18 @@ public class SetPasswordFragment extends SetupFragment {
|
|||||||
passwordConfirmationWrapper =
|
passwordConfirmationWrapper =
|
||||||
v.findViewById(R.id.password_confirm_wrapper);
|
v.findViewById(R.id.password_confirm_wrapper);
|
||||||
passwordConfirmation = v.findViewById(R.id.password_confirm);
|
passwordConfirmation = v.findViewById(R.id.password_confirm);
|
||||||
|
Button infoButton = v.findViewById(R.id.info_button);
|
||||||
nextButton = v.findViewById(R.id.next);
|
nextButton = v.findViewById(R.id.next);
|
||||||
ProgressBar progressBar = v.findViewById(R.id.progress);
|
ProgressBar progressBar = v.findViewById(R.id.progress);
|
||||||
|
|
||||||
passwordEntry.addTextChangedListener(this);
|
passwordEntry.addTextChangedListener(this);
|
||||||
passwordConfirmation.addTextChangedListener(this);
|
passwordConfirmation.addTextChangedListener(this);
|
||||||
|
infoButton.setOnClickListener(view ->
|
||||||
|
showOnboardingDialog(requireContext(), getHelpText()));
|
||||||
nextButton.setOnClickListener(this);
|
nextButton.setOnClickListener(this);
|
||||||
|
|
||||||
if (!viewModel.needToShowDozeFragment()) {
|
if (!viewModel.needToShowDozeFragment()) {
|
||||||
nextButton.setText(R.string.create_account_button);
|
nextButton.setText(R.string.create_account_button);
|
||||||
int options = passwordConfirmation.getImeOptions();
|
|
||||||
passwordConfirmation.setImeOptions(options | IME_ACTION_DONE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
viewModel.getIsCreatingAccount()
|
viewModel.getIsCreatingAccount()
|
||||||
@@ -94,6 +96,12 @@ public class SetPasswordFragment extends SetupFragment {
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
hideViewOnSmallScreen(requireView().findViewById(R.id.logo));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUniqueTag() {
|
public String getUniqueTag() {
|
||||||
return TAG;
|
return TAG;
|
||||||
@@ -110,17 +118,27 @@ public class SetPasswordFragment extends SetupFragment {
|
|||||||
String password2 = passwordConfirmation.getText().toString();
|
String password2 = passwordConfirmation.getText().toString();
|
||||||
boolean passwordsMatch = password1.equals(password2);
|
boolean passwordsMatch = password1.equals(password2);
|
||||||
|
|
||||||
strengthMeter
|
strengthMeter.setVisibility(!password1.isEmpty() ? VISIBLE : INVISIBLE);
|
||||||
.setVisibility(password1.length() > 0 ? VISIBLE : INVISIBLE);
|
|
||||||
float strength = viewModel.estimatePasswordStrength(password1);
|
float strength = viewModel.estimatePasswordStrength(password1);
|
||||||
strengthMeter.setStrength(strength);
|
strengthMeter.setStrength(strength);
|
||||||
boolean strongEnough = strength >= QUITE_WEAK;
|
boolean strongEnough = strength >= QUITE_WEAK;
|
||||||
|
|
||||||
|
if (!password1.isEmpty()) {
|
||||||
|
if (strength >= STRONG) {
|
||||||
|
passwordEntryWrapper.setHelperText(
|
||||||
|
getString(R.string.password_strong));
|
||||||
|
} else if (strength >= QUITE_WEAK) {
|
||||||
|
passwordEntryWrapper.setHelperText(
|
||||||
|
getString(R.string.password_quite_strong));
|
||||||
|
} else {
|
||||||
|
passwordEntryWrapper.setHelperTextEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
setError(passwordEntryWrapper, getString(R.string.password_too_weak),
|
setError(passwordEntryWrapper, getString(R.string.password_too_weak),
|
||||||
password1.length() > 0 && !strongEnough);
|
!password1.isEmpty() && !strongEnough);
|
||||||
setError(passwordConfirmationWrapper,
|
setError(passwordConfirmationWrapper,
|
||||||
getString(R.string.passwords_do_not_match),
|
getString(R.string.passwords_do_not_match),
|
||||||
password2.length() > 0 && !passwordsMatch);
|
!password2.isEmpty() && !passwordsMatch);
|
||||||
|
|
||||||
boolean enabled = passwordsMatch && strongEnough;
|
boolean enabled = passwordsMatch && strongEnough;
|
||||||
nextButton.setEnabled(enabled);
|
nextButton.setEnabled(enabled);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.briarproject.briar.android.account;
|
package org.briarproject.briar.android.account;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.app.KeyguardManager;
|
import android.app.KeyguardManager;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -113,6 +114,7 @@ public class UnlockActivity extends BaseActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressLint("MissingSuperCall")
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
moveTaskToBack(true);
|
moveTaskToBack(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,6 +101,8 @@ public abstract class BaseActivity extends AppCompatActivity
|
|||||||
// unlock screen is shown.
|
// unlock screen is shown.
|
||||||
if (PREVENT_SCREENSHOTS) getWindow().addFlags(FLAG_SECURE);
|
if (PREVENT_SCREENSHOTS) getWindow().addFlags(FLAG_SECURE);
|
||||||
|
|
||||||
|
if (SDK_INT >= 31) getWindow().setHideOverlayWindows(true);
|
||||||
|
|
||||||
for (ActivityLifecycleController alc : lifecycleControllers) {
|
for (ActivityLifecycleController alc : lifecycleControllers) {
|
||||||
alc.onActivityCreate(this);
|
alc.onActivityCreate(this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import android.view.Window;
|
|||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManager;
|
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManager;
|
||||||
import org.briarproject.bramble.api.system.Wakeful;
|
import org.briarproject.bramble.api.system.Wakeful;
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
@@ -177,8 +179,8 @@ public abstract class BriarActivity extends BaseActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void showDozeDialog(@StringRes int message) {
|
protected void showDozeDialog(@StringRes int message) {
|
||||||
AlertDialog.Builder b =
|
MaterialAlertDialogBuilder b =
|
||||||
new AlertDialog.Builder(this, R.style.BriarDialogTheme);
|
new MaterialAlertDialogBuilder(this, R.style.BriarDialogTheme);
|
||||||
b.setMessage(message);
|
b.setMessage(message);
|
||||||
b.setView(R.layout.checkbox);
|
b.setView(R.layout.checkbox);
|
||||||
b.setPositiveButton(R.string.fix,
|
b.setPositiveButton(R.string.fix,
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.sync.GroupId;
|
import org.briarproject.bramble.api.sync.GroupId;
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
@@ -27,7 +29,6 @@ import javax.inject.Inject;
|
|||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView.LayoutManager;
|
import androidx.recyclerview.widget.RecyclerView.LayoutManager;
|
||||||
@@ -220,8 +221,8 @@ public class BlogFragment extends BaseFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showDeleteDialog() {
|
private void showDeleteDialog() {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext(),
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
R.style.BriarDialogTheme);
|
requireContext(), R.style.BriarDialogTheme);
|
||||||
builder.setTitle(getString(R.string.blogs_remove_blog));
|
builder.setTitle(getString(R.string.blogs_remove_blog));
|
||||||
builder.setMessage(
|
builder.setMessage(
|
||||||
getString(R.string.blogs_remove_blog_dialog_message));
|
getString(R.string.blogs_remove_blog_dialog_message));
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import android.app.Dialog;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.sync.GroupId;
|
import org.briarproject.bramble.api.sync.GroupId;
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.activity.BaseActivity;
|
import org.briarproject.briar.android.activity.BaseActivity;
|
||||||
@@ -13,7 +15,6 @@ import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
@@ -51,8 +52,8 @@ public class RssFeedDeleteFeedDialogFragment extends DialogFragment {
|
|||||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
||||||
GroupId groupId = new GroupId(
|
GroupId groupId = new GroupId(
|
||||||
requireNonNull(requireArguments().getByteArray(GROUP_ID)));
|
requireNonNull(requireArguments().getByteArray(GROUP_ID)));
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity(),
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
R.style.BriarDialogTheme);
|
requireActivity(), R.style.BriarDialogTheme);
|
||||||
builder.setTitle(getString(R.string.blogs_rss_remove_feed));
|
builder.setTitle(getString(R.string.blogs_rss_remove_feed));
|
||||||
builder.setMessage(
|
builder.setMessage(
|
||||||
getString(R.string.blogs_rss_remove_feed_dialog_message));
|
getString(R.string.blogs_rss_remove_feed_dialog_message));
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import android.app.Dialog;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.activity.BaseActivity;
|
import org.briarproject.briar.android.activity.BaseActivity;
|
||||||
import org.briarproject.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.nullsafety.MethodsNotNullByDefault;
|
||||||
@@ -12,7 +14,6 @@ import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
@@ -47,8 +48,8 @@ public class RssFeedImportFailedDialogFragment extends DialogFragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder =
|
||||||
new AlertDialog.Builder(requireActivity(),
|
new MaterialAlertDialogBuilder(requireActivity(),
|
||||||
R.style.BriarDialogTheme);
|
R.style.BriarDialogTheme);
|
||||||
builder.setMessage(R.string.blogs_rss_feeds_import_error);
|
builder.setMessage(R.string.blogs_rss_feeds_import_error);
|
||||||
builder.setNegativeButton(R.string.cancel, null);
|
builder.setNegativeButton(R.string.cancel, null);
|
||||||
|
|||||||
@@ -2,9 +2,12 @@ package org.briarproject.briar.android.blog;
|
|||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.text.SpannableStringBuilder;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
|
|
||||||
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.FormatException;
|
import org.briarproject.bramble.api.FormatException;
|
||||||
import org.briarproject.bramble.api.db.DbException;
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
import org.briarproject.bramble.api.identity.IdentityManager;
|
import org.briarproject.bramble.api.identity.IdentityManager;
|
||||||
@@ -34,14 +37,21 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.lifecycle.LiveData;
|
import androidx.lifecycle.LiveData;
|
||||||
import androidx.lifecycle.MutableLiveData;
|
import androidx.lifecycle.MutableLiveData;
|
||||||
|
|
||||||
|
import static android.text.util.Linkify.WEB_URLS;
|
||||||
|
import static android.text.util.Linkify.addLinks;
|
||||||
import static android.view.View.GONE;
|
import static android.view.View.GONE;
|
||||||
import static android.view.View.VISIBLE;
|
import static android.view.View.VISIBLE;
|
||||||
|
import static androidx.core.text.HtmlCompat.TO_HTML_PARAGRAPH_LINES_INDIVIDUAL;
|
||||||
|
import static androidx.core.text.HtmlCompat.toHtml;
|
||||||
|
import static com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_SHORT;
|
||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
|
import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
|
||||||
|
import static org.briarproject.bramble.util.StringUtils.toUtf8;
|
||||||
import static org.briarproject.briar.android.view.TextSendController.SendState;
|
import static org.briarproject.briar.android.view.TextSendController.SendState;
|
||||||
import static org.briarproject.briar.android.view.TextSendController.SendState.SENT;
|
import static org.briarproject.briar.android.view.TextSendController.SendState.SENT;
|
||||||
import static org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_POST_TEXT_LENGTH;
|
import static org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_POST_TEXT_LENGTH;
|
||||||
|
import static org.briarproject.briar.util.HtmlUtils.cleanArticle;
|
||||||
|
|
||||||
@MethodsNotNullByDefault
|
@MethodsNotNullByDefault
|
||||||
@ParametersNotNullByDefault
|
@ParametersNotNullByDefault
|
||||||
@@ -118,12 +128,23 @@ public class WriteBlogPostActivity extends BriarActivity
|
|||||||
List<AttachmentHeader> headers, long expectedAutoDeleteTimer) {
|
List<AttachmentHeader> headers, long expectedAutoDeleteTimer) {
|
||||||
if (isNullOrEmpty(text)) throw new AssertionError();
|
if (isNullOrEmpty(text)) throw new AssertionError();
|
||||||
|
|
||||||
|
SpannableStringBuilder ssb = SpannableStringBuilder.valueOf(text);
|
||||||
|
addLinks(ssb, WEB_URLS);
|
||||||
|
String html = cleanArticle(toHtml(ssb,
|
||||||
|
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL));
|
||||||
|
|
||||||
|
int textLength = toUtf8(html).length;
|
||||||
|
if (textLength > MAX_BLOG_POST_TEXT_LENGTH) {
|
||||||
|
Snackbar.make(input, R.string.text_too_long, LENGTH_SHORT).show();
|
||||||
|
return new MutableLiveData<>(null);
|
||||||
|
}
|
||||||
|
|
||||||
// hide publish button, show progress bar
|
// hide publish button, show progress bar
|
||||||
input.hideSoftKeyboard();
|
input.hideSoftKeyboard();
|
||||||
input.setVisibility(GONE);
|
input.setVisibility(GONE);
|
||||||
progressBar.setVisibility(VISIBLE);
|
progressBar.setVisibility(VISIBLE);
|
||||||
|
|
||||||
storePost(text);
|
storePost(html);
|
||||||
return new MutableLiveData<>(SENT);
|
return new MutableLiveData<>(SENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE;
|
|||||||
import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED;
|
import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED;
|
||||||
import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE;
|
import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE;
|
||||||
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
|
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
|
||||||
|
import static org.briarproject.bramble.util.AndroidUtils.registerReceiver;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
import static org.briarproject.bramble.util.StringUtils.ISO_8859_1;
|
import static org.briarproject.bramble.util.StringUtils.ISO_8859_1;
|
||||||
import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactPermissionManager.areEssentialPermissionsGranted;
|
import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactPermissionManager.areEssentialPermissionsGranted;
|
||||||
@@ -208,7 +209,7 @@ class AddNearbyContactViewModel extends AndroidViewModel
|
|||||||
qrCodeDecoder = new QrCodeDecoder(androidExecutor, ioExecutor, this);
|
qrCodeDecoder = new QrCodeDecoder(androidExecutor, ioExecutor, this);
|
||||||
eventBus.addListener(this);
|
eventBus.addListener(this);
|
||||||
IntentFilter filter = new IntentFilter(ACTION_SCAN_MODE_CHANGED);
|
IntentFilter filter = new IntentFilter(ACTION_SCAN_MODE_CHANGED);
|
||||||
getApplication().registerReceiver(bluetoothReceiver, filter);
|
registerReceiver(getApplication(), bluetoothReceiver, filter, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.briarproject.briar.android.contact.add.remote;
|
package org.briarproject.briar.android.contact.add.remote;
|
||||||
|
|
||||||
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.ClipData;
|
import android.content.ClipData;
|
||||||
import android.content.ClipboardManager;
|
import android.content.ClipboardManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -20,6 +21,7 @@ import org.briarproject.briar.android.view.InfoView;
|
|||||||
import org.briarproject.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
||||||
|
|
||||||
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@@ -29,8 +31,12 @@ import androidx.core.app.ShareCompat.IntentBuilder;
|
|||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
import static android.content.Context.CLIPBOARD_SERVICE;
|
import static android.content.Context.CLIPBOARD_SERVICE;
|
||||||
|
import static android.widget.Toast.LENGTH_LONG;
|
||||||
import static android.widget.Toast.LENGTH_SHORT;
|
import static android.widget.Toast.LENGTH_SHORT;
|
||||||
|
import static java.util.logging.Level.WARNING;
|
||||||
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.briarproject.bramble.api.contact.HandshakeLinkConstants.LINK_REGEX;
|
import static org.briarproject.bramble.api.contact.HandshakeLinkConstants.LINK_REGEX;
|
||||||
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.hideViewOnSmallScreen;
|
import static org.briarproject.briar.android.util.UiUtils.hideViewOnSmallScreen;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.observeOnce;
|
import static org.briarproject.briar.android.util.UiUtils.observeOnce;
|
||||||
|
|
||||||
@@ -39,6 +45,7 @@ import static org.briarproject.briar.android.util.UiUtils.observeOnce;
|
|||||||
public class LinkExchangeFragment extends BaseFragment {
|
public class LinkExchangeFragment extends BaseFragment {
|
||||||
|
|
||||||
private static final String TAG = LinkExchangeFragment.class.getName();
|
private static final String TAG = LinkExchangeFragment.class.getName();
|
||||||
|
private static final Logger LOG = getLogger(TAG);
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ViewModelProvider.Factory viewModelFactory;
|
ViewModelProvider.Factory viewModelFactory;
|
||||||
@@ -116,11 +123,18 @@ public class LinkExchangeFragment extends BaseFragment {
|
|||||||
copyButton.setEnabled(true);
|
copyButton.setEnabled(true);
|
||||||
|
|
||||||
Button shareButton = v.findViewById(R.id.shareButton);
|
Button shareButton = v.findViewById(R.id.shareButton);
|
||||||
shareButton.setOnClickListener(view ->
|
shareButton.setOnClickListener(view -> {
|
||||||
|
try {
|
||||||
IntentBuilder.from(requireActivity())
|
IntentBuilder.from(requireActivity())
|
||||||
.setText(link)
|
.setText(link)
|
||||||
.setType("text/plain")
|
.setType("text/plain")
|
||||||
.startChooser());
|
.startChooser();
|
||||||
|
} catch (ActivityNotFoundException e) {
|
||||||
|
logException(LOG, WARNING, e);
|
||||||
|
Toast.makeText(requireContext(),
|
||||||
|
R.string.error_start_activity, LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
shareButton.setEnabled(true);
|
shareButton.setEnabled(true);
|
||||||
|
|
||||||
InfoView infoText = v.findViewById(R.id.infoView);
|
InfoView infoText = v.findViewById(R.id.infoView);
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ public class NicknameFragment extends BaseFragment {
|
|||||||
|
|
||||||
private TextInputLayout contactNameLayout;
|
private TextInputLayout contactNameLayout;
|
||||||
private TextInputEditText contactNameInput;
|
private TextInputEditText contactNameInput;
|
||||||
|
private BriarButton addButton;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUniqueTag() {
|
public String getUniqueTag() {
|
||||||
@@ -91,7 +92,7 @@ public class NicknameFragment extends BaseFragment {
|
|||||||
contactNameLayout = v.findViewById(R.id.contactNameLayout);
|
contactNameLayout = v.findViewById(R.id.contactNameLayout);
|
||||||
contactNameInput = v.findViewById(R.id.contactNameInput);
|
contactNameInput = v.findViewById(R.id.contactNameInput);
|
||||||
|
|
||||||
BriarButton addButton = v.findViewById(R.id.addButton);
|
addButton = v.findViewById(R.id.addButton);
|
||||||
addButton.setOnClickListener(view -> onAddButtonClicked());
|
addButton.setOnClickListener(view -> onAddButtonClicked());
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
@@ -112,7 +113,7 @@ public class NicknameFragment extends BaseFragment {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private String getNicknameOrNull() {
|
private String getNicknameOrNull() {
|
||||||
Editable text = contactNameInput.getText();
|
Editable text = contactNameInput.getText();
|
||||||
if (text == null || text.toString().trim().length() == 0) {
|
if (text == null || text.toString().trim().isEmpty()) {
|
||||||
contactNameLayout.setError(getString(R.string.nickname_missing));
|
contactNameLayout.setError(getString(R.string.nickname_missing));
|
||||||
contactNameInput.requestFocus();
|
contactNameInput.requestFocus();
|
||||||
return null;
|
return null;
|
||||||
@@ -129,7 +130,10 @@ public class NicknameFragment extends BaseFragment {
|
|||||||
|
|
||||||
private void onAddButtonClicked() {
|
private void onAddButtonClicked() {
|
||||||
String name = getNicknameOrNull();
|
String name = getNicknameOrNull();
|
||||||
if (name == null) return; // invalid nickname
|
if (name == null) { // invalid nickname
|
||||||
|
addButton.reset();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LifecycleOwner owner = getViewLifecycleOwner();
|
LifecycleOwner owner = getViewLifecycleOwner();
|
||||||
viewModel.getAddContactResult().observe(owner, result -> {
|
viewModel.getAddContactResult().observe(owner, result -> {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import android.content.DialogInterface.OnClickListener;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.contact.PendingContactId;
|
import org.briarproject.bramble.api.contact.PendingContactId;
|
||||||
@@ -21,7 +22,6 @@ import javax.annotation.Nullable;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
|
||||||
@@ -110,7 +110,7 @@ public class PendingContactListActivity extends BriarActivity
|
|||||||
// show warning dialog
|
// show warning dialog
|
||||||
OnClickListener removeListener = (dialog, which) ->
|
OnClickListener removeListener = (dialog, which) ->
|
||||||
removePendingContact(item.getPendingContact().getId());
|
removePendingContact(item.getPendingContact().getId());
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
PendingContactListActivity.this, R.style.BriarDialogTheme);
|
PendingContactListActivity.this, R.style.BriarDialogTheme);
|
||||||
builder.setTitle(
|
builder.setTitle(
|
||||||
getString(R.string.dialog_title_remove_pending_contact));
|
getString(R.string.dialog_title_remove_pending_contact));
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ public class BriarControllerImpl implements BriarController {
|
|||||||
service.waitForStartup();
|
service.waitForStartup();
|
||||||
// Shut down the service and wait for it to shut down
|
// Shut down the service and wait for it to shut down
|
||||||
LOG.info("Shutting down service");
|
LOG.info("Shutting down service");
|
||||||
service.shutdown();
|
service.shutdown(true);
|
||||||
service.waitForShutdown();
|
service.waitForShutdown();
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
LOG.warning("Interrupted while waiting for service");
|
LOG.warning("Interrupted while waiting for service");
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import android.widget.ImageView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.FeatureFlags;
|
import org.briarproject.bramble.api.FeatureFlags;
|
||||||
@@ -101,7 +102,6 @@ import javax.inject.Inject;
|
|||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.appcompat.widget.ActionMenuView;
|
import androidx.appcompat.widget.ActionMenuView;
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import androidx.core.app.ActivityCompat;
|
import androidx.core.app.ActivityCompat;
|
||||||
@@ -812,8 +812,8 @@ public class ConversationActivity extends BriarActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void askToDeleteAllMessages() {
|
private void askToDeleteAllMessages() {
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder =
|
||||||
new AlertDialog.Builder(this, R.style.BriarDialogTheme);
|
new MaterialAlertDialogBuilder(this, R.style.BriarDialogTheme);
|
||||||
builder.setTitle(getString(R.string.dialog_title_delete_all_messages));
|
builder.setTitle(getString(R.string.dialog_title_delete_all_messages));
|
||||||
builder.setMessage(
|
builder.setMessage(
|
||||||
getString(R.string.dialog_message_delete_all_messages));
|
getString(R.string.dialog_message_delete_all_messages));
|
||||||
@@ -892,8 +892,8 @@ public class ConversationActivity extends BriarActivity
|
|||||||
}
|
}
|
||||||
String msg = join(fails, "\n\n");
|
String msg = join(fails, "\n\n");
|
||||||
// show dialog
|
// show dialog
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder =
|
||||||
new AlertDialog.Builder(this, R.style.BriarDialogTheme);
|
new MaterialAlertDialogBuilder(this, R.style.BriarDialogTheme);
|
||||||
builder.setTitle(
|
builder.setTitle(
|
||||||
getString(R.string.dialog_title_not_all_messages_deleted));
|
getString(R.string.dialog_title_not_all_messages_deleted));
|
||||||
builder.setMessage(msg);
|
builder.setMessage(msg);
|
||||||
@@ -904,8 +904,8 @@ public class ConversationActivity extends BriarActivity
|
|||||||
private void askToRemoveContact() {
|
private void askToRemoveContact() {
|
||||||
DialogInterface.OnClickListener okListener =
|
DialogInterface.OnClickListener okListener =
|
||||||
(dialog, which) -> removeContact();
|
(dialog, which) -> removeContact();
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder =
|
||||||
new AlertDialog.Builder(ConversationActivity.this,
|
new MaterialAlertDialogBuilder(ConversationActivity.this,
|
||||||
R.style.BriarDialogTheme);
|
R.style.BriarDialogTheme);
|
||||||
builder.setTitle(getString(R.string.dialog_title_delete_contact));
|
builder.setTitle(getString(R.string.dialog_title_delete_contact));
|
||||||
builder.setMessage(
|
builder.setMessage(
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import android.view.Menu;
|
|||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
import org.briarproject.briar.android.sharing.ForumSharingStatusActivity;
|
import org.briarproject.briar.android.sharing.ForumSharingStatusActivity;
|
||||||
@@ -20,7 +22,6 @@ import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
@@ -128,7 +129,7 @@ public class ForumActivity extends
|
|||||||
|
|
||||||
private void showUnsubscribeDialog() {
|
private void showUnsubscribeDialog() {
|
||||||
OnClickListener okListener = (dialog, which) -> viewModel.deleteForum();
|
OnClickListener okListener = (dialog, which) -> viewModel.deleteForum();
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(this,
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this,
|
||||||
R.style.BriarDialogTheme);
|
R.style.BriarDialogTheme);
|
||||||
builder.setTitle(getString(R.string.dialog_title_leave_forum));
|
builder.setTitle(getString(R.string.dialog_title_leave_forum));
|
||||||
builder.setMessage(getString(R.string.dialog_message_leave_forum));
|
builder.setMessage(getString(R.string.dialog_message_leave_forum));
|
||||||
|
|||||||
@@ -13,15 +13,18 @@ import androidx.recyclerview.widget.ListAdapter;
|
|||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
class ForumListAdapter extends ListAdapter<ForumListItem, ForumViewHolder> {
|
class ForumListAdapter extends ListAdapter<ForumListItem, ForumViewHolder> {
|
||||||
|
|
||||||
ForumListAdapter() {
|
private final ForumListViewModel viewModel;
|
||||||
|
|
||||||
|
ForumListAdapter(ForumListViewModel viewModel) {
|
||||||
super(new ForumListCallback());
|
super(new ForumListCallback());
|
||||||
|
this.viewModel = viewModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ForumViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
public ForumViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(
|
View v = LayoutInflater.from(parent.getContext()).inflate(
|
||||||
R.layout.list_item_forum, parent, false);
|
R.layout.list_item_forum, parent, false);
|
||||||
return new ForumViewHolder(v);
|
return new ForumViewHolder(v, viewModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public class ForumListFragment extends BaseFragment implements
|
|||||||
private ForumListViewModel viewModel;
|
private ForumListViewModel viewModel;
|
||||||
private BriarRecyclerView list;
|
private BriarRecyclerView list;
|
||||||
private Snackbar snackbar;
|
private Snackbar snackbar;
|
||||||
private final ForumListAdapter adapter = new ForumListAdapter();
|
private ForumListAdapter adapter;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ViewModelProvider.Factory viewModelFactory;
|
ViewModelProvider.Factory viewModelFactory;
|
||||||
@@ -54,6 +54,7 @@ public class ForumListFragment extends BaseFragment implements
|
|||||||
component.inject(this);
|
component.inject(this);
|
||||||
viewModel = new ViewModelProvider(this, viewModelFactory)
|
viewModel = new ViewModelProvider(this, viewModelFactory)
|
||||||
.get(ForumListViewModel.class);
|
.get(ForumListViewModel.class);
|
||||||
|
adapter = new ForumListAdapter(viewModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.briarproject.briar.android.forum;
|
package org.briarproject.briar.android.forum;
|
||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.contact.event.ContactRemovedEvent;
|
import org.briarproject.bramble.api.contact.event.ContactRemovedEvent;
|
||||||
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||||
@@ -15,6 +16,7 @@ import org.briarproject.bramble.api.sync.GroupId;
|
|||||||
import org.briarproject.bramble.api.sync.event.GroupAddedEvent;
|
import org.briarproject.bramble.api.sync.event.GroupAddedEvent;
|
||||||
import org.briarproject.bramble.api.sync.event.GroupRemovedEvent;
|
import org.briarproject.bramble.api.sync.event.GroupRemovedEvent;
|
||||||
import org.briarproject.bramble.api.system.AndroidExecutor;
|
import org.briarproject.bramble.api.system.AndroidExecutor;
|
||||||
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.viewmodel.DbViewModel;
|
import org.briarproject.briar.android.viewmodel.DbViewModel;
|
||||||
import org.briarproject.briar.android.viewmodel.LiveResult;
|
import org.briarproject.briar.android.viewmodel.LiveResult;
|
||||||
import org.briarproject.briar.api.android.AndroidNotificationManager;
|
import org.briarproject.briar.api.android.AndroidNotificationManager;
|
||||||
@@ -40,6 +42,7 @@ import androidx.annotation.UiThread;
|
|||||||
import androidx.lifecycle.LiveData;
|
import androidx.lifecycle.LiveData;
|
||||||
import androidx.lifecycle.MutableLiveData;
|
import androidx.lifecycle.MutableLiveData;
|
||||||
|
|
||||||
|
import static android.widget.Toast.LENGTH_SHORT;
|
||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logDuration;
|
import static org.briarproject.bramble.util.LogUtils.logDuration;
|
||||||
import static org.briarproject.bramble.util.LogUtils.now;
|
import static org.briarproject.bramble.util.LogUtils.now;
|
||||||
@@ -180,4 +183,17 @@ class ForumListViewModel extends DbViewModel implements EventListener {
|
|||||||
return numInvitations;
|
return numInvitations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void deleteForum(GroupId groupId) {
|
||||||
|
runOnDbThread(() -> {
|
||||||
|
try {
|
||||||
|
Forum f = forumManager.getForum(groupId);
|
||||||
|
forumManager.removeForum(f);
|
||||||
|
androidExecutor.runOnUiThread(() -> Toast
|
||||||
|
.makeText(getApplication(), R.string.forum_left_toast,
|
||||||
|
LENGTH_SHORT).show());
|
||||||
|
} catch (DbException e) {
|
||||||
|
handleException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.PopupMenu;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
@@ -20,6 +21,7 @@ import static org.briarproject.briar.android.activity.BriarActivity.GROUP_NAME;
|
|||||||
|
|
||||||
class ForumViewHolder extends RecyclerView.ViewHolder {
|
class ForumViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
private final ForumListViewModel viewModel;
|
||||||
private final Context ctx;
|
private final Context ctx;
|
||||||
private final ViewGroup layout;
|
private final ViewGroup layout;
|
||||||
private final TextAvatarView avatar;
|
private final TextAvatarView avatar;
|
||||||
@@ -27,8 +29,9 @@ class ForumViewHolder extends RecyclerView.ViewHolder {
|
|||||||
private final TextView postCount;
|
private final TextView postCount;
|
||||||
private final TextView date;
|
private final TextView date;
|
||||||
|
|
||||||
ForumViewHolder(View v) {
|
ForumViewHolder(View v, ForumListViewModel viewModel) {
|
||||||
super(v);
|
super(v);
|
||||||
|
this.viewModel = viewModel;
|
||||||
ctx = v.getContext();
|
ctx = v.getContext();
|
||||||
layout = (ViewGroup) v;
|
layout = (ViewGroup) v;
|
||||||
avatar = v.findViewById(R.id.avatarView);
|
avatar = v.findViewById(R.id.avatarView);
|
||||||
@@ -64,6 +67,21 @@ class ForumViewHolder extends RecyclerView.ViewHolder {
|
|||||||
date.setVisibility(VISIBLE);
|
date.setVisibility(VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Open popup menu on long click
|
||||||
|
layout.setOnLongClickListener(v -> {
|
||||||
|
PopupMenu pm = new PopupMenu(ctx, v);
|
||||||
|
pm.getMenuInflater().inflate(R.menu.forum_list_item_actions,
|
||||||
|
pm.getMenu());
|
||||||
|
pm.setOnMenuItemClickListener(it -> {
|
||||||
|
if (it.getItemId() == R.id.action_forum_delete) {
|
||||||
|
viewModel.deleteForum(item.getForum().getId());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
pm.show();
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
// Open Forum on Click
|
// Open Forum on Click
|
||||||
layout.setOnClickListener(v -> {
|
layout.setOnClickListener(v -> {
|
||||||
Intent i = new Intent(ctx, ForumActivity.class);
|
Intent i = new Intent(ctx, ForumActivity.class);
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ import android.view.View;
|
|||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.activity.BaseActivity;
|
import org.briarproject.briar.android.activity.BaseActivity;
|
||||||
import org.briarproject.briar.api.android.ScreenFilterMonitor;
|
import org.briarproject.briar.api.android.ScreenFilterMonitor;
|
||||||
@@ -27,7 +29,6 @@ import java.util.Collection;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
|
|
||||||
import static android.os.Build.VERSION.SDK_INT;
|
import static android.os.Build.VERSION.SDK_INT;
|
||||||
@@ -75,8 +76,8 @@ public class ScreenFilterDialogFragment extends DialogFragment {
|
|||||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
if (activity == null) throw new IllegalStateException();
|
if (activity == null) throw new IllegalStateException();
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity,
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
R.style.BriarDialogThemeNoFilter);
|
activity, R.style.BriarDialogThemeNoFilter);
|
||||||
builder.setTitle(R.string.screen_filter_title);
|
builder.setTitle(R.string.screen_filter_title);
|
||||||
Bundle args = getArguments();
|
Bundle args = getArguments();
|
||||||
if (args == null) throw new IllegalStateException();
|
if (args == null) throw new IllegalStateException();
|
||||||
|
|||||||
@@ -6,12 +6,13 @@ import android.content.Intent;
|
|||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
|
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.annotation.StringRes;
|
import androidx.annotation.StringRes;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.core.util.Consumer;
|
import androidx.core.util.Consumer;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
@@ -73,7 +74,8 @@ abstract class AbstractConditionManager {
|
|||||||
void showRationale(Context ctx, @StringRes int title,
|
void showRationale(Context ctx, @StringRes int title,
|
||||||
@StringRes int body, Runnable onContinueClicked,
|
@StringRes int body, Runnable onContinueClicked,
|
||||||
Runnable onDismiss) {
|
Runnable onDismiss) {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
|
MaterialAlertDialogBuilder builder =
|
||||||
|
new MaterialAlertDialogBuilder(ctx);
|
||||||
builder.setTitle(title);
|
builder.setTitle(title);
|
||||||
builder.setMessage(body);
|
builder.setMessage(body);
|
||||||
builder.setNeutralButton(R.string.continue_button,
|
builder.setNeutralButton(R.string.continue_button,
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ public class HotspotIntroFragment extends Fragment {
|
|||||||
getAndroidComponent(activity).inject(this);
|
getAndroidComponent(activity).inject(this);
|
||||||
viewModel = new ViewModelProvider(activity, viewModelFactory)
|
viewModel = new ViewModelProvider(activity, viewModelFactory)
|
||||||
.get(HotspotViewModel.class);
|
.get(HotspotViewModel.class);
|
||||||
|
conditionManager.init(requireActivity());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -76,8 +77,6 @@ public class HotspotIntroFragment extends Fragment {
|
|||||||
|
|
||||||
startButton.setOnClickListener(this::onButtonClick);
|
startButton.setOnClickListener(this::onButtonClick);
|
||||||
|
|
||||||
conditionManager.init(requireActivity());
|
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -432,7 +432,8 @@ class HotspotManager {
|
|||||||
|
|
||||||
@RequiresApi(29)
|
@RequiresApi(29)
|
||||||
private String getPassword() {
|
private String getPassword() {
|
||||||
return getRandomString(8);
|
return getRandomString(4) + "-" + getRandomString(4) + "-" +
|
||||||
|
getRandomString(4) + "-" + getRandomString(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String createWifiLoginString(String ssid, String password) {
|
private static String createWifiLoginString(String ssid, String password) {
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import static android.widget.Toast.LENGTH_LONG;
|
|||||||
import static org.briarproject.bramble.api.crypto.DecryptionResult.KEY_STRENGTHENER_ERROR;
|
import static org.briarproject.bramble.api.crypto.DecryptionResult.KEY_STRENGTHENER_ERROR;
|
||||||
import static org.briarproject.bramble.api.crypto.DecryptionResult.SUCCESS;
|
import static org.briarproject.bramble.api.crypto.DecryptionResult.SUCCESS;
|
||||||
import static org.briarproject.bramble.api.crypto.PasswordStrengthEstimator.QUITE_WEAK;
|
import static org.briarproject.bramble.api.crypto.PasswordStrengthEstimator.QUITE_WEAK;
|
||||||
|
import static org.briarproject.bramble.api.crypto.PasswordStrengthEstimator.STRONG;
|
||||||
import static org.briarproject.briar.android.login.LoginUtils.createKeyStrengthenerErrorDialog;
|
import static org.briarproject.briar.android.login.LoginUtils.createKeyStrengthenerErrorDialog;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.hideSoftKeyboard;
|
import static org.briarproject.briar.android.util.UiUtils.hideSoftKeyboard;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.setError;
|
import static org.briarproject.briar.android.util.UiUtils.setError;
|
||||||
@@ -123,12 +124,25 @@ public class ChangePasswordActivity extends BriarActivity
|
|||||||
boolean passwordsMatch = firstPassword.equals(secondPassword);
|
boolean passwordsMatch = firstPassword.equals(secondPassword);
|
||||||
float strength = viewModel.estimatePasswordStrength(firstPassword);
|
float strength = viewModel.estimatePasswordStrength(firstPassword);
|
||||||
strengthMeter.setStrength(strength);
|
strengthMeter.setStrength(strength);
|
||||||
|
|
||||||
|
if (!firstPassword.isEmpty()) {
|
||||||
|
if (strength >= STRONG) {
|
||||||
|
newPasswordEntryWrapper.setHelperText(
|
||||||
|
getString(R.string.password_strong));
|
||||||
|
} else if (strength >= QUITE_WEAK) {
|
||||||
|
newPasswordEntryWrapper.setHelperText(
|
||||||
|
getString(R.string.password_quite_strong));
|
||||||
|
} else {
|
||||||
|
newPasswordEntryWrapper.setHelperTextEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setError(newPasswordEntryWrapper,
|
setError(newPasswordEntryWrapper,
|
||||||
getString(R.string.password_too_weak),
|
getString(R.string.password_too_weak),
|
||||||
firstPassword.length() > 0 && strength < QUITE_WEAK);
|
!firstPassword.isEmpty() && strength < QUITE_WEAK);
|
||||||
setError(newPasswordConfirmationWrapper,
|
setError(newPasswordConfirmationWrapper,
|
||||||
getString(R.string.passwords_do_not_match),
|
getString(R.string.passwords_do_not_match),
|
||||||
secondPassword.length() > 0 && !passwordsMatch);
|
!secondPassword.isEmpty() && !passwordsMatch);
|
||||||
changePasswordButton.setEnabled(
|
changePasswordButton.setEnabled(
|
||||||
!currentPassword.getText().toString().isEmpty() &&
|
!currentPassword.getText().toString().isEmpty() &&
|
||||||
passwordsMatch && strength >= QUITE_WEAK);
|
passwordsMatch && strength >= QUITE_WEAK);
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package org.briarproject.briar.android.login;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.nullsafety.NotNullByDefault;
|
import org.briarproject.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
@@ -13,8 +15,8 @@ import static org.briarproject.briar.android.util.UiUtils.getDialogIcon;
|
|||||||
class LoginUtils {
|
class LoginUtils {
|
||||||
|
|
||||||
static AlertDialog createKeyStrengthenerErrorDialog(Context ctx) {
|
static AlertDialog createKeyStrengthenerErrorDialog(Context ctx) {
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder =
|
||||||
new AlertDialog.Builder(ctx, R.style.BriarDialogTheme);
|
new MaterialAlertDialogBuilder(ctx, R.style.BriarDialogTheme);
|
||||||
builder.setIcon(getDialogIcon(ctx, R.drawable.alerts_and_states_error));
|
builder.setIcon(getDialogIcon(ctx, R.drawable.alerts_and_states_error));
|
||||||
builder.setTitle(R.string.dialog_title_cannot_check_password);
|
builder.setTitle(R.string.dialog_title_cannot_check_password);
|
||||||
builder.setMessage(R.string.dialog_message_cannot_check_password);
|
builder.setMessage(R.string.dialog_message_cannot_check_password);
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.textfield.TextInputEditText;
|
import com.google.android.material.textfield.TextInputEditText;
|
||||||
import com.google.android.material.textfield.TextInputLayout;
|
import com.google.android.material.textfield.TextInputLayout;
|
||||||
|
|
||||||
@@ -40,6 +41,7 @@ import static org.briarproject.bramble.api.crypto.DecryptionResult.SUCCESS;
|
|||||||
import static org.briarproject.briar.android.login.LoginUtils.createKeyStrengthenerErrorDialog;
|
import static org.briarproject.briar.android.login.LoginUtils.createKeyStrengthenerErrorDialog;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.enterPressed;
|
import static org.briarproject.briar.android.util.UiUtils.enterPressed;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.hideSoftKeyboard;
|
import static org.briarproject.briar.android.util.UiUtils.hideSoftKeyboard;
|
||||||
|
import static org.briarproject.briar.android.util.UiUtils.hideViewOnSmallScreen;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.setError;
|
import static org.briarproject.briar.android.util.UiUtils.setError;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.showSoftKeyboard;
|
import static org.briarproject.briar.android.util.UiUtils.showSoftKeyboard;
|
||||||
|
|
||||||
@@ -100,6 +102,12 @@ public class PasswordFragment extends BaseFragment implements TextWatcher {
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
hideViewOnSmallScreen(requireView().findViewById(R.id.logo));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beforeTextChanged(CharSequence s, int start, int count,
|
public void beforeTextChanged(CharSequence s, int start, int count,
|
||||||
int after) {
|
int after) {
|
||||||
@@ -147,9 +155,11 @@ public class PasswordFragment extends BaseFragment implements TextWatcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onForgottenPasswordClick() {
|
private void onForgottenPasswordClick() {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext(),
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
R.style.BriarDialogTheme);
|
requireContext(), R.style.BriarDialogTheme);
|
||||||
builder.setTitle(R.string.dialog_title_lost_password);
|
builder.setTitle(R.string.dialog_title_lost_password);
|
||||||
|
builder.setBackgroundInsetStart(25);
|
||||||
|
builder.setBackgroundInsetEnd(25);
|
||||||
builder.setMessage(R.string.dialog_message_lost_password);
|
builder.setMessage(R.string.dialog_message_lost_password);
|
||||||
builder.setPositiveButton(R.string.cancel, null);
|
builder.setPositiveButton(R.string.cancel, null);
|
||||||
builder.setNegativeButton(R.string.delete,
|
builder.setNegativeButton(R.string.delete,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.briarproject.briar.android.login;
|
package org.briarproject.briar.android.login;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
@@ -74,6 +75,7 @@ public class StartupActivity extends BaseActivity implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressLint("MissingSuperCall")
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
// Move task and activity to the background instead of showing another
|
// Move task and activity to the background instead of showing another
|
||||||
// password prompt.
|
// password prompt.
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import android.widget.RadioGroup;
|
|||||||
import android.widget.ScrollView;
|
import android.widget.ScrollView;
|
||||||
|
|
||||||
import com.google.android.material.animation.ArgbEvaluatorCompat;
|
import com.google.android.material.animation.ArgbEvaluatorCompat;
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.view.BriarButton;
|
import org.briarproject.briar.android.view.BriarButton;
|
||||||
@@ -24,7 +25,6 @@ import javax.inject.Inject;
|
|||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
@@ -148,8 +148,8 @@ public class ErrorWizardFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onUnlinkButtonClicked(View v) {
|
private void onUnlinkButtonClicked(View v) {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext(),
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
R.style.BriarDialogTheme);
|
requireContext(), R.style.BriarDialogTheme);
|
||||||
builder.setTitle(R.string.mailbox_status_unlink_dialog_title);
|
builder.setTitle(R.string.mailbox_status_unlink_dialog_title);
|
||||||
builder.setMessage(R.string.mailbox_status_unlink_dialog_question);
|
builder.setMessage(R.string.mailbox_status_unlink_dialog_question);
|
||||||
builder.setPositiveButton(R.string.cancel,
|
builder.setPositiveButton(R.string.cancel,
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import android.view.MenuItem;
|
|||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState;
|
import org.briarproject.bramble.api.mailbox.MailboxPairingState;
|
||||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.ConnectionError;
|
import org.briarproject.bramble.api.mailbox.MailboxPairingState.ConnectionError;
|
||||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.InvalidQrCode;
|
import org.briarproject.bramble.api.mailbox.MailboxPairingState.InvalidQrCode;
|
||||||
@@ -31,7 +33,6 @@ import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
@@ -249,8 +250,8 @@ public class MailboxActivity extends BriarActivity {
|
|||||||
if (tellUserToWipeMailbox) {
|
if (tellUserToWipeMailbox) {
|
||||||
showFragment(getSupportFragmentManager(), new BlankFragment(),
|
showFragment(getSupportFragmentManager(), new BlankFragment(),
|
||||||
BlankFragment.TAG);
|
BlankFragment.TAG);
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
new AlertDialog.Builder(this, R.style.BriarDialogTheme);
|
this, R.style.BriarDialogTheme);
|
||||||
builder.setTitle(R.string.mailbox_status_unlink_no_wipe_title);
|
builder.setTitle(R.string.mailbox_status_unlink_no_wipe_title);
|
||||||
builder.setMessage(R.string.mailbox_status_unlink_no_wipe_message);
|
builder.setMessage(R.string.mailbox_status_unlink_no_wipe_message);
|
||||||
builder.setNeutralButton(R.string.got_it,
|
builder.setNeutralButton(R.string.got_it,
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ import android.widget.ImageView;
|
|||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.mailbox.MailboxStatus;
|
import org.briarproject.bramble.api.mailbox.MailboxStatus;
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.view.BriarButton;
|
import org.briarproject.briar.android.view.BriarButton;
|
||||||
@@ -214,8 +216,8 @@ public class MailboxStatusFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onUnlinkButtonClicked(boolean showWarning) {
|
private void onUnlinkButtonClicked(boolean showWarning) {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext(),
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
R.style.BriarDialogTheme);
|
requireContext(), R.style.BriarDialogTheme);
|
||||||
builder.setTitle(R.string.mailbox_status_unlink_dialog_title);
|
builder.setTitle(R.string.mailbox_status_unlink_dialog_title);
|
||||||
String msg = getString(R.string.mailbox_status_unlink_dialog_question);
|
String msg = getString(R.string.mailbox_status_unlink_dialog_question);
|
||||||
if (showWarning) {
|
if (showWarning) {
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ import static java.util.logging.Level.INFO;
|
|||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE;
|
import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE;
|
||||||
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
|
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
|
||||||
|
import static org.briarproject.bramble.util.AndroidUtils.registerReceiver;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logDuration;
|
import static org.briarproject.bramble.util.LogUtils.logDuration;
|
||||||
import static org.briarproject.bramble.util.LogUtils.now;
|
import static org.briarproject.bramble.util.LogUtils.now;
|
||||||
|
|
||||||
@@ -96,7 +97,8 @@ public class PluginViewModel extends DbViewModel implements EventListener {
|
|||||||
this.eventBus = eventBus;
|
this.eventBus = eventBus;
|
||||||
eventBus.addListener(this);
|
eventBus.addListener(this);
|
||||||
receiver = new BluetoothStateReceiver();
|
receiver = new BluetoothStateReceiver();
|
||||||
app.registerReceiver(receiver, new IntentFilter(ACTION_STATE_CHANGED));
|
registerReceiver(app, receiver, new IntentFilter(ACTION_STATE_CHANGED),
|
||||||
|
false);
|
||||||
networkStatus.setValue(networkManager.getNetworkStatus());
|
networkStatus.setValue(networkManager.getNetworkStatus());
|
||||||
torPluginState.setValue(getTransportState(TorConstants.ID));
|
torPluginState.setValue(getTransportState(TorConstants.ID));
|
||||||
wifiPluginState.setValue(getTransportState(LanTcpConstants.ID));
|
wifiPluginState.setValue(getTransportState(LanTcpConstants.ID));
|
||||||
|
|||||||
@@ -219,7 +219,8 @@ public class TransportsActivity extends BriarActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onClicked(TransportId transportId, boolean enable) {
|
private void onClicked(TransportId transportId, boolean enable) {
|
||||||
if (enable && SDK_INT >= 31 && !areBluetoothPermissionsGranted(this)) {
|
if (transportId.equals(BluetoothConstants.ID) && enable
|
||||||
|
&& SDK_INT >= 31 && !areBluetoothPermissionsGranted(this)) {
|
||||||
if (shouldShowRequestPermissionRationale(BLUETOOTH_CONNECT)) {
|
if (shouldShowRequestPermissionRationale(BLUETOOTH_CONNECT)) {
|
||||||
showRationale(this, R.string.permission_bluetooth_title,
|
showRationale(this, R.string.permission_bluetooth_title,
|
||||||
R.string.permission_bluetooth_body,
|
R.string.permission_bluetooth_body,
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import android.net.Uri;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -17,7 +19,6 @@ import java.util.logging.Logger;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.preference.ListPreference;
|
import androidx.preference.ListPreference;
|
||||||
import androidx.preference.PreferenceFragmentCompat;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
import androidx.preference.SwitchPreferenceCompat;
|
import androidx.preference.SwitchPreferenceCompat;
|
||||||
@@ -201,8 +202,8 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat
|
|||||||
getActivity().finish();
|
getActivity().finish();
|
||||||
};
|
};
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getContext(),
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
R.style.BriarDialogTheme);
|
requireContext(), R.style.BriarDialogTheme);
|
||||||
builder.setTitle(getString(R.string.dialog_title_connect_panic_app));
|
builder.setTitle(getString(R.string.dialog_title_connect_panic_app));
|
||||||
|
|
||||||
CharSequence app = getString(R.string.unknown_app);
|
CharSequence app = getString(R.string.unknown_app);
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import android.view.Menu;
|
|||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
import org.briarproject.briar.android.privategroup.creation.GroupInviteActivity;
|
import org.briarproject.briar.android.privategroup.creation.GroupInviteActivity;
|
||||||
@@ -20,7 +22,6 @@ import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
@@ -178,8 +179,8 @@ public class GroupActivity extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showLeaveGroupDialog() {
|
private void showLeaveGroupDialog() {
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
new AlertDialog.Builder(this, R.style.BriarDialogTheme);
|
this, R.style.BriarDialogTheme);
|
||||||
builder.setTitle(getString(R.string.groups_leave_dialog_title));
|
builder.setTitle(getString(R.string.groups_leave_dialog_title));
|
||||||
builder.setMessage(getString(R.string.groups_leave_dialog_message));
|
builder.setMessage(getString(R.string.groups_leave_dialog_message));
|
||||||
builder.setNegativeButton(R.string.dialog_button_leave,
|
builder.setNegativeButton(R.string.dialog_button_leave,
|
||||||
@@ -189,8 +190,8 @@ public class GroupActivity extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showDissolveGroupDialog() {
|
private void showDissolveGroupDialog() {
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
new AlertDialog.Builder(this, R.style.BriarDialogTheme);
|
this, R.style.BriarDialogTheme);
|
||||||
builder.setTitle(getString(R.string.groups_dissolve_dialog_title));
|
builder.setTitle(getString(R.string.groups_dissolve_dialog_title));
|
||||||
builder.setMessage(getString(R.string.groups_dissolve_dialog_message));
|
builder.setMessage(getString(R.string.groups_dissolve_dialog_message));
|
||||||
builder.setNegativeButton(R.string.groups_dissolve_button,
|
builder.setNegativeButton(R.string.groups_dissolve_button,
|
||||||
@@ -206,8 +207,8 @@ public class GroupActivity extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onGroupDissolved() {
|
private void onGroupDissolved() {
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(
|
||||||
new AlertDialog.Builder(this, R.style.BriarDialogTheme);
|
this, R.style.BriarDialogTheme);
|
||||||
builder.setTitle(getString(R.string.groups_dissolved_dialog_title));
|
builder.setTitle(getString(R.string.groups_dissolved_dialog_title));
|
||||||
builder.setMessage(getString(R.string.groups_dissolved_dialog_message));
|
builder.setMessage(getString(R.string.groups_dissolved_dialog_message));
|
||||||
builder.setNeutralButton(R.string.ok, null);
|
builder.setNeutralButton(R.string.ok, null);
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import android.view.View;
|
|||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.contact.ContactId;
|
import org.briarproject.bramble.api.contact.ContactId;
|
||||||
import org.briarproject.bramble.api.db.DbException;
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
import org.briarproject.bramble.api.sync.GroupId;
|
import org.briarproject.bramble.api.sync.GroupId;
|
||||||
@@ -26,7 +28,6 @@ import javax.annotation.Nullable;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.annotation.LayoutRes;
|
import androidx.annotation.LayoutRes;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
|
|
||||||
@MethodsNotNullByDefault
|
@MethodsNotNullByDefault
|
||||||
@ParametersNotNullByDefault
|
@ParametersNotNullByDefault
|
||||||
@@ -105,7 +106,8 @@ public class RevealContactsActivity extends ContactSelectorActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showOnboardingDialog() {
|
private void showOnboardingDialog() {
|
||||||
new AlertDialog.Builder(this, R.style.OnboardingDialogTheme)
|
new MaterialAlertDialogBuilder(this,
|
||||||
|
R.style.OnboardingDialogTheme)
|
||||||
.setMessage(getString(R.string.groups_reveal_dialog_message))
|
.setMessage(getString(R.string.groups_reveal_dialog_message))
|
||||||
.setNeutralButton(R.string.got_it,
|
.setNeutralButton(R.string.got_it,
|
||||||
(dialog, which) -> dialog.cancel())
|
(dialog, which) -> dialog.cancel())
|
||||||
|
|||||||
@@ -200,6 +200,7 @@ class BriarReportCollector {
|
|||||||
storageInfo);
|
storageInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint({"HardwareIds", "MissingPermission"})
|
||||||
private ReportItem getConnectivity() {
|
private ReportItem getConnectivity() {
|
||||||
MultiReportInfo connectivityInfo = new MultiReportInfo();
|
MultiReportInfo connectivityInfo = new MultiReportInfo();
|
||||||
|
|
||||||
@@ -282,13 +283,14 @@ class BriarReportCollector {
|
|||||||
connectivityInfo.add("BluetoothAvailable", true);
|
connectivityInfo.add("BluetoothAvailable", true);
|
||||||
|
|
||||||
// Is Bluetooth enabled?
|
// Is Bluetooth enabled?
|
||||||
@SuppressLint("HardwareIds")
|
boolean btEnabled = hasBtConnectPermission(ctx) && bt.isEnabled();
|
||||||
boolean btEnabled = hasBtConnectPermission(ctx) && bt.isEnabled()
|
try {
|
||||||
&& !isNullOrEmpty(bt.getAddress());
|
btEnabled = btEnabled && !isNullOrEmpty(bt.getAddress());
|
||||||
|
} catch (SecurityException ignored) {
|
||||||
|
}
|
||||||
connectivityInfo.add("BluetoothEnabled", btEnabled);
|
connectivityInfo.add("BluetoothEnabled", btEnabled);
|
||||||
|
|
||||||
// Is Bluetooth connectable?
|
// Is Bluetooth connectable?
|
||||||
@SuppressLint("MissingPermission")
|
|
||||||
int scanMode = areBluetoothPermissionsGranted(ctx) ?
|
int scanMode = areBluetoothPermissionsGranted(ctx) ?
|
||||||
bt.getScanMode() : -1;
|
bt.getScanMode() : -1;
|
||||||
boolean btConnectable = scanMode == SCAN_MODE_CONNECTABLE ||
|
boolean btConnectable = scanMode == SCAN_MODE_CONNECTABLE ||
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.briarproject.briar.android.reporting;
|
package org.briarproject.briar.android.reporting;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -87,6 +88,7 @@ public class CrashReportActivity extends BaseActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressLint("MissingSuperCall")
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import android.widget.ImageView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.activity.BaseActivity;
|
import org.briarproject.briar.android.activity.BaseActivity;
|
||||||
@@ -20,7 +21,6 @@ import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
@@ -86,7 +86,7 @@ public class ConfirmAvatarDialogFragment extends DialogFragment {
|
|||||||
);
|
);
|
||||||
|
|
||||||
int theme = R.style.BriarDialogTheme;
|
int theme = R.style.BriarDialogTheme;
|
||||||
return new AlertDialog.Builder(activity, theme)
|
return new MaterialAlertDialogBuilder(activity, theme)
|
||||||
.setView(view)
|
.setView(view)
|
||||||
.setTitle(R.string.dialog_confirm_profile_picture_title)
|
.setTitle(R.string.dialog_confirm_profile_picture_title)
|
||||||
.setNegativeButton(R.string.cancel, null)
|
.setNegativeButton(R.string.cancel, null)
|
||||||
|
|||||||
@@ -1,21 +1,19 @@
|
|||||||
package org.briarproject.briar.android.settings;
|
package org.briarproject.briar.android.settings;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.Localizer;
|
import org.briarproject.briar.android.Localizer;
|
||||||
import org.briarproject.briar.android.util.UiUtils;
|
import org.briarproject.briar.android.util.UiUtils;
|
||||||
import org.briarproject.nullsafety.NotNullByDefault;
|
import org.briarproject.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import androidx.core.text.TextUtilsCompat;
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.preference.ListPreference;
|
import androidx.preference.ListPreference;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
@@ -24,10 +22,7 @@ import androidx.preference.PreferenceFragmentCompat;
|
|||||||
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
|
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
|
||||||
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
||||||
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
||||||
import static android.os.Build.VERSION.SDK_INT;
|
|
||||||
import static androidx.core.view.ViewCompat.LAYOUT_DIRECTION_LTR;
|
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
import static java.util.logging.Logger.getLogger;
|
|
||||||
import static org.briarproject.briar.android.BriarApplication.ENTRY_ACTIVITY;
|
import static org.briarproject.briar.android.BriarApplication.ENTRY_ACTIVITY;
|
||||||
import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.SIGN_OUT_URI;
|
import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.SIGN_OUT_URI;
|
||||||
import static org.briarproject.briar.android.settings.SettingsActivity.EXTRA_THEME_CHANGE;
|
import static org.briarproject.briar.android.settings.SettingsActivity.EXTRA_THEME_CHANGE;
|
||||||
@@ -36,10 +31,7 @@ import static org.briarproject.briar.android.settings.SettingsActivity.EXTRA_THE
|
|||||||
public class DisplayFragment extends PreferenceFragmentCompat {
|
public class DisplayFragment extends PreferenceFragmentCompat {
|
||||||
|
|
||||||
public static final String PREF_LANGUAGE = "pref_key_language";
|
public static final String PREF_LANGUAGE = "pref_key_language";
|
||||||
private static final String PREF_THEME = "pref_key_theme";
|
public static final String PREF_THEME = "pref_key_theme";
|
||||||
|
|
||||||
private static final Logger LOG =
|
|
||||||
getLogger(DisplayFragment.class.getName());
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreatePreferences(Bundle bundle, String s) {
|
public void onCreatePreferences(Bundle bundle, String s) {
|
||||||
@@ -50,7 +42,6 @@ public class DisplayFragment extends PreferenceFragmentCompat {
|
|||||||
language.setOnPreferenceChangeListener(this::onLanguageChanged);
|
language.setOnPreferenceChangeListener(this::onLanguageChanged);
|
||||||
|
|
||||||
ListPreference theme = requireNonNull(findPreference(PREF_THEME));
|
ListPreference theme = requireNonNull(findPreference(PREF_THEME));
|
||||||
setThemeEntries(theme);
|
|
||||||
theme.setOnPreferenceChangeListener(this::onThemeChanged);
|
theme.setOnPreferenceChangeListener(this::onThemeChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,30 +82,6 @@ public class DisplayFragment extends PreferenceFragmentCompat {
|
|||||||
language.setEntryValues(entryValues.toArray(new CharSequence[0]));
|
language.setEntryValues(entryValues.toArray(new CharSequence[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isLeftToRight(Locale locale) {
|
|
||||||
// TextUtilsCompat returns the wrong direction for Hebrew on some phones
|
|
||||||
String language = locale.getLanguage();
|
|
||||||
if (language.equals("iw") || language.equals("he")) return false;
|
|
||||||
int direction = TextUtilsCompat.getLayoutDirectionFromLocale(locale);
|
|
||||||
return direction == LAYOUT_DIRECTION_LTR;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setThemeEntries(ListPreference theme) {
|
|
||||||
if (SDK_INT < 27) {
|
|
||||||
// remove System Default Theme option from preference entries
|
|
||||||
// as it is not functional on this API anyway
|
|
||||||
List<CharSequence> entries =
|
|
||||||
new ArrayList<>(Arrays.asList(theme.getEntries()));
|
|
||||||
entries.remove(getString(R.string.pref_theme_system));
|
|
||||||
theme.setEntries(entries.toArray(new CharSequence[0]));
|
|
||||||
// also remove corresponding value
|
|
||||||
List<CharSequence> values =
|
|
||||||
new ArrayList<>(Arrays.asList(theme.getEntryValues()));
|
|
||||||
values.remove(getString(R.string.pref_theme_system_value));
|
|
||||||
theme.setEntryValues(values.toArray(new CharSequence[0]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean onThemeChanged(Preference preference, Object newValue) {
|
private boolean onThemeChanged(Preference preference, Object newValue) {
|
||||||
// activate new theme
|
// activate new theme
|
||||||
FragmentActivity activity = requireActivity();
|
FragmentActivity activity = requireActivity();
|
||||||
@@ -135,8 +102,8 @@ public class DisplayFragment extends PreferenceFragmentCompat {
|
|||||||
private boolean onLanguageChanged(Preference preference, Object newValue) {
|
private boolean onLanguageChanged(Preference preference, Object newValue) {
|
||||||
ListPreference language = (ListPreference) preference;
|
ListPreference language = (ListPreference) preference;
|
||||||
if (!language.getValue().equals(newValue)) {
|
if (!language.getValue().equals(newValue)) {
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder =
|
||||||
new AlertDialog.Builder(getActivity());
|
new MaterialAlertDialogBuilder(requireContext());
|
||||||
builder.setTitle(R.string.pref_language_title);
|
builder.setTitle(R.string.pref_language_title);
|
||||||
builder.setMessage(R.string.pref_language_changed);
|
builder.setMessage(R.string.pref_language_changed);
|
||||||
builder.setPositiveButton(R.string.sign_out_button, (d, i) -> {
|
builder.setPositiveButton(R.string.sign_out_button, (d, i) -> {
|
||||||
|
|||||||
@@ -40,15 +40,12 @@ class TorSummaryProvider implements SummaryProvider<ListPreference> {
|
|||||||
String country = locationUtils.getCurrentCountry();
|
String country = locationUtils.getCurrentCountry();
|
||||||
String countryName = getCountryDisplayName(country);
|
String countryName = getCountryDisplayName(country);
|
||||||
|
|
||||||
boolean blocked =
|
boolean useBridgesByDefault =
|
||||||
circumventionProvider.isTorProbablyBlocked(country);
|
circumventionProvider.shouldUseBridges(country);
|
||||||
boolean useBridges = circumventionProvider.doBridgesWork(country);
|
|
||||||
String setting =
|
String setting =
|
||||||
ctx.getString(R.string.tor_network_setting_without_bridges);
|
ctx.getString(R.string.tor_network_setting_without_bridges);
|
||||||
if (blocked && useBridges) {
|
if (useBridgesByDefault) {
|
||||||
setting = ctx.getString(R.string.tor_network_setting_with_bridges);
|
setting = ctx.getString(R.string.tor_network_setting_with_bridges);
|
||||||
} else if (blocked) {
|
|
||||||
setting = ctx.getString(R.string.tor_network_setting_never);
|
|
||||||
}
|
}
|
||||||
return ctx.getString(R.string.tor_network_setting_summary, setting,
|
return ctx.getString(R.string.tor_network_setting_summary, setting,
|
||||||
countryName);
|
countryName);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user