diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 000000000..1925761f0
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,10 @@
+Folder-Description:
+===================
+* `briar-*`: Specifically for the Briar app (Phone/Desktop/Headless)
+* `bramble-*`: The protocol stack - not necessarily Briar-dependent
+
+---
+
+* `*-api`: public stuff that can be referenced from other packages and modules - mostly interfaces + a few utility classes
+* `*-core`: implementations of api that are portable across Android/Desktop/Headless
+* `*-java`: implementations of api that are specific to Desktop & Headless
diff --git a/bramble-core/build.gradle b/bramble-core/build.gradle
index 1d8e6eab5..631629342 100644
--- a/bramble-core/build.gradle
+++ b/bramble-core/build.gradle
@@ -16,7 +16,7 @@ dependencies {
implementation 'org.bitlet:weupnp:0.1.4'
implementation 'net.i2p.crypto:eddsa:0.2.0'
implementation 'org.whispersystems:curve25519-java:0.5.0'
- implementation 'org.briarproject:jtorctl:0.4'
+ implementation 'org.briarproject:jtorctl:0.5'
//noinspection GradleDependency
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
index a4a3f4530..1b51547a9 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
@@ -800,6 +800,13 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
}
}
+ @Override
+ public void controlConnectionClosed() {
+ if (state.isTorRunning()) {
+ throw new RuntimeException("Control connection closed");
+ }
+ }
+
private String removeSeverity(String msg) {
return msg.replaceFirst("[^ ]+ ", "");
}
diff --git a/bramble-core/witness.gradle b/bramble-core/witness.gradle
index 7689c5821..f1af7ac8f 100644
--- a/bramble-core/witness.gradle
+++ b/bramble-core/witness.gradle
@@ -35,7 +35,7 @@ dependencyVerification {
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
'org.bitlet:weupnp:0.1.4:weupnp-0.1.4.jar:88df7e6504929d00bdb832863761385c68ab92af945b04f0770b126270a444fb',
'org.bouncycastle:bcprov-jdk15to18:1.70:bcprov-jdk15to18-1.70.jar:7df4c54f29ce2dd616dc3b198ca4db3dfcc79e3cb397c084a0aff97b85c0bf38',
- 'org.briarproject:jtorctl:0.4:jtorctl-0.4.jar:4e61f59dc9f3984438a7151c4df8d7c1f83d5fb3eb8c151acfc794a8fef85a36',
+ 'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
'org.checkerframework:checker-compat-qual:2.5.3:checker-compat-qual-2.5.3.jar:d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d',
'org.checkerframework:checker-qual:2.5.2:checker-qual-2.5.2.jar:64b02691c8b9d4e7700f8ee2e742dce7ea2c6e81e662b7522c9ee3bf568c040a',
'org.codehaus.mojo.signature:java16:1.1:java16-1.1.signature:53799223a2c98dba2d0add810bed76315460df285c69e4f397ae6098f87dd619',
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/AboutFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/AboutFragment.java
new file mode 100644
index 000000000..8c6ce98f0
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/AboutFragment.java
@@ -0,0 +1,85 @@
+package org.briarproject.briar.android.settings;
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
+import org.briarproject.briar.BuildConfig;
+import org.briarproject.briar.R;
+
+
+import java.util.logging.Logger;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import static android.widget.Toast.LENGTH_LONG;
+import static java.util.logging.Level.WARNING;
+import static java.util.logging.Logger.getLogger;
+import static org.briarproject.bramble.util.LogUtils.logException;
+
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
+public class AboutFragment extends Fragment {
+
+ final static String TAG = AboutFragment.class.getName();
+ private static final Logger LOG = getLogger(TAG);
+
+ private TextView briarVersion;
+ private TextView briarWebsite;
+ private TextView briarSourceCode;
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater,
+ @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_about, container,
+ false);
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ requireActivity().setTitle(R.string.about_title);
+ briarVersion = requireActivity().findViewById(R.id.BriarVersion);
+ briarVersion.setText(
+ getString(R.string.briar_version, BuildConfig.VERSION_NAME));
+ briarWebsite = requireActivity().findViewById(R.id.BriarWebsite);
+ briarSourceCode = requireActivity().findViewById(R.id.BriarSourceCode);
+ briarWebsite.setOnClickListener(View -> {
+ String url = "https://briarproject.org/";
+ Intent i = new Intent(Intent.ACTION_VIEW);
+ i.setData(Uri.parse(url));
+ try {
+ startActivity(i);
+ } catch (ActivityNotFoundException e) {
+ logException(LOG, WARNING, e);
+ Toast.makeText(requireContext(),
+ R.string.error_start_activity, LENGTH_LONG).show();
+ }
+ });
+ briarSourceCode.setOnClickListener(View -> {
+ String url = "https://code.briarproject.org/briar/briar";
+ Intent i = new Intent(Intent.ACTION_VIEW);
+ i.setData(Uri.parse(url));
+ try {
+ startActivity(i);
+ } catch (ActivityNotFoundException e) {
+ logException(LOG, WARNING, e);
+ Toast.makeText(requireContext(),
+ R.string.error_start_activity, LENGTH_LONG).show();
+ }
+ });
+ }
+
+}
\ No newline at end of file
diff --git a/briar-android/src/main/res/drawable/ic_info_dark.xml b/briar-android/src/main/res/drawable/ic_info_dark.xml
new file mode 100644
index 000000000..aa955e9e5
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_info_dark.xml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/briar-android/src/main/res/layout/fragment_about.xml b/briar-android/src/main/res/layout/fragment_about.xml
new file mode 100644
index 000000000..87881bb00
--- /dev/null
+++ b/briar-android/src/main/res/layout/fragment_about.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index 496f3a183..1479fd4fe 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -691,6 +691,13 @@
Please come back to this screen when you have access to the device.
Please unlink your mailbox using the button below.\n\nAfter unlinking your old Mailbox, you can set up a new Mailbox at any time.
+
+ About
+ Briar Version: %s
+ Links
+ \u2022 Briar website
+ \u2022 Briar source code
+
Disappearing messages
Turning on this setting will make new
diff --git a/briar-android/src/main/res/xml/settings.xml b/briar-android/src/main/res/xml/settings.xml
index f968985ff..c25dced90 100644
--- a/briar-android/src/main/res/xml/settings.xml
+++ b/briar-android/src/main/res/xml/settings.xml
@@ -29,6 +29,11 @@
android:title="@string/mailbox_settings_title"
app:icon="@drawable/ic_mailbox" />
+
+