From b6b8b2180fc5d8743d617da0d5e845aa3cd2e90d Mon Sep 17 00:00:00 2001
From: Nico Alt <nicoalt@posteo.org>
Date: Thu, 19 Dec 2019 10:36:46 +0100
Subject: [PATCH] Switch to briar-wrapper as external dependecy

---
 .gitmodules                                 |  3 +
 README.md                                   | 29 ++-----
 app.briar.gtk.json                          | 68 +++++++++++++++
 python-briar-wrapper                        |  1 +
 requirements.txt                            |  3 +-
 src/briar/api/api.py                        | 94 ---------------------
 src/briar/api/constants.py                  | 20 -----
 src/briar/api/model.py                      | 15 ----
 src/briar/api/models/contacts.py            | 41 ---------
 src/briar/api/models/private_chat.py        | 42 ---------
 src/briar/api/models/socket_listener.py     | 44 ----------
 src/briar/gtk/application.py                |  2 +-
 src/briar/gtk/containers/add_contact.py     |  2 +-
 src/briar/gtk/containers/chat.py            |  2 +-
 src/briar/gtk/containers/main.py            |  2 +-
 src/meson.build                             |  1 -
 tests/briar/api/models/test_contacts.py     | 51 -----------
 tests/briar/api/models/test_private_chat.py | 39 ---------
 tests/briar/api/test_constants.py           | 32 -------
 tests/briar/gtk/test_application.py         |  6 +-
 tools/copy-db-from-android.sh               | 21 -----
 tools/release-briar-headless.sh             | 19 -----
 22 files changed, 85 insertions(+), 452 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 python-briar-wrapper
 delete mode 100644 src/briar/api/api.py
 delete mode 100644 src/briar/api/constants.py
 delete mode 100644 src/briar/api/model.py
 delete mode 100644 src/briar/api/models/contacts.py
 delete mode 100644 src/briar/api/models/private_chat.py
 delete mode 100644 src/briar/api/models/socket_listener.py
 delete mode 100644 tests/briar/api/models/test_contacts.py
 delete mode 100644 tests/briar/api/models/test_private_chat.py
 delete mode 100644 tests/briar/api/test_constants.py
 delete mode 100755 tools/copy-db-from-android.sh
 delete mode 100755 tools/release-briar-headless.sh

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..2c0164f
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "python-briar-wrapper"]
+	path = python-briar-wrapper
+	url = https://code.briarproject.org/briar/python-briar-wrapper.git
diff --git a/README.md b/README.md
index 70d5e58..0379d86 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,9 @@ Once you've done this, change the path of the Briar headless
 jar in [src/briar/gtk/define.py](src/briar/gtk/define.py),
 build it with _meson_ and start Briar GTK.
 
+Don't forget to initialize the python-briar-wrapper submodule:
+`git submodule update --init`
+
 ## Design Goals
 
 * Intuitive UI, similar to Briar Android client
@@ -49,30 +52,8 @@ build it with _meson_ and start Briar GTK.
 
 ## FAQ
 
-### I forgot my password.
-
-In case you forgot your password, there's no other way than to delete your old
-account and start from scratch. Call `rm -rf ~/.briar/` to delete your current
-account.
-
-### How can I transfer contacts from my Android device?
-
-By using [_adb_](https://developer.android.com/studio/command-line/adb),
-you can copy the database and keys from a Briar Android installation.
-Note that your smartphone needs to be rooted for this.
-
-You can either use the script at 
-[tools/copy-db-from-android.sh](tools/copy-db-from-android.sh) or do it manually:
-
-1. Start _briar-gtk_ and register a dummy account. This will create
-the needed directory structure at _~/.briar/_. Close the program afterwards.
-2. Enable _adb_ on your smartphone and give it root permissions.
-3. Connect via _adb_ and gain root permissions using `adb root`.
-4. Copy all important files using `adb pull`:
-_/data/data/org.briarproject.briar.android/app_db/db.mv.db_,
-_/data/data/org.briarproject.briar.android/app_key/db.key_,
-_/data/data/org.briarproject.briar.android/app_key/db.key.bak_
-5. Replace the respecting files in _~/.briar/db_ and _~/.briar/key_.
+Take a look at
+[the FAQ of python-briar-wrapper](https://code.briarproject.org/briar/python-briar-wrapper/blob/master/README.md#faq).
 
 ## License
 
diff --git a/app.briar.gtk.json b/app.briar.gtk.json
index 343bb08..35411ad 100644
--- a/app.briar.gtk.json
+++ b/app.briar.gtk.json
@@ -99,6 +99,74 @@
                 }
             ]
         },
+        {
+	    "name": "python3-flit",
+	    "buildsystem": "simple",
+	    "build-commands": [
+		"pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} flit"
+	    ],
+	    "sources": [
+		{
+		    "type": "file",
+		    "url": "https://files.pythonhosted.org/packages/22/cd/a6aa959dca619918ccb55023b4cb151949c64d4d5d55b3f4ffd7eee0c6e8/docutils-0.15.2-py3-none-any.whl",
+		    "sha256": "6c4f696463b79f1fb8ba0c594b63840ebd41f059e92b31957c46b74a4599b6d0"
+		},
+		{
+		    "type": "file",
+		    "url": "https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl",
+		    "sha256": "fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
+		},
+		{
+		    "type": "file",
+		    "url": "https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl",
+		    "sha256": "9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"
+		},
+		{
+		    "type": "file",
+		    "url": "https://files.pythonhosted.org/packages/b9/63/df50cac98ea0d5b006c55a399c3bf1db9da7b5a24de7890bc9cfd5dd9e99/certifi-2019.11.28-py2.py3-none-any.whl",
+		    "sha256": "017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3"
+		},
+		{
+		    "type": "file",
+		    "url": "https://files.pythonhosted.org/packages/a5/47/c7f8a0f210ad18576840922e0b504f0b7f5f73aea4a52ab14c5b58517edf/pytoml-0.1.21-py2.py3-none-any.whl",
+		    "sha256": "57a21e6347049f73bfb62011ff34cd72774c031b9828cb628a752225136dfc33"
+		},
+		{
+		    "type": "file",
+		    "url": "https://files.pythonhosted.org/packages/b4/40/a9837291310ee1ccc242ceb6ebfd9eb21539649f193a7c8c86ba15b98539/urllib3-1.25.7-py2.py3-none-any.whl",
+		    "sha256": "a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293"
+		},
+		{
+		    "type": "file",
+		    "url": "https://files.pythonhosted.org/packages/8f/7c/00228e4b1c1a4d118f71157063f35f6dad3150b1a10aca99517ec347726d/flit-2.1.0-py3-none-any.whl",
+		    "sha256": "494e0806840fe896fe31ce2a413583115324f12177ecaf7427f157caa9b9c5b2"
+		},
+		{
+		    "type": "file",
+		    "url": "https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl",
+		    "sha256": "ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
+		},
+		{
+		    "type": "file",
+		    "url": "https://files.pythonhosted.org/packages/b6/b0/50719ef7d12cd39ccfa4e48abb593764c8e4a6d0d9bdf7815be1949142ff/flit_core-2.1.0-py2.py3-none-any.whl",
+		    "sha256": "c6dff661e9e290d51084cefc38b0971d692290e8a352d0b6cec6006be764b4d1"
+		}
+	    ]
+	},
+        {
+            "name": "briar-wrapper",
+            "buildsystem": "simple",
+            "build-commands": [
+                "PIP_PREFIX=${FLATPAK_DEST} flit install --env",
+            	"pip3 uninstall -y flit"
+            ],
+            "sources": [
+                {
+                    "type": "dir",
+                    "path": "python-briar-wrapper"
+                }
+            ]
+        },
         {
             "name": "briar-gtk",
             "buildsystem": "meson",
diff --git a/python-briar-wrapper b/python-briar-wrapper
new file mode 160000
index 0000000..3250571
--- /dev/null
+++ b/python-briar-wrapper
@@ -0,0 +1 @@
+Subproject commit 3250571844cab074babf4532fcfb6b9876a21f66
diff --git a/requirements.txt b/requirements.txt
index c2a5174..0d8b2b9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,5 +2,4 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 # License-Filename: LICENSE.md
 
-requests2>=2.16.0
-websockets>=8.0.2
+briar-wrapper>=0.0.2
diff --git a/src/briar/api/api.py b/src/briar/api/api.py
deleted file mode 100644
index cf83576..0000000
--- a/src/briar/api/api.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-from os.path import isfile
-from subprocess import Popen, PIPE, STDOUT
-from threading import Thread
-from time import sleep
-from urllib.error import HTTPError, URLError
-from urllib.request import urlopen
-
-from briar.api.constants import BASE_HTTP_URL, BRIAR_AUTH_TOKEN, BRIAR_DB
-from briar.api.models.socket_listener import SocketListener
-
-
-class Api:
-
-    auth_token = None
-    socket_listener = None
-
-    _process = None
-
-    def __init__(self, headless_jar):
-        self._command = ["java", "-jar", headless_jar]
-
-        self.socket_listener = SocketListener(self)
-
-    @staticmethod
-    def has_account():
-        return isfile(BRIAR_DB)
-
-    def is_running(self):
-        return (self._process is not None) and (self._process.poll() is None)
-
-    def login(self, password, callback):
-        self._start_and_watch(callback)
-        startup_thread = Thread(target=self._login, args=(password,),
-                                daemon=True)
-        startup_thread.start()
-
-    def register(self, credentials, callback):
-        if len(credentials) != 2:
-            raise Exception("Can't process credentials")
-        self._start_and_watch(callback)
-        startup_thread = Thread(target=self._register, args=(credentials,),
-                                daemon=True)
-        startup_thread.start()
-
-    def stop(self):
-        if not self.is_running():
-            raise Exception("Nothing to stop")
-        self._process.terminate()
-
-    def _start_and_watch(self, callback):
-        if self.is_running():
-            raise Exception("API already running")
-        self._process = Popen(self._command, stdin=PIPE,
-                              stdout=PIPE, stderr=STDOUT)
-        watch_thread = Thread(target=self._watch_thread, args=(callback,),
-                              daemon=True)
-        watch_thread.start()
-
-    def _watch_thread(self, callback):
-        while self.is_running():
-            try:
-                urlopen(BASE_HTTP_URL)
-                sleep(0.1)
-            except HTTPError as http_error:
-                if http_error.code == 404:
-                    self._load_auth_token()
-                    callback(True)
-                    return
-            except URLError as url_error:
-                if not isinstance(url_error.reason, ConnectionRefusedError):
-                    raise url_error
-        callback(False)
-
-    def _login(self, password):
-        if not self.is_running():
-            raise Exception("Can't login; API not running")
-        self._process.communicate(("%s\n" % password).encode("utf-8"))
-
-    def _register(self, credentials):
-        if not self.is_running():
-            raise Exception("Can't register; API not running")
-        self._process.communicate((credentials[0] + '\n' +
-                                   credentials[1] + '\n' +
-                                   credentials[1] + '\n').encode("utf-8"))
-
-    def _load_auth_token(self):
-        if not Api.has_account():
-            raise Exception("Can't load authentication token")
-        with open(BRIAR_AUTH_TOKEN, 'r') as file:
-            self.auth_token = file.read()
diff --git a/src/briar/api/constants.py b/src/briar/api/constants.py
deleted file mode 100644
index 34dd83f..0000000
--- a/src/briar/api/constants.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-from os.path import join
-from pathlib import Path
-from urllib.parse import urljoin
-
-_BRIAR_DIR_NAME = ".briar"
-_HOME = str(Path.home())
-_BRIAR_DIR = join(_HOME, _BRIAR_DIR_NAME)
-
-_HOST = "%s://localhost:7000"
-_VERSION_SUFFIX = "v1/"
-
-BRIAR_AUTH_TOKEN = join(_BRIAR_DIR, "auth_token")
-BRIAR_DB = join(_BRIAR_DIR, "db", "db.mv.db")
-
-BASE_HTTP_URL = urljoin(_HOST % "http", _VERSION_SUFFIX)
-WEBSOCKET_URL = urljoin(_HOST % "ws", "%s/ws" % _VERSION_SUFFIX)
diff --git a/src/briar/api/model.py b/src/briar/api/model.py
deleted file mode 100644
index f432c2b..0000000
--- a/src/briar/api/model.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-
-class Model:  # pylint: disable=too-few-public-methods
-
-    _headers = {}
-
-    def __init__(self, api):
-        self._api = api
-        self._initialize_headers()
-
-    def _initialize_headers(self):
-        self._headers["Authorization"] = "Bearer %s" % self._api.auth_token
diff --git a/src/briar/api/models/contacts.py b/src/briar/api/models/contacts.py
deleted file mode 100644
index 6d4f6cf..0000000
--- a/src/briar/api/models/contacts.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-from urllib.parse import urljoin
-
-from requests import get as _get
-from requests import post as _post
-
-from briar.api.constants import BASE_HTTP_URL
-from briar.api.model import Model
-
-
-class Contacts(Model):
-
-    API_ENDPOINT = "contacts/"
-
-    _on_contact_added_callback = None
-
-    def add_pending(self, link, alias):
-        url = urljoin(BASE_HTTP_URL, self.API_ENDPOINT + "add/" + "pending/")
-        _post(url, headers=self._headers, json={"link": link, "alias": alias})
-
-    def get(self):
-        url = urljoin(BASE_HTTP_URL, self.API_ENDPOINT)
-        request = _get(url, headers=self._headers)
-        return request.json()
-
-    def get_link(self):
-        url = urljoin(BASE_HTTP_URL, self.API_ENDPOINT + "add/" + "link/")
-        request = _get(url, headers=self._headers).json()
-        return request['link']
-
-    def watch_contacts(self, callback):
-        self._on_contact_added_callback = callback
-        self._api.socket_listener.watch("ContactAddedEvent",
-                                        self._on_contact_added)
-
-    # pylint: disable=unused-argument
-    def _on_contact_added(self, event):
-        self._on_contact_added_callback()
diff --git a/src/briar/api/models/private_chat.py b/src/briar/api/models/private_chat.py
deleted file mode 100644
index 09e42af..0000000
--- a/src/briar/api/models/private_chat.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-from urllib.parse import urljoin
-
-from requests import get as _get
-from requests import post as _post
-
-from briar.api.constants import BASE_HTTP_URL
-from briar.api.model import Model
-
-
-class PrivateChat(Model):
-
-    API_ENDPOINT = "messages/"
-
-    _contact_id = 0
-    _on_message_received_callback = None
-
-    def __init__(self, api, contact_id):
-        super().__init__(api)
-        self._contact_id = contact_id
-
-    def get(self):
-        url = urljoin(BASE_HTTP_URL,
-                      self.API_ENDPOINT + "/%d" % self._contact_id)
-        request = _get(url, headers=self._headers)
-        return request.json()
-
-    def watch_messages(self, callback):
-        self._on_message_received_callback = callback
-        self._api.socket_listener.watch("ConversationMessageReceivedEvent",
-                                        self._on_message_received)
-
-    def _on_message_received(self, event):
-        self._on_message_received_callback(event['data'])
-
-    def send(self, message):
-        url = urljoin(BASE_HTTP_URL,
-                      self.API_ENDPOINT + "/%i" % self._contact_id)
-        _post(url, headers=self._headers, json={"text": message})
diff --git a/src/briar/api/models/socket_listener.py b/src/briar/api/models/socket_listener.py
deleted file mode 100644
index c5b39ee..0000000
--- a/src/briar/api/models/socket_listener.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-import asyncio
-import json
-from threading import Thread
-
-import websockets
-
-from briar.api.constants import WEBSOCKET_URL
-from briar.api.model import Model
-
-
-class SocketListener(Model):  # pylint: disable=too-few-public-methods
-
-    def watch(self, event, callback):
-        websocket_thread = Thread(target=self._start_watch_loop,
-                                  args=(event, callback),
-                                  daemon=True)
-        websocket_thread.start()
-
-    def _start_watch_loop(self, event, callback):
-        loop = asyncio.new_event_loop()
-        asyncio.set_event_loop(loop)
-        loop.create_task(self._start_websocket(event, callback))
-        loop.run_forever()
-        loop.close()
-
-    async def _start_websocket(self, event, callback):
-        async with websockets.connect(WEBSOCKET_URL) as websocket:
-            await websocket.send(self._api.auth_token)
-            await self._watch_messages(websocket, event, callback)
-
-    async def _watch_messages(self, websocket, event, callback):
-        while not websocket.closed and not\
-                asyncio.get_event_loop().is_closed():
-            message_json = await websocket.recv()
-            message = json.loads(message_json)
-            if message['name'] == event:
-                callback(message)
-        if not asyncio.get_event_loop().is_closed():
-            asyncio.get_event_loop().create_task(
-                self._watch_messages(websocket, event, callback))
diff --git a/src/briar/gtk/application.py b/src/briar/gtk/application.py
index 6aa73db..c834d0f 100644
--- a/src/briar/gtk/application.py
+++ b/src/briar/gtk/application.py
@@ -8,7 +8,7 @@
 
 from gi.repository import Gdk, Gio, GLib, Gtk
 
-from briar.api.api import Api
+from briar_wrapper.api import Api
 
 from briar.gtk.define import APPLICATION_ID, APPLICATION_NAME
 from briar.gtk.define import APPLICATION_STYLING_PATH, BRIAR_HEADLESS_JAR
diff --git a/src/briar/gtk/containers/add_contact.py b/src/briar/gtk/containers/add_contact.py
index f0a946a..080bce1 100644
--- a/src/briar/gtk/containers/add_contact.py
+++ b/src/briar/gtk/containers/add_contact.py
@@ -6,7 +6,7 @@ from gettext import gettext as _
 
 from gi.repository import GLib
 
-from briar.api.models.contacts import Contacts
+from briar_wrapper.models.contacts import Contacts
 from briar.gtk.container import Container
 from briar.gtk.define import APP
 
diff --git a/src/briar/gtk/containers/chat.py b/src/briar/gtk/containers/chat.py
index b2e00b0..52ce9a8 100644
--- a/src/briar/gtk/containers/chat.py
+++ b/src/briar/gtk/containers/chat.py
@@ -4,7 +4,7 @@
 
 from gi.repository import GLib, Gtk
 
-from briar.api.models.private_chat import PrivateChat
+from briar_wrapper.models.private_chat import PrivateChat
 from briar.gtk.container import Container
 from briar.gtk.define import APP
 
diff --git a/src/briar/gtk/containers/main.py b/src/briar/gtk/containers/main.py
index e6b03e0..66df9c5 100644
--- a/src/briar/gtk/containers/main.py
+++ b/src/briar/gtk/containers/main.py
@@ -4,7 +4,7 @@
 
 from gi.repository import GLib, Gtk
 
-from briar.api.models.contacts import Contacts
+from briar_wrapper.models.contacts import Contacts
 from briar.gtk.container import Container
 from briar.gtk.define import APP
 
diff --git a/src/meson.build b/src/meson.build
index 744ca3a..5ee9da6 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -21,5 +21,4 @@ configure_file(
   install_dir: get_option('bindir')
 )
 
-install_subdir('briar/api', install_dir: MODULE_DIR)
 install_subdir('briar/gtk', install_dir: MODULE_DIR)
diff --git a/tests/briar/api/models/test_contacts.py b/tests/briar/api/models/test_contacts.py
deleted file mode 100644
index 988a632..0000000
--- a/tests/briar/api/models/test_contacts.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-import json
-
-import requests_mock
-
-from briar.api.models.contacts import Contacts
-
-BASE_HTTP_URL = "http://localhost:7000/v1/contacts/"
-
-TEST_LINK = "briar://wvui4uvhbfv4tzo6xwngknebsxrafainnhldyfj63x6ipp4q2vigy"
-TEST_ALIAS = "Alice"
-
-
-@requests_mock.Mocker(kw="requests_mock")
-def test_add_pending(api, request_headers, requests_mock):
-    contacts = Contacts(api)
-
-    requests_mock.register_uri("POST",
-                               BASE_HTTP_URL + "add/pending/",
-                               request_headers=request_headers,
-                               additional_matcher=match_request_add_pending)
-    contacts.add_pending(TEST_LINK, TEST_ALIAS)
-
-
-@requests_mock.Mocker(kw='requests_mock')
-def test_get_empty(api, request_headers, requests_mock):
-    contacts = Contacts(api)
-    response = []
-
-    requests_mock.register_uri("GET", BASE_HTTP_URL,
-                               request_headers=request_headers,
-                               text=json.dumps(response))
-    assert contacts.get() == response
-
-
-@requests_mock.Mocker(kw='requests_mock')
-def test_get_link(api, request_headers, requests_mock):
-    contacts = Contacts(api)
-    response = {"link": TEST_LINK}
-
-    requests_mock.register_uri("GET", BASE_HTTP_URL + "add/link/",
-                               request_headers=request_headers,
-                               text=json.dumps(response))
-    assert contacts.get_link() == TEST_LINK
-
-
-def match_request_add_pending(request):
-    return {"alias": TEST_ALIAS, "link": TEST_LINK} == request.json()
diff --git a/tests/briar/api/models/test_private_chat.py b/tests/briar/api/models/test_private_chat.py
deleted file mode 100644
index 60222f5..0000000
--- a/tests/briar/api/models/test_private_chat.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-import json
-
-import requests_mock
-
-from briar.api.models.private_chat import PrivateChat
-
-BASE_HTTP_URL = "http://localhost:7000/v1/messages/%s"
-
-TEST_CONTACT_ID = 42
-TEST_TEXT = "Hello World"
-
-
-@requests_mock.Mocker(kw="requests_mock")
-def test_get_empty(api, request_headers, requests_mock):
-    private_chat = PrivateChat(api, TEST_CONTACT_ID)
-    url = BASE_HTTP_URL % TEST_CONTACT_ID
-    response = []
-
-    requests_mock.register_uri("GET", url, request_headers=request_headers,
-                               text=json.dumps(response))
-    assert private_chat.get() == response
-
-
-@requests_mock.Mocker(kw="requests_mock")
-def test_send_message(api, request_headers, requests_mock):
-    private_chat = PrivateChat(api, TEST_CONTACT_ID)
-    url = BASE_HTTP_URL % TEST_CONTACT_ID
-
-    requests_mock.register_uri("POST", url, request_headers=request_headers,
-                               additional_matcher=match_request_send_message)
-    private_chat.send(TEST_TEXT)
-
-
-def match_request_send_message(request):
-    return {"text": TEST_TEXT} == request.json()
diff --git a/tests/briar/api/test_constants.py b/tests/briar/api/test_constants.py
deleted file mode 100644
index 45376bc..0000000
--- a/tests/briar/api/test_constants.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-from os.path import join
-from pathlib import Path
-
-import pytest
-
-from briar.api.constants import BASE_HTTP_URL, BRIAR_AUTH_TOKEN
-from briar.api.constants import BRIAR_DB, WEBSOCKET_URL
-
-
-def test_base_http_url():
-    assert BASE_HTTP_URL == "http://localhost:7000/v1/"
-
-
-def test_briar_auth_token(briar_dir):
-    assert BRIAR_AUTH_TOKEN == join(briar_dir, "auth_token")
-
-
-def test_briar_db(briar_dir):
-    assert BRIAR_DB == join(briar_dir, "db", "db.mv.db")
-
-
-def test_websocket_url():
-    assert WEBSOCKET_URL == "ws://localhost:7000/v1/ws"
-
-
-@pytest.fixture
-def briar_dir():
-    return join(str(Path.home()), ".briar")
diff --git a/tests/briar/gtk/test_application.py b/tests/briar/gtk/test_application.py
index f3c375f..a86f3f2 100644
--- a/tests/briar/gtk/test_application.py
+++ b/tests/briar/gtk/test_application.py
@@ -4,7 +4,7 @@
 
 from unittest.mock import Mock
 
-from briar.api.api import Api
+from briar_wrapper.api import Api
 from briar.gtk.application import Application
 from briar.gtk.define import APPLICATION_NAME, APPLICATION_STYLING_PATH
 from briar.gtk.define import BRIAR_HEADLESS_JAR
@@ -35,8 +35,8 @@ def test_do_activate(mocker):
 
 
 def test_quit(mocker):
-    api_mock = mocker.patch("briar.api.api.Api")
-    api_stop_mock = mocker.patch("briar.api.api.Api.stop")
+    api_mock = mocker.patch("briar_wrapper.api.Api")
+    api_stop_mock = mocker.patch("briar_wrapper.api.Api.stop")
     window_mock = mocker.patch("briar.gtk.window.Window")
     window_hide_mock = mocker.patch("briar.gtk.window.Window.hide")
     quit_mock = mocker.patch("gi.repository.Gio.Application.quit")
diff --git a/tools/copy-db-from-android.sh b/tools/copy-db-from-android.sh
deleted file mode 100755
index 1056cfe..0000000
--- a/tools/copy-db-from-android.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env bash
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-# Script to copy Briar database from Android to Linux devices.
-# Note that you must have started Briar GTK beforehand.
-# It's also recommend to manually start adb before using this script.
-
-set -e -x
-
-# List devices
-adb devices
-
-# Switch to root mode
-adb root
-
-# Copy files
-adb pull /data/data/org.briarproject.briar.android/app_db/db.mv.db ~/.briar/db/
-adb pull /data/data/org.briarproject.briar.android/app_key/db.key ~/.briar/key/
-adb pull /data/data/org.briarproject.briar.android/app_key/db.key.bak ~/.briar/key/
diff --git a/tools/release-briar-headless.sh b/tools/release-briar-headless.sh
deleted file mode 100755
index 650ec7a..0000000
--- a/tools/release-briar-headless.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-# Copyright (c) 2019 Nico Alt
-# SPDX-License-Identifier: AGPL-3.0-only
-# License-Filename: LICENSE.md
-
-set -e -x
-
-cd ../briar-android
-
-./gradlew --configure-on-demand briar-headless:jar
-
-cd briar-headless/build/libs
-
-sha256sum briar-headless.jar > sha256sum.txt
-git log | head -n 1 > commit.txt
-
-echo "To sign, call 'for file in \$(ls); do gpg -b \"\$file\"; done'"
-
-xdg-open .
-- 
GitLab