From 1be400eb84c5dcff00bc5df1e7af5e20d991cfb4 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Thu, 3 Mar 2016 10:24:40 +0100 Subject: [PATCH 01/13] Switched Roboguice/Guice out for Dagger 2 --- briar-android-tests/.gitignore | 5 + briar-android-tests/build.gradle | 39 +++++ briar-android-tests/proguard-rules.pro | 17 ++ .../briar_android_tests/ApplicationTest.java | 13 ++ .../src/main/AndroidManifest.xml | 12 ++ .../src/main/res/values/strings.xml | 3 + .../protocol}/ProtocolIntegrationTest.java | 60 ++++--- .../protocol/ProtocolTestComponent.java | 26 +++ .../briarproject/sync/ConstantsComponent.java | 28 ++++ .../org/briarproject/sync/ConstantsTest.java | 56 +++---- .../sync/SimplexMessagingComponent.java | 54 +++++++ .../sync/SimplexMessagingIntegrationTest.java | 133 ++++++--------- briar-android/build.gradle | 9 +- briar-android/proguard-rules.txt | 7 +- .../identicons/AsymmetricIdenticon.java | 5 +- .../identicons/SymmetricIdenticon.java | 5 +- .../android/AndroidComponent.java | 70 ++++++++ .../briarproject/android/AndroidModule.java | 46 ++++-- .../org/briarproject/android/AppModule.java | 25 +++ .../briarproject/android/BaseActivity.java | 108 +------------ .../briarproject/android/BriarActivity.java | 14 +- .../android/BriarApplication.java | 11 ++ .../briarproject/android/BriarService.java | 15 +- .../android/NavDrawerActivity.java | 46 +++--- .../android/PasswordActivity.java | 17 +- .../briarproject/android/SetupActivity.java | 48 ++++-- .../android/SplashScreenActivity.java | 61 +++---- .../android/StartupFailureActivity.java | 5 + .../briarproject/android/TestingActivity.java | 11 +- .../android/contact/ContactListFragment.java | 22 ++- .../android/contact/ConversationActivity.java | 22 ++- .../forum/AvailableForumsActivity.java | 12 +- .../android/forum/CreateForumActivity.java | 8 +- .../android/forum/ForumActivity.java | 12 +- .../android/forum/ForumListFragment.java | 10 +- .../android/forum/ReadForumPostActivity.java | 8 +- .../android/forum/ShareForumActivity.java | 10 +- .../android/forum/WriteForumPostActivity.java | 16 +- .../android/fragment/BaseFragment.java | 23 ++- .../android/fragment/DashboardFragment.java | 13 +- .../identity/CreateIdentityActivity.java | 14 +- .../invitation/AddContactActivity.java | 14 +- .../invitation/ChooseIdentityView.java | 7 +- .../android/panic/ExitActivity.java | 6 + .../panic/PanicPreferencesActivity.java | 6 + .../android/panic/PanicResponderActivity.java | 16 +- .../briarproject/android/util/AuthorView.java | 4 +- .../plugins/AndroidPluginsModule.java | 5 +- .../system/AndroidLocationUtils.java | 4 +- .../system/AndroidSystemModule.java | 33 +++- briar-api/build.gradle | 14 +- .../api/crypto/CryptoExecutor.java | 14 +- .../briarproject/api/db/DatabaseExecutor.java | 4 +- .../api/lifecycle/IoExecutor.java | 4 +- .../contact/ContactManagerImpl.java | 17 +- .../briarproject/contact/ContactModule.java | 18 ++- .../org/briarproject/crypto/CryptoModule.java | 56 +++++-- .../src/org/briarproject/data/DataModule.java | 32 +++- .../org/briarproject/db/DatabaseModule.java | 24 +-- .../org/briarproject/event/EventModule.java | 16 +- .../briarproject/forum/ForumManagerImpl.java | 153 +++++++++++++----- .../org/briarproject/forum/ForumModule.java | 72 ++++++--- .../forum/ForumSharingManagerImpl.java | 8 +- .../identity/IdentityManagerImpl.java | 16 +- .../briarproject/identity/IdentityModule.java | 25 ++- .../invitation/InvitationModule.java | 37 ++++- .../lifecycle/LifecycleModule.java | 32 ++-- .../messaging/MessagingManagerImpl.java | 130 +++++++++++---- .../messaging/MessagingModule.java | 32 ++-- .../plugins/ConnectionRegistryImpl.java | 4 +- .../briarproject/plugins/PluginsModule.java | 62 ++++--- .../properties/PropertiesModule.java | 21 ++- .../TransportPropertyManagerImpl.java | 147 +++++++++++------ .../reliability/ReliabilityModule.java | 28 +++- .../settings/SettingsManagerImpl.java | 3 +- .../briarproject/settings/SettingsModule.java | 16 +- .../briarproject/sync/MessageFactoryImpl.java | 3 +- .../src/org/briarproject/sync/SyncModule.java | 78 +++++++-- .../sync/ValidationManagerImpl.java | 4 +- .../transport/TransportModule.java | 28 ++-- .../lifecycle/DesktopLifecycleModule.java | 4 +- .../plugins/DesktopPluginsModule.java | 6 +- .../system/DesktopSystemModule.java | 7 +- briar-tests/build.gradle | 1 - .../org/briarproject/TestDatabaseModule.java | 14 +- .../org/briarproject/TestLifecycleModule.java | 67 +++++--- .../org/briarproject/TestSystemModule.java | 25 ++- build.gradle | 4 + settings.gradle | 2 +- 89 files changed, 1640 insertions(+), 802 deletions(-) create mode 100644 briar-android-tests/.gitignore create mode 100644 briar-android-tests/build.gradle create mode 100644 briar-android-tests/proguard-rules.pro create mode 100644 briar-android-tests/src/androidTest/java/com/ymirmobile/briar_android_tests/ApplicationTest.java create mode 100644 briar-android-tests/src/main/AndroidManifest.xml create mode 100644 briar-android-tests/src/main/res/values/strings.xml rename {briar-tests/src/org/briarproject => briar-android-tests/src/test/java/org/briarproject/protocol}/ProtocolIntegrationTest.java (79%) create mode 100644 briar-android-tests/src/test/java/org/briarproject/protocol/ProtocolTestComponent.java create mode 100644 briar-android-tests/src/test/java/org/briarproject/sync/ConstantsComponent.java rename {briar-tests/src => briar-android-tests/src/test/java}/org/briarproject/sync/ConstantsTest.java (76%) create mode 100644 briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java rename {briar-tests/src => briar-android-tests/src/test/java}/org/briarproject/sync/SimplexMessagingIntegrationTest.java (66%) create mode 100644 briar-android/src/org/briarproject/android/AndroidComponent.java create mode 100644 briar-android/src/org/briarproject/android/AppModule.java diff --git a/briar-android-tests/.gitignore b/briar-android-tests/.gitignore new file mode 100644 index 000000000..216c35063 --- /dev/null +++ b/briar-android-tests/.gitignore @@ -0,0 +1,5 @@ +bin +gen +build +local.properties +.settings diff --git a/briar-android-tests/build.gradle b/briar-android-tests/build.gradle new file mode 100644 index 000000000..858711df4 --- /dev/null +++ b/briar-android-tests/build.gradle @@ -0,0 +1,39 @@ +apply plugin: 'com.android.library' +sourceCompatibility = 1.6 +targetCompatibility = 1.6 +apply plugin: 'witness' +apply plugin: 'com.neenbedankt.android-apt' + +repositories { + maven { url 'http://repo1.maven.org/maven2' } +} + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.2" + + defaultConfig { + minSdkVersion 10 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile project(':briar-api') + compile project(':briar-core') + testCompile 'junit:junit:4.12' + compile 'com.android.support:appcompat-v7:23.2.0' + testApt 'com.google.dagger:dagger-compiler:2.0.2' + provided 'javax.annotation:jsr250-api:1.0' + compile 'cglib:cglib-nodep:3.1' + testCompile project(':briar-tests') +} diff --git a/briar-android-tests/proguard-rules.pro b/briar-android-tests/proguard-rules.pro new file mode 100644 index 000000000..2106d3d2c --- /dev/null +++ b/briar-android-tests/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/ernir/dev/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/briar-android-tests/src/androidTest/java/com/ymirmobile/briar_android_tests/ApplicationTest.java b/briar-android-tests/src/androidTest/java/com/ymirmobile/briar_android_tests/ApplicationTest.java new file mode 100644 index 000000000..9d2a221d1 --- /dev/null +++ b/briar-android-tests/src/androidTest/java/com/ymirmobile/briar_android_tests/ApplicationTest.java @@ -0,0 +1,13 @@ +package com.ymirmobile.briar_android_tests; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/briar-android-tests/src/main/AndroidManifest.xml b/briar-android-tests/src/main/AndroidManifest.xml new file mode 100644 index 000000000..a152a552b --- /dev/null +++ b/briar-android-tests/src/main/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/briar-android-tests/src/main/res/values/strings.xml b/briar-android-tests/src/main/res/values/strings.xml new file mode 100644 index 000000000..71b096466 --- /dev/null +++ b/briar-android-tests/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + briar-android-tests + diff --git a/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/protocol/ProtocolIntegrationTest.java similarity index 79% rename from briar-tests/src/org/briarproject/ProtocolIntegrationTest.java rename to briar-android-tests/src/test/java/org/briarproject/protocol/ProtocolIntegrationTest.java index e8c939d4c..cc36c199d 100644 --- a/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/protocol/ProtocolIntegrationTest.java @@ -1,8 +1,7 @@ -package org.briarproject; - -import com.google.inject.Guice; -import com.google.inject.Injector; +package org.briarproject.protocol; +import org.briarproject.BriarTestCase; +import org.briarproject.TestUtils; import org.briarproject.api.TransportId; import org.briarproject.api.contact.ContactId; import org.briarproject.api.crypto.SecretKey; @@ -22,21 +21,8 @@ import org.briarproject.api.sync.Request; import org.briarproject.api.transport.StreamContext; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; -import org.briarproject.crypto.CryptoModule; -import org.briarproject.data.DataModule; -import org.briarproject.db.DatabaseModule; -import org.briarproject.event.EventModule; -import org.briarproject.sync.SyncModule; -import org.briarproject.transport.TransportModule; import org.junit.Test; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.Collection; - import static org.briarproject.api.sync.SyncConstants.MAX_GROUP_DESCRIPTOR_LENGTH; import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH; import static org.junit.Assert.assertArrayEquals; @@ -44,41 +30,50 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.Collection; + +import javax.inject.Inject; + public class ProtocolIntegrationTest extends BriarTestCase { - private final StreamReaderFactory streamReaderFactory; - private final StreamWriterFactory streamWriterFactory; - private final PacketReaderFactory packetReaderFactory; - private final PacketWriterFactory packetWriterFactory; + @Inject + StreamReaderFactory streamReaderFactory; + @Inject + StreamWriterFactory streamWriterFactory; + @Inject + PacketReaderFactory packetReaderFactory; + @Inject + PacketWriterFactory packetWriterFactory; private final ContactId contactId; private final TransportId transportId; private final SecretKey tagKey, headerKey; private final Message message, message1; private final Collection messageIds; + private final ProtocolTestComponent component; public ProtocolIntegrationTest() throws Exception { - Injector i = Guice.createInjector(new TestDatabaseModule(), - new TestLifecycleModule(), new TestSystemModule(), - new CryptoModule(), new DatabaseModule(), new EventModule(), - new SyncModule(), new DataModule(), - new TransportModule()); - streamReaderFactory = i.getInstance(StreamReaderFactory.class); - streamWriterFactory = i.getInstance(StreamWriterFactory.class); - packetReaderFactory = i.getInstance(PacketReaderFactory.class); - packetWriterFactory = i.getInstance(PacketWriterFactory.class); + + component = DaggerProtocolTestComponent.builder().build(); + component.inject(this); + contactId = new ContactId(234); transportId = new TransportId("id"); // Create the transport keys tagKey = TestUtils.createSecretKey(); headerKey = TestUtils.createSecretKey(); // Create a group - GroupFactory groupFactory = i.getInstance(GroupFactory.class); + GroupFactory groupFactory = component.getGroupFactory(); ClientId clientId = new ClientId(TestUtils.getRandomId()); byte[] descriptor = new byte[MAX_GROUP_DESCRIPTOR_LENGTH]; Group group = groupFactory.createGroup(clientId, descriptor); // Add two messages to the group - MessageFactory messageFactory = i.getInstance(MessageFactory.class); + MessageFactory messageFactory = component.getMessageFactory(); long timestamp = System.currentTimeMillis(); String messageBody = "Hello world"; message = messageFactory.createMessage(group.getId(), timestamp, @@ -159,4 +154,5 @@ public class ProtocolIntegrationTest extends BriarTestCase { assertEquals(m1.getTimestamp(), m2.getTimestamp()); assertArrayEquals(m1.getRaw(), m2.getRaw()); } + } diff --git a/briar-android-tests/src/test/java/org/briarproject/protocol/ProtocolTestComponent.java b/briar-android-tests/src/test/java/org/briarproject/protocol/ProtocolTestComponent.java new file mode 100644 index 000000000..59f58e0cc --- /dev/null +++ b/briar-android-tests/src/test/java/org/briarproject/protocol/ProtocolTestComponent.java @@ -0,0 +1,26 @@ +package org.briarproject.protocol; + +import org.briarproject.TestDatabaseModule; +import org.briarproject.TestSystemModule; +import org.briarproject.api.sync.GroupFactory; +import org.briarproject.api.sync.MessageFactory; +import org.briarproject.crypto.CryptoModule; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.event.EventModule; +import org.briarproject.sync.SyncModule; +import org.briarproject.transport.TransportModule; + +import javax.inject.Singleton; + +import dagger.Component; + +@Singleton +@Component(modules = {TestDatabaseModule.class, TestSystemModule.class, + CryptoModule.class, DatabaseModule.class, EventModule.class, + SyncModule.class, DataModule.class, TransportModule.class}) +public interface ProtocolTestComponent { + void inject(ProtocolIntegrationTest testCase); + GroupFactory getGroupFactory(); + MessageFactory getMessageFactory(); +} diff --git a/briar-android-tests/src/test/java/org/briarproject/sync/ConstantsComponent.java b/briar-android-tests/src/test/java/org/briarproject/sync/ConstantsComponent.java new file mode 100644 index 000000000..9a59db135 --- /dev/null +++ b/briar-android-tests/src/test/java/org/briarproject/sync/ConstantsComponent.java @@ -0,0 +1,28 @@ +package org.briarproject.sync; + +import org.briarproject.TestDatabaseModule; +import org.briarproject.TestLifecycleModule; +import org.briarproject.TestSystemModule; +import org.briarproject.contact.ContactModule; +import org.briarproject.crypto.CryptoModule; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.event.EventModule; +import org.briarproject.forum.ForumModule; +import org.briarproject.identity.IdentityModule; +import org.briarproject.messaging.MessagingModule; +import org.briarproject.transport.TransportModule; + +import javax.inject.Singleton; + +import dagger.Component; + +@Singleton +@Component(modules = {TestDatabaseModule.class, TestLifecycleModule.class, + TestSystemModule.class, ContactModule.class, CryptoModule.class, + DatabaseModule.class, EventModule.class, SyncModule.class, + DataModule.class, TransportModule.class, ForumModule.class, + IdentityModule.class, MessagingModule.class}) +public interface ConstantsComponent { + void inject(ConstantsTest testCase); +} diff --git a/briar-tests/src/org/briarproject/sync/ConstantsTest.java b/briar-android-tests/src/test/java/org/briarproject/sync/ConstantsTest.java similarity index 76% rename from briar-tests/src/org/briarproject/sync/ConstantsTest.java rename to briar-android-tests/src/test/java/org/briarproject/sync/ConstantsTest.java index bac999541..426a38945 100644 --- a/briar-tests/src/org/briarproject/sync/ConstantsTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/sync/ConstantsTest.java @@ -1,12 +1,6 @@ package org.briarproject.sync; -import com.google.inject.Guice; -import com.google.inject.Injector; - import org.briarproject.BriarTestCase; -import org.briarproject.TestDatabaseModule; -import org.briarproject.TestLifecycleModule; -import org.briarproject.TestSystemModule; import org.briarproject.TestUtils; import org.briarproject.api.UniqueId; import org.briarproject.api.crypto.CryptoComponent; @@ -21,22 +15,6 @@ import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.messaging.MessagingConstants; import org.briarproject.api.messaging.PrivateMessage; import org.briarproject.api.messaging.PrivateMessageFactory; -import org.briarproject.api.sync.GroupId; -import org.briarproject.api.sync.MessageId; -import org.briarproject.clients.ClientsModule; -import org.briarproject.contact.ContactModule; -import org.briarproject.crypto.CryptoModule; -import org.briarproject.data.DataModule; -import org.briarproject.db.DatabaseModule; -import org.briarproject.event.EventModule; -import org.briarproject.forum.ForumModule; -import org.briarproject.identity.IdentityModule; -import org.briarproject.messaging.MessagingModule; -import org.briarproject.transport.TransportModule; -import org.junit.Test; - -import java.util.Random; - import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_POST_BODY_LENGTH; import static org.briarproject.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH; import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; @@ -45,26 +23,32 @@ import static org.briarproject.api.messaging.MessagingConstants.MAX_PRIVATE_MESS import static org.briarproject.api.sync.SyncConstants.MAX_PACKET_PAYLOAD_LENGTH; import static org.junit.Assert.assertTrue; +import org.briarproject.api.sync.GroupId; +import org.briarproject.api.sync.MessageId; +import org.junit.Test; + +import java.util.Random; + +import javax.inject.Inject; + public class ConstantsTest extends BriarTestCase { // TODO: Break this up into tests that are relevant for each package + @Inject + CryptoComponent crypto; + @Inject + AuthorFactory authorFactory; + @Inject + PrivateMessageFactory privateMessageFactory; + @Inject + ForumPostFactory forumPostFactory; - private final CryptoComponent crypto; - private final AuthorFactory authorFactory; - private final PrivateMessageFactory privateMessageFactory; - private final ForumPostFactory forumPostFactory; + private final ConstantsComponent component; public ConstantsTest() throws Exception { - Injector i = Guice.createInjector(new TestDatabaseModule(), - new TestLifecycleModule(), new TestSystemModule(), - new ClientsModule(), new ContactModule(), new CryptoModule(), - new DatabaseModule(), new DataModule(), new EventModule(), - new ForumModule(), new IdentityModule(), new MessagingModule(), - new SyncModule(), new TransportModule()); - crypto = i.getInstance(CryptoComponent.class); - authorFactory = i.getInstance(AuthorFactory.class); - privateMessageFactory = i.getInstance(PrivateMessageFactory.class); - forumPostFactory = i.getInstance(ForumPostFactory.class); + + component = DaggerConstantsComponent.builder().build(); + component.inject(this); } @Test diff --git a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java new file mode 100644 index 000000000..83bc5f1c8 --- /dev/null +++ b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java @@ -0,0 +1,54 @@ +package org.briarproject.sync; + +import org.briarproject.TestDatabaseModule; +import org.briarproject.TestSystemModule; +import org.briarproject.api.contact.ContactManager; +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.event.EventBus; +import org.briarproject.api.identity.IdentityManager; +import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.messaging.MessagingManager; +import org.briarproject.api.messaging.PrivateMessageFactory; +import org.briarproject.api.sync.PacketReaderFactory; +import org.briarproject.api.sync.PacketWriterFactory; +import org.briarproject.api.transport.KeyManager; +import org.briarproject.api.transport.StreamReaderFactory; +import org.briarproject.api.transport.StreamWriterFactory; +import org.briarproject.contact.ContactModule; +import org.briarproject.crypto.CryptoModule; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.event.EventModule; +import org.briarproject.identity.IdentityModule; +import org.briarproject.lifecycle.LifecycleModule; +import org.briarproject.messaging.MessagingModule; +import org.briarproject.transport.TransportModule; + +import javax.inject.Singleton; + +import dagger.Component; + +/** + * Created by Ernir Erlingsson (ernir@ymirmobile.com) on 3.3.2016. + */ +@Singleton +@Component(modules = {TestDatabaseModule.class, TestSystemModule.class, + LifecycleModule.class, ContactModule.class, CryptoModule.class, + DatabaseModule.class, EventModule.class, SyncModule.class, + DataModule.class, TransportModule.class, IdentityModule.class, + MessagingModule.class}) +public interface SimplexMessagingComponent { + void inject(SimplexMessagingIntegrationTest testCase); + LifecycleManager getLifeCycleManager(); + DatabaseComponent getDatabaseComponent(); + IdentityManager getIdentityManager(); + ContactManager getContactManager(); + MessagingManager getMessagingManager(); + KeyManager getKeyManager(); + PrivateMessageFactory getPrivateMessageFactory(); + PacketWriterFactory getPacketWriterFactory(); + EventBus getEventBus(); + StreamWriterFactory getStreamWriterFactory(); + StreamReaderFactory getStreamReaderFactory(); + PacketReaderFactory getPacketReaderFactory(); +} diff --git a/briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java similarity index 66% rename from briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java rename to briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java index 0c95d8b3b..dbc1b6a4f 100644 --- a/briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java @@ -1,19 +1,14 @@ package org.briarproject.sync; -import com.google.inject.Guice; -import com.google.inject.Injector; - import org.briarproject.BriarTestCase; -import org.briarproject.ImmediateExecutor; import org.briarproject.TestDatabaseModule; -import org.briarproject.TestSystemModule; import org.briarproject.TestUtils; import org.briarproject.api.TransportId; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.db.DatabaseComponent; -import org.briarproject.api.db.Transaction; +import org.briarproject.api.db.StorageStatus; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventListener; @@ -36,33 +31,24 @@ import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamContext; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; -import org.briarproject.clients.ClientsModule; -import org.briarproject.contact.ContactModule; -import org.briarproject.crypto.CryptoModule; -import org.briarproject.data.DataModule; -import org.briarproject.db.DatabaseModule; -import org.briarproject.event.EventModule; -import org.briarproject.identity.IdentityModule; -import org.briarproject.lifecycle.LifecycleModule; -import org.briarproject.messaging.MessagingModule; -import org.briarproject.transport.TransportModule; +import org.briarproject.plugins.ImmediateExecutor; import org.junit.After; import org.junit.Before; import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; +import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStream; import java.io.OutputStream; -import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; -import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - public class SimplexMessagingIntegrationTest extends BriarTestCase { private static final int MAX_LATENCY = 2 * 60 * 1000; // 2 minutes @@ -76,22 +62,16 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { private final AuthorId aliceId = new AuthorId(TestUtils.getRandomId()); private final AuthorId bobId = new AuthorId(TestUtils.getRandomId()); - private Injector alice, bob; + // private Injector alice, bob; + private SimplexMessagingComponent alice, bob; @Before public void setUp() { assertTrue(testDir.mkdirs()); - alice = createInjector(aliceDir); - bob = createInjector(bobDir); - } - - private Injector createInjector(File dir) { - return Guice.createInjector(new TestDatabaseModule(dir), - new TestSystemModule(), new ClientsModule(), - new ContactModule(), new CryptoModule(), new DatabaseModule(), - new DataModule(), new EventModule(), new IdentityModule(), - new LifecycleModule(), new MessagingModule(), new SyncModule(), - new TransportModule()); + alice = DaggerSimplexMessagingComponent.builder() + .testDatabaseModule(new TestDatabaseModule(aliceDir)).build(); + bob = DaggerSimplexMessagingComponent.builder() + .testDatabaseModule(new TestDatabaseModule(bobDir)).build(); } @Test @@ -101,43 +81,34 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { private byte[] write() throws Exception { // Instantiate Alice's services - LifecycleManager lifecycleManager = - alice.getInstance(LifecycleManager.class); - DatabaseComponent db = alice.getInstance(DatabaseComponent.class); - IdentityManager identityManager = - alice.getInstance(IdentityManager.class); - ContactManager contactManager = alice.getInstance(ContactManager.class); - MessagingManager messagingManager = - alice.getInstance(MessagingManager.class); - KeyManager keyManager = alice.getInstance(KeyManager.class); - PrivateMessageFactory privateMessageFactory = - alice.getInstance(PrivateMessageFactory.class); - PacketWriterFactory packetWriterFactory = - alice.getInstance(PacketWriterFactory.class); - EventBus eventBus = alice.getInstance(EventBus.class); - StreamWriterFactory streamWriterFactory = - alice.getInstance(StreamWriterFactory.class); + LifecycleManager lifecycleManager = alice.getLifeCycleManager(); + DatabaseComponent db = alice.getDatabaseComponent(); + IdentityManager identityManager = alice.getIdentityManager(); + + ContactManager contactManager = alice.getContactManager(); + MessagingManager messagingManager = alice.getMessagingManager(); + KeyManager keyManager = alice.getKeyManager(); + PrivateMessageFactory privateMessageFactory = alice.getPrivateMessageFactory(); + PacketWriterFactory packetWriterFactory = alice.getPacketWriterFactory(); + EventBus eventBus = alice.getEventBus(); + StreamWriterFactory streamWriterFactory = alice.getStreamWriterFactory(); // Start the lifecycle manager lifecycleManager.startServices(); lifecycleManager.waitForStartup(); // Add a transport - Transaction txn = db.startTransaction(); - try { - db.addTransport(txn, transportId, MAX_LATENCY); - txn.setComplete(); - } finally { - db.endTransaction(txn); - } + db.addTransport(transportId, MAX_LATENCY); // Add an identity for Alice LocalAuthor aliceAuthor = new LocalAuthor(aliceId, "Alice", - new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp); + new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp, + StorageStatus.ADDING); identityManager.addLocalAuthor(aliceAuthor); // Add Bob as a contact Author bobAuthor = new Author(bobId, "Bob", new byte[MAX_PUBLIC_KEY_LENGTH]); - ContactId contactId = contactManager.addContact(bobAuthor, aliceId, - master, timestamp, true, true); + ContactId contactId = contactManager.addContact(bobAuthor, aliceId); + // Derive and store the transport keys + keyManager.addContact(contactId, master, timestamp, true); // Send Bob a message GroupId groupId = messagingManager.getConversationId(contactId); @@ -172,45 +143,37 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { private void read(byte[] stream) throws Exception { // Instantiate Bob's services - LifecycleManager lifecycleManager = - bob.getInstance(LifecycleManager.class); - DatabaseComponent db = bob.getInstance(DatabaseComponent.class); - IdentityManager identityManager = - bob.getInstance(IdentityManager.class); - ContactManager contactManager = bob.getInstance(ContactManager.class); - KeyManager keyManager = bob.getInstance(KeyManager.class); - StreamReaderFactory streamReaderFactory = - bob.getInstance(StreamReaderFactory.class); - PacketReaderFactory packetReaderFactory = - bob.getInstance(PacketReaderFactory.class); - EventBus eventBus = bob.getInstance(EventBus.class); + LifecycleManager lifecycleManager = bob.getLifeCycleManager(); + DatabaseComponent db = bob.getDatabaseComponent(); + IdentityManager identityManager = bob.getIdentityManager(); + ContactManager contactManager = bob.getContactManager(); + KeyManager keyManager = bob.getKeyManager(); + StreamReaderFactory streamReaderFactory = bob.getStreamReaderFactory(); + PacketReaderFactory packetReaderFactory = bob.getPacketReaderFactory(); + EventBus eventBus = bob.getEventBus(); // Bob needs a MessagingManager even though we're not using it directly - bob.getInstance(MessagingManager.class); + bob.getMessagingManager(); // Start the lifecyle manager lifecycleManager.startServices(); lifecycleManager.waitForStartup(); // Add a transport - Transaction txn = db.startTransaction(); - try { - db.addTransport(txn, transportId, MAX_LATENCY); - txn.setComplete(); - } finally { - db.endTransaction(txn); - } + db.addTransport(transportId, MAX_LATENCY); // Add an identity for Bob LocalAuthor bobAuthor = new LocalAuthor(bobId, "Bob", - new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp); + new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp, + StorageStatus.ADDING); identityManager.addLocalAuthor(bobAuthor); // Add Alice as a contact Author aliceAuthor = new Author(aliceId, "Alice", new byte[MAX_PUBLIC_KEY_LENGTH]); - ContactId contactId = contactManager.addContact(aliceAuthor, bobId, - master, timestamp, false, true); + ContactId contactId = contactManager.addContact(aliceAuthor, bobId); + // Derive and store the transport keys + keyManager.addContact(contactId, master, timestamp, false); // Set up an event listener MessageListener listener = new MessageListener(); - bob.getInstance(EventBus.class).addListener(listener); + bob.getEventBus().addListener(listener); // Read and recognise the tag ByteArrayInputStream in = new ByteArrayInputStream(stream); byte[] tag = new byte[TAG_LENGTH]; diff --git a/briar-android/build.gradle b/briar-android/build.gradle index fd7393e4b..c3a03b93a 100644 --- a/briar-android/build.gradle +++ b/briar-android/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'com.android.application' apply plugin: 'witness' +apply plugin: 'com.neenbedankt.android-apt' repositories { jcenter() @@ -27,10 +28,13 @@ dependencies { exclude module: 'support-v4' exclude module: 'recyclerview-v7' } - compile "org.roboguice:roboguice:2.0" compile "info.guardianproject.panic:panic:0.5" compile "info.guardianproject.trustedintents:trustedintents:0.2" compile "de.hdodenhof:circleimageview:2.0.0" + apt 'com.google.dagger:dagger-compiler:2.0.2' + provided 'javax.annotation:jsr250-api:1.0' + + compile 'cglib:cglib-nodep:3.1' } dependencyVerification { @@ -42,7 +46,6 @@ dependencyVerification { 'com.android.support:design:41a9cd75ca78f25df5f573db7cedf8bb66beae00c330943923ba9f3e2051736d', 'com.android.support:support-annotations:f347a35b9748a4103b39a6714a77e2100f488d623fd6268e259c177b200e9d82', 'com.android.support:recyclerview-v7:7606373da0931a1e62588335465a0e390cd676c98117edab29220317495faefd', - 'org.roboguice:roboguice:c5302f2648170ee6015a0d18fe0fcc87e09e415a34aeae3566e8d1a9dbb53f28', 'info.guardianproject.panic:panic:a7ed9439826db2e9901649892cf9afbe76f00991b768d8f4c26332d7c9406cb2', 'info.guardianproject.trustedintents:trustedintents:6221456d8821a8d974c2acf86306900237cf6afaaa94a4c9c44e161350f80f3e', ] @@ -95,4 +98,4 @@ android { lintOptions { abortOnError false } -} +} \ No newline at end of file diff --git a/briar-android/proguard-rules.txt b/briar-android/proguard-rules.txt index 1ee57c568..48d785a43 100644 --- a/briar-android/proguard-rules.txt +++ b/briar-android/proguard-rules.txt @@ -46,6 +46,8 @@ -keep class javax.inject.** { *; } -keep class javax.annotation.** { *; } -keep class roboguice.** { *; } +-keep class dagger.** { *; } +-keep class com.google.** { *; } -dontwarn org.h2.** -dontnote org.h2.** @@ -53,4 +55,7 @@ -dontwarn org.briarproject.plugins.tcp.** -dontwarn roboguice.** -dontwarn net.sourceforge.jsocks.** --dontnote android.support.** \ No newline at end of file +-dontnote android.support.** +-dontnote dagger.** +-dontwarn dagger.** +-dontwarn com.google.common.** \ No newline at end of file diff --git a/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java b/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java index fa5c1c35a..5be099400 100644 --- a/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java +++ b/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java @@ -23,11 +23,9 @@ import org.briarproject.api.crypto.CryptoComponent; import javax.inject.Inject; -import roboguice.RoboGuice; - public class AsymmetricIdenticon extends IdenticonView { - @Inject private CryptoComponent mCrypto; + @Inject protected CryptoComponent mCrypto; private IdenticonBase mDelegate; public AsymmetricIdenticon(Context context) { @@ -51,7 +49,6 @@ public class AsymmetricIdenticon extends IdenticonView { } private void initDelegate() { - RoboGuice.injectMembers(getContext(), this); mDelegate = new IdenticonBase() { @Override protected CryptoComponent getCrypto() { diff --git a/briar-android/src/im/delight/android/identicons/SymmetricIdenticon.java b/briar-android/src/im/delight/android/identicons/SymmetricIdenticon.java index f39027081..e89068e39 100644 --- a/briar-android/src/im/delight/android/identicons/SymmetricIdenticon.java +++ b/briar-android/src/im/delight/android/identicons/SymmetricIdenticon.java @@ -23,13 +23,11 @@ import org.briarproject.api.crypto.CryptoComponent; import javax.inject.Inject; -import roboguice.RoboGuice; - public class SymmetricIdenticon extends IdenticonView { private static final int CENTER_COLUMN_INDEX = 5; - @Inject private CryptoComponent mCrypto; + @Inject protected CryptoComponent mCrypto; private IdenticonBase mDelegate; public SymmetricIdenticon(Context context) { @@ -48,7 +46,6 @@ public class SymmetricIdenticon extends IdenticonView { } private void initDelegate() { - RoboGuice.injectMembers(getContext(), this); mDelegate = new IdenticonBase() { @Override protected CryptoComponent getCrypto() { diff --git a/briar-android/src/org/briarproject/android/AndroidComponent.java b/briar-android/src/org/briarproject/android/AndroidComponent.java new file mode 100644 index 000000000..e360a10ec --- /dev/null +++ b/briar-android/src/org/briarproject/android/AndroidComponent.java @@ -0,0 +1,70 @@ +package org.briarproject.android; + +import org.briarproject.android.contact.ContactListFragment; +import org.briarproject.android.contact.ConversationActivity; +import org.briarproject.android.forum.AvailableForumsActivity; +import org.briarproject.android.forum.CreateForumActivity; +import org.briarproject.android.forum.ForumActivity; +import org.briarproject.android.forum.ForumListFragment; +import org.briarproject.android.forum.ReadForumPostActivity; +import org.briarproject.android.forum.ShareForumActivity; +import org.briarproject.android.forum.WriteForumPostActivity; +import org.briarproject.android.fragment.SettingsFragment; +import org.briarproject.android.identity.CreateIdentityActivity; +import org.briarproject.android.invitation.AddContactActivity; +import org.briarproject.android.panic.PanicPreferencesActivity; +import org.briarproject.android.panic.PanicResponderActivity; +import org.briarproject.contact.ContactModule; +import org.briarproject.crypto.CryptoModule; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.event.EventModule; +import org.briarproject.forum.ForumModule; +import org.briarproject.identity.IdentityModule; +import org.briarproject.invitation.InvitationModule; +import org.briarproject.lifecycle.LifecycleModule; +import org.briarproject.messaging.MessagingModule; +import org.briarproject.plugins.AndroidPluginsModule; +import org.briarproject.properties.PropertiesModule; +import org.briarproject.reliability.ReliabilityModule; +import org.briarproject.settings.SettingsModule; +import org.briarproject.sync.SyncModule; +import org.briarproject.system.AndroidSystemModule; +import org.briarproject.transport.TransportModule; + + +import javax.inject.Singleton; +import dagger.Component; +@Singleton +@Component( + modules = {AppModule.class, AndroidModule.class, DatabaseModule.class, + CryptoModule.class, LifecycleModule.class, + ReliabilityModule.class, MessagingModule.class, + InvitationModule.class, ForumModule.class, IdentityModule.class, + EventModule.class, DataModule.class, ContactModule.class, + AndroidSystemModule.class, AndroidPluginsModule.class, + PropertiesModule.class, TransportModule.class, SyncModule.class, + SettingsModule.class}) +public interface AndroidComponent { + void inject(SplashScreenActivity activity); + void inject(SetupActivity activity); + void inject(NavDrawerActivity activity); + void inject(PasswordActivity activity); + void inject(BriarService activity); + void inject(PanicResponderActivity activity); + void inject(PanicPreferencesActivity activity); + void inject(AddContactActivity activity); + void inject(ConversationActivity activity); + void inject(CreateIdentityActivity activity); + void inject(TestingActivity activity); + void inject(AvailableForumsActivity activity); + void inject(WriteForumPostActivity activity); + void inject(CreateForumActivity activity); + void inject(ShareForumActivity activity); + void inject(ReadForumPostActivity activity); + void inject(ForumActivity activity); + void inject(ContactListFragment fragment); + void inject(SettingsFragment fragment); + void inject(ForumListFragment fragment); + +} diff --git a/briar-android/src/org/briarproject/android/AndroidModule.java b/briar-android/src/org/briarproject/android/AndroidModule.java index 1a46ec730..427b884b5 100644 --- a/briar-android/src/org/briarproject/android/AndroidModule.java +++ b/briar-android/src/org/briarproject/android/AndroidModule.java @@ -1,9 +1,8 @@ package org.briarproject.android; import android.app.Application; - -import com.google.inject.AbstractModule; -import com.google.inject.Provides; +import android.content.SharedPreferences; +import android.support.v7.preference.PreferenceManager; import org.briarproject.api.android.AndroidExecutor; import org.briarproject.api.android.AndroidNotificationManager; @@ -18,9 +17,13 @@ import java.io.File; import javax.inject.Singleton; +import dagger.Module; +import dagger.Provides; + import static android.content.Context.MODE_PRIVATE; -public class AndroidModule extends AbstractModule { +@Module +public class AndroidModule { private final UiCallback uiCallback; @@ -42,17 +45,27 @@ public class AndroidModule extends AbstractModule { }; } - @Override - protected void configure() { - bind(AndroidExecutor.class).to(AndroidExecutorImpl.class).in( - Singleton.class); - bind(ReferenceManager.class).to(ReferenceManagerImpl.class).in( - Singleton.class); - bind(UiCallback.class).toInstance(uiCallback); + @Provides + UiCallback provideUICallback() { + return uiCallback; } - @Provides @Singleton - DatabaseConfig getDatabaseConfig(final Application app) { + @Provides + @Singleton + ReferenceManager provideReferenceManager() { + return new ReferenceManagerImpl(); + } + + @Provides + @Singleton + AndroidExecutor provideAndroidExecutor( + AndroidExecutorImpl androidExecutor) { + return androidExecutor; + } + + @Provides + @Singleton + DatabaseConfig provideDatabaseConfig(final Application app) { final File dir = app.getApplicationContext().getDir("db", MODE_PRIVATE); return new DatabaseConfig() { @@ -80,12 +93,15 @@ public class AndroidModule extends AbstractModule { }; } - @Provides @Singleton - AndroidNotificationManager getAndroidNotificationManager( + + @Provides + @Singleton + AndroidNotificationManager provideAndroidNotificationManager( LifecycleManager lifecycleManager, EventBus eventBus, AndroidNotificationManagerImpl notificationManager) { lifecycleManager.register(notificationManager); eventBus.addListener(notificationManager); return notificationManager; } + } diff --git a/briar-android/src/org/briarproject/android/AppModule.java b/briar-android/src/org/briarproject/android/AppModule.java new file mode 100644 index 000000000..d3779d1a1 --- /dev/null +++ b/briar-android/src/org/briarproject/android/AppModule.java @@ -0,0 +1,25 @@ +package org.briarproject.android; + +import android.app.Application; +import android.content.Context; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class AppModule { + + Application application; + + public AppModule(Application application) { + this.application = application; + } + + @Provides + @Singleton + Application providesApplication() { + return application; + } +} diff --git a/briar-android/src/org/briarproject/android/BaseActivity.java b/briar-android/src/org/briarproject/android/BaseActivity.java index 35cfab4b4..8fc2f16be 100644 --- a/briar-android/src/org/briarproject/android/BaseActivity.java +++ b/briar-android/src/org/briarproject/android/BaseActivity.java @@ -9,125 +9,31 @@ import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.inputmethod.InputMethodManager; -import com.google.inject.Inject; -import com.google.inject.Key; -import java.util.HashMap; -import java.util.Map; - -import roboguice.RoboGuice; -import roboguice.activity.event.OnActivityResultEvent; -import roboguice.activity.event.OnConfigurationChangedEvent; -import roboguice.activity.event.OnContentChangedEvent; -import roboguice.activity.event.OnCreateEvent; -import roboguice.activity.event.OnDestroyEvent; -import roboguice.activity.event.OnNewIntentEvent; -import roboguice.activity.event.OnPauseEvent; -import roboguice.activity.event.OnRestartEvent; -import roboguice.activity.event.OnResumeEvent; -import roboguice.activity.event.OnStartEvent; -import roboguice.activity.event.OnStopEvent; -import roboguice.event.EventManager; -import roboguice.inject.RoboInjector; -import roboguice.util.RoboContext; +import javax.inject.Inject; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT; import static org.briarproject.android.TestingConstants.PREVENT_SCREENSHOTS; -public abstract class BaseActivity extends AppCompatActivity - implements RoboContext { +public abstract class BaseActivity extends AppCompatActivity { public final static String PREFS_NAME = "db"; public final static String PREF_DB_KEY = "key"; public final static String PREF_SEEN_WELCOME_MESSAGE = "welcome_message"; - private final HashMap, Object> scopedObjects = - new HashMap, Object>(); - - @Inject private EventManager eventManager; - @Override public void onCreate(Bundle savedInstanceState) { - RoboInjector injector = RoboGuice.getInjector(this); - injector.injectMembersWithoutViews(this); super.onCreate(savedInstanceState); - eventManager.fire(new OnCreateEvent(savedInstanceState)); if (PREVENT_SCREENSHOTS) getWindow().addFlags(FLAG_SECURE); + + AndroidComponent component = + ((BriarApplication) getApplication()).getApplicationComponent(); + injectActivity(component); } - protected void onRestart() { - super.onRestart(); - eventManager.fire(new OnRestartEvent()); - } - - protected void onStart() { - super.onStart(); - eventManager.fire(new OnStartEvent()); - } - - protected void onResume() { - super.onResume(); - eventManager.fire(new OnResumeEvent()); - } - - protected void onPause() { - super.onPause(); - eventManager.fire(new OnPauseEvent()); - } - - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - eventManager.fire(new OnNewIntentEvent()); - } - - protected void onStop() { - try { - eventManager.fire(new OnStopEvent()); - } finally { - super.onStop(); - } - - } - - protected void onDestroy() { - try { - eventManager.fire(new OnDestroyEvent()); - } finally { - try { - RoboGuice.destroyInjector(this); - } finally { - super.onDestroy(); - } - } - - } - - public void onConfigurationChanged(Configuration newConfig) { - Configuration currentConfig = getResources().getConfiguration(); - super.onConfigurationChanged(newConfig); - eventManager.fire(new OnConfigurationChangedEvent(currentConfig, - newConfig)); - } - - public void onContentChanged() { - super.onContentChanged(); - RoboGuice.getInjector(this).injectViewMembers(this); - eventManager.fire(new OnContentChangedEvent()); - } - - protected void onActivityResult(int requestCode, int resultCode, - Intent data) { - super.onActivityResult(requestCode, resultCode, data); - eventManager.fire(new OnActivityResultEvent(requestCode, resultCode, - data)); - } - - @Override - public Map, Object> getScopedObjectMap() { - return scopedObjects; - } + public abstract void injectActivity(AndroidComponent component); private SharedPreferences getSharedPrefs() { return getSharedPreferences(PREFS_NAME, MODE_PRIVATE); diff --git a/briar-android/src/org/briarproject/android/BriarActivity.java b/briar-android/src/org/briarproject/android/BriarActivity.java index dc0249ff5..80d33959e 100644 --- a/briar-android/src/org/briarproject/android/BriarActivity.java +++ b/briar-android/src/org/briarproject/android/BriarActivity.java @@ -27,7 +27,8 @@ import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP; @SuppressLint("Registered") public abstract class BriarActivity extends BaseActivity { - public static final String KEY_LOCAL_AUTHOR_HANDLE = "briar.LOCAL_AUTHOR_HANDLE"; + public static final String KEY_LOCAL_AUTHOR_HANDLE = + "briar.LOCAL_AUTHOR_HANDLE"; public static final String KEY_STARTUP_FAILED = "briar.STARTUP_FAILED"; public static final int REQUEST_PASSWORD = 1; @@ -38,16 +39,21 @@ public abstract class BriarActivity extends BaseActivity { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private DatabaseConfig databaseConfig; + @Inject + DatabaseConfig databaseConfig; private boolean bound = false; // Fields that are accessed from background threads must be volatile - @Inject @DatabaseExecutor private volatile Executor dbExecutor; - @Inject private volatile LifecycleManager lifecycleManager; + @Inject + @DatabaseExecutor + protected volatile Executor dbExecutor; + @Inject + protected volatile LifecycleManager lifecycleManager; @Override public void onCreate(Bundle state) { super.onCreate(state); + if (databaseConfig.getEncryptionKey() != null) startAndBindService(); } diff --git a/briar-android/src/org/briarproject/android/BriarApplication.java b/briar-android/src/org/briarproject/android/BriarApplication.java index 8e54544cf..1478b6e2d 100644 --- a/briar-android/src/org/briarproject/android/BriarApplication.java +++ b/briar-android/src/org/briarproject/android/BriarApplication.java @@ -11,6 +11,8 @@ public class BriarApplication extends Application { private static final Logger LOG = Logger.getLogger(BriarApplication.class.getName()); + private AndroidComponent applicationComponent; + @Override public void onCreate() { super.onCreate(); @@ -20,5 +22,14 @@ public class BriarApplication extends Application { Context ctx = getApplicationContext(); CrashHandler newHandler = new CrashHandler(ctx, oldHandler); Thread.setDefaultUncaughtExceptionHandler(newHandler); + + applicationComponent = DaggerAndroidComponent.builder() + .appModule(new AppModule(this)) + .androidModule(new AndroidModule()) + .build(); + } + + public AndroidComponent getApplicationComponent() { + return applicationComponent; } } diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java index f11019303..3d88616f3 100644 --- a/briar-android/src/org/briarproject/android/BriarService.java +++ b/briar-android/src/org/briarproject/android/BriarService.java @@ -2,6 +2,7 @@ package org.briarproject.android; import android.app.NotificationManager; import android.app.PendingIntent; +import android.app.Service; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; @@ -22,8 +23,6 @@ import java.util.logging.Logger; import javax.inject.Inject; -import roboguice.service.RoboService; - import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; @@ -34,7 +33,7 @@ import static java.util.logging.Level.WARNING; import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.ALREADY_RUNNING; import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.SUCCESS; -public class BriarService extends RoboService { +public class BriarService extends Service { private static final int ONGOING_NOTIFICATION_ID = 1; private static final int FAILURE_NOTIFICATION_ID = 2; @@ -45,16 +44,20 @@ public class BriarService extends RoboService { private final AtomicBoolean created = new AtomicBoolean(false); private final Binder binder = new BriarBinder(); - @Inject private DatabaseConfig databaseConfig; + @Inject protected DatabaseConfig databaseConfig; // Fields that are accessed from background threads must be volatile - @Inject private volatile LifecycleManager lifecycleManager; - @Inject private volatile AndroidExecutor androidExecutor; + @Inject protected volatile LifecycleManager lifecycleManager; + @Inject protected volatile AndroidExecutor androidExecutor; private volatile boolean started = false; @Override public void onCreate() { super.onCreate(); + + ((BriarApplication) this.getApplication()) + .getApplicationComponent().inject(this); + LOG.info("Created"); if (created.getAndSet(true)) { LOG.info("Already created"); diff --git a/briar-android/src/org/briarproject/android/NavDrawerActivity.java b/briar-android/src/org/briarproject/android/NavDrawerActivity.java index c6bc58b78..8342c5837 100644 --- a/briar-android/src/org/briarproject/android/NavDrawerActivity.java +++ b/briar-android/src/org/briarproject/android/NavDrawerActivity.java @@ -14,6 +14,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; +import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.TextView; @@ -42,9 +43,6 @@ import java.util.logging.Logger; import javax.inject.Inject; -import roboguice.RoboGuice; -import roboguice.inject.InjectView; - import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; @@ -60,33 +58,23 @@ public class NavDrawerActivity extends BriarFragmentActivity implements private ActionBarDrawerToggle drawerToggle; @Inject - private ReferenceManager referenceManager; + protected ReferenceManager referenceManager; // Fields that are accessed from background threads must be volatile @Inject - private volatile IdentityManager identityManager; + protected volatile IdentityManager identityManager; @Inject - private PluginManager pluginManager; + protected PluginManager pluginManager; @Inject protected volatile EventBus eventBus; - @InjectView(R.id.toolbar) private Toolbar toolbar; - @InjectView(R.id.drawer_layout) private DrawerLayout drawerLayout; - @InjectView(R.id.nav_btn_contacts) - private AppCompatButton contactButton; - @InjectView(R.id.nav_btn_contacts) - private AppCompatButton forumsButton; - @InjectView(R.id.nav_btn_contacts) - private AppCompatButton settingsButton; - @InjectView(R.id.nav_menu_header) - private TextView menuHeader; - @InjectView(R.id.title_progress_bar) - private TextView progressTitle; - @InjectView(R.id.container_progress) - ViewGroup progressViewGroup; - @InjectView(R.id.transportsView) + private Button contactButton; + private Button forumsButton; + private Button settingsButton; private GridView transportsView; + private TextView progressTitle; + private ViewGroup progressViewGroup; private List transports; private BaseAdapter transportsAdapter; @@ -104,6 +92,11 @@ public class NavDrawerActivity extends BriarFragmentActivity implements } } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + @SuppressWarnings("ConstantConditions") @Override public void onCreate(Bundle state) { @@ -112,9 +105,16 @@ public class NavDrawerActivity extends BriarFragmentActivity implements if (isStartupFailed(getIntent())) return; - // TODO inflate and inject with @ContentView with RoboGuice 3.0 and later setContentView(R.layout.activity_nav_drawer); - RoboGuice.getInjector(this).injectViewMembers(this); + + toolbar = (Toolbar)findViewById(R.id.toolbar); + drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); + contactButton = (Button)findViewById(R.id.nav_btn_contacts); + forumsButton = (Button)findViewById(R.id.nav_btn_forums); + settingsButton = (Button)findViewById(R.id.nav_btn_settings); + transportsView = (GridView)findViewById(R.id.transportsView); + progressTitle = (TextView)findViewById(R.id.title_progress_bar); + progressViewGroup = (ViewGroup)findViewById(R.id.container_progress); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); diff --git a/briar-android/src/org/briarproject/android/PasswordActivity.java b/briar-android/src/org/briarproject/android/PasswordActivity.java index f9f60ed1a..d1653207f 100644 --- a/briar-android/src/org/briarproject/android/PasswordActivity.java +++ b/briar-android/src/org/briarproject/android/PasswordActivity.java @@ -34,7 +34,7 @@ import static android.view.View.VISIBLE; public class PasswordActivity extends BaseActivity { - @Inject @CryptoExecutor private Executor cryptoExecutor; + @Inject @CryptoExecutor protected Executor cryptoExecutor; private Button signInButton; private ProgressBar progress; private TextInputLayout input; @@ -43,8 +43,8 @@ public class PasswordActivity extends BaseActivity { private byte[] encrypted; // Fields that are accessed from background threads must be volatile - @Inject private volatile CryptoComponent crypto; - @Inject private volatile DatabaseConfig databaseConfig; + @Inject protected volatile CryptoComponent crypto; + @Inject protected volatile DatabaseConfig databaseConfig; @Override public void onCreate(Bundle state) { @@ -74,7 +74,8 @@ public class PasswordActivity extends BaseActivity { password.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, - int after) {} + int after) { + } @Override public void onTextChanged(CharSequence s, int start, int before, @@ -83,10 +84,16 @@ public class PasswordActivity extends BaseActivity { } @Override - public void afterTextChanged(Editable s) {} + public void afterTextChanged(Editable s) { + } }); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + @Override public void onBackPressed() { // Show the home screen rather than another password prompt diff --git a/briar-android/src/org/briarproject/android/SetupActivity.java b/briar-android/src/org/briarproject/android/SetupActivity.java index 81e832d5f..4aba12d05 100644 --- a/briar-android/src/org/briarproject/android/SetupActivity.java +++ b/briar-android/src/org/briarproject/android/SetupActivity.java @@ -33,8 +33,6 @@ import java.util.logging.Logger; import javax.inject.Inject; -import roboguice.inject.InjectView; - import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; @@ -50,29 +48,40 @@ public class SetupActivity extends BaseActivity implements OnClickListener, private static final Logger LOG = Logger.getLogger(SetupActivity.class.getName()); - @Inject @CryptoExecutor private Executor cryptoExecutor; - @Inject private PasswordStrengthEstimator strengthEstimator; - @InjectView(R.id.nickname_entry_wrapper) TextInputLayout nicknameEntryWrapper; - @InjectView(R.id.password_entry_wrapper) TextInputLayout passwordEntryWrapper; - @InjectView(R.id.password_confirm_wrapper) TextInputLayout passwordConfirmationWrapper; - @InjectView(R.id.nickname_entry) EditText nicknameEntry; - @InjectView(R.id.password_entry) EditText passwordEntry; - @InjectView(R.id.password_confirm) EditText passwordConfirmation; - @InjectView(R.id.strength_meter) StrengthMeter strengthMeter; - @InjectView(R.id.create_account) Button createAccountButton; - @InjectView(R.id.progress_wheel) ProgressBar progress; + @Inject @CryptoExecutor protected Executor cryptoExecutor; + @Inject protected PasswordStrengthEstimator strengthEstimator; // Fields that are accessed from background threads must be volatile - @Inject private volatile CryptoComponent crypto; - @Inject private volatile DatabaseConfig databaseConfig; - @Inject private volatile AuthorFactory authorFactory; - @Inject private volatile ReferenceManager referenceManager; + @Inject protected volatile CryptoComponent crypto; + @Inject protected volatile DatabaseConfig databaseConfig; + @Inject protected volatile AuthorFactory authorFactory; + @Inject protected volatile ReferenceManager referenceManager; + + TextInputLayout nicknameEntryWrapper; + TextInputLayout passwordEntryWrapper; + TextInputLayout passwordConfirmationWrapper; + EditText nicknameEntry; + EditText passwordEntry; + EditText passwordConfirmation; + StrengthMeter strengthMeter; + Button createAccountButton; + ProgressBar progress; @Override public void onCreate(Bundle state) { super.onCreate(state); setContentView(R.layout.activity_setup); + nicknameEntryWrapper = (TextInputLayout)findViewById(R.id.nickname_entry_wrapper); + passwordEntryWrapper = (TextInputLayout)findViewById(R.id.password_entry_wrapper); + passwordConfirmationWrapper = (TextInputLayout)findViewById(R.id.password_confirm_wrapper); + nicknameEntry = (EditText)findViewById(R.id.nickname_entry); + passwordEntry = (EditText)findViewById(R.id.password_entry); + passwordConfirmation = (EditText)findViewById(R.id.password_confirm); + strengthMeter = (StrengthMeter)findViewById(R.id.strength_meter); + createAccountButton = (Button)findViewById(R.id.create_account); + progress = (ProgressBar)findViewById(R.id.progress_wheel); + if (PREVENT_SCREENSHOTS) getWindow().addFlags(FLAG_SECURE); TextWatcher tw = new TextWatcher() { @@ -99,6 +108,11 @@ public class SetupActivity extends BaseActivity implements OnClickListener, createAccountButton.setOnClickListener(this); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + private void enableOrDisableContinueButton() { if (progress == null) return; // Not created yet if (passwordEntry.getText().length() > 0 && passwordEntry.hasFocus()) diff --git a/briar-android/src/org/briarproject/android/SplashScreenActivity.java b/briar-android/src/org/briarproject/android/SplashScreenActivity.java index c58427834..c79f9a350 100644 --- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java +++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java @@ -1,9 +1,11 @@ package org.briarproject.android; +import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; +import android.os.Handler; import android.os.StrictMode; import android.os.StrictMode.ThreadPolicy; import android.os.StrictMode.VmPolicy; @@ -11,29 +13,22 @@ import android.support.v7.preference.PreferenceManager; import android.widget.ImageView; import android.widget.LinearLayout; -import com.google.inject.Injector; - import org.briarproject.R; -import org.briarproject.android.util.AndroidUtils; import org.briarproject.android.util.LayoutUtils; import org.briarproject.api.db.DatabaseConfig; +import org.briarproject.api.ui.UiCallback; +import org.briarproject.util.FileUtils; import java.util.logging.Logger; -import roboguice.RoboGuice; -import roboguice.activity.RoboSplashActivity; +import javax.inject.Inject; import static android.view.Gravity.CENTER; -import static android.view.WindowManager.LayoutParams.FLAG_SECURE; -import static java.util.logging.Level.INFO; -import static org.briarproject.android.BaseActivity.PREFS_NAME; -import static org.briarproject.android.BaseActivity.PREF_DB_KEY; import static org.briarproject.android.TestingConstants.DEFAULT_LOG_LEVEL; -import static org.briarproject.android.TestingConstants.PREVENT_SCREENSHOTS; import static org.briarproject.android.TestingConstants.TESTING; import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH; -public class SplashScreenActivity extends RoboSplashActivity { +public class SplashScreenActivity extends BaseActivity { private static final Logger LOG = Logger.getLogger(SplashScreenActivity.class.getName()); @@ -43,18 +38,18 @@ public class SplashScreenActivity extends RoboSplashActivity { private long now = System.currentTimeMillis(); + @Inject + DatabaseConfig dbConfig; + public SplashScreenActivity() { Logger.getLogger("").setLevel(DEFAULT_LOG_LEVEL); enableStrictMode(); - minDisplayMs = 500; } @Override public void onCreate(Bundle state) { super.onCreate(state); - if (PREVENT_SCREENSHOTS) getWindow().addFlags(FLAG_SECURE); - LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setGravity(CENTER); @@ -70,28 +65,36 @@ public class SplashScreenActivity extends RoboSplashActivity { setPreferencesDefaults(); setContentView(layout); + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + startNextActivity(); + } + }, 500); } @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + protected void startNextActivity() { - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Guice startup took " + duration + " ms"); if (System.currentTimeMillis() >= EXPIRY_DATE) { LOG.info("Expired"); startActivity(new Intent(this, ExpiredActivity.class)); } else { - SharedPreferences prefs = getSharedPreferences(PREFS_NAME, - MODE_PRIVATE); - String hex = prefs.getString(PREF_DB_KEY, null); - Injector i = RoboGuice.getBaseApplicationInjector(getApplication()); - DatabaseConfig databaseConfig = i.getInstance(DatabaseConfig.class); - if (hex != null && databaseConfig.databaseExists()) { - startActivity(new Intent(this, NavDrawerActivity.class)); - } else { - prefs.edit().clear().apply(); - AndroidUtils.deleteAppData(this); - startActivity(new Intent(this, SetupActivity.class)); + String hex = getEncryptedDatabaseKey(); + + if (dbConfig != null) { + if (hex != null && dbConfig.databaseExists()) { + startActivity(new Intent(this, NavDrawerActivity.class)); + } else { + clearSharedPrefs(); + FileUtils.deleteFileOrDir( + dbConfig.getDatabaseDirectory()); + startActivity(new Intent(this, SetupActivity.class)); + } } } } @@ -114,7 +117,7 @@ public class SplashScreenActivity extends RoboSplashActivity { @Override public void run() { PreferenceManager.setDefaultValues(SplashScreenActivity.this, - R.xml.panic_preferences, false); + R.xml.panic_preferences, false); } }.start(); } diff --git a/briar-android/src/org/briarproject/android/StartupFailureActivity.java b/briar-android/src/org/briarproject/android/StartupFailureActivity.java index 25d037289..5180c33c2 100644 --- a/briar-android/src/org/briarproject/android/StartupFailureActivity.java +++ b/briar-android/src/org/briarproject/android/StartupFailureActivity.java @@ -19,6 +19,11 @@ public class StartupFailureActivity extends BaseActivity { handleIntent(getIntent()); } + @Override + public void injectActivity(AndroidComponent component) { + + } + private void handleIntent(Intent i) { StartResult result = (StartResult) i.getSerializableExtra("briar.START_RESULT"); int notificationId = i.getIntExtra("briar.FAILURE_NOTIFICATION_ID", -1); diff --git a/briar-android/src/org/briarproject/android/TestingActivity.java b/briar-android/src/org/briarproject/android/TestingActivity.java index 47c319cf0..a7446b0cd 100644 --- a/briar-android/src/org/briarproject/android/TestingActivity.java +++ b/briar-android/src/org/briarproject/android/TestingActivity.java @@ -75,9 +75,9 @@ public class TestingActivity extends BriarActivity implements OnClickListener { private static final Logger LOG = Logger.getLogger(TestingActivity.class.getName()); - @Inject private PluginManager pluginManager; - @Inject private LifecycleManager lifecycleManager; - @Inject private TransportPropertyManager transportPropertyManager; + @Inject protected PluginManager pluginManager; + @Inject protected LifecycleManager lifecycleManager; + @Inject protected TransportPropertyManager transportPropertyManager; private ScrollView scroll = null; private ListLoadingProgressBar progress = null; private LinearLayout status = null; @@ -137,6 +137,11 @@ public class TestingActivity extends BriarActivity implements OnClickListener { setContentView(layout); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + @Override public void onResume() { super.onResume(); diff --git a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java index b1352dda7..afdb74a42 100644 --- a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java +++ b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java @@ -10,6 +10,8 @@ import android.view.View; import android.view.ViewGroup; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; +import org.briarproject.android.BriarApplication; import org.briarproject.android.fragment.BaseEventFragment; import org.briarproject.android.invitation.AddContactActivity; import org.briarproject.android.util.BriarRecyclerView; @@ -64,19 +66,29 @@ public class ContactListFragment extends BaseEventFragment { } @Inject - private CryptoComponent crypto; + protected CryptoComponent crypto; @Inject - private ConnectionRegistry connectionRegistry; + protected ConnectionRegistry connectionRegistry; private ContactListAdapter adapter = null; private BriarRecyclerView list = null; // Fields that are accessed from background threads must be volatile @Inject - private volatile ContactManager contactManager; + protected volatile ContactManager contactManager; @Inject - private volatile MessagingManager messagingManager; + protected volatile MessagingManager messagingManager; @Inject - private volatile EventBus eventBus; + protected volatile EventBus eventBus; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } @Nullable @Override diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index b3f562949..a170bfdb2 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -17,6 +17,7 @@ import android.widget.ImageButton; import android.widget.Toast; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; import org.briarproject.android.util.BriarRecyclerView; import org.briarproject.api.FormatException; @@ -71,10 +72,10 @@ public class ConversationActivity extends BriarActivity private static final Logger LOG = Logger.getLogger(ConversationActivity.class.getName()); - @Inject private CryptoComponent crypto; - @Inject private AndroidNotificationManager notificationManager; - @Inject private ConnectionRegistry connectionRegistry; - @Inject @CryptoExecutor private Executor cryptoExecutor; + @Inject protected CryptoComponent crypto; + @Inject protected AndroidNotificationManager notificationManager; + @Inject protected ConnectionRegistry connectionRegistry; + @Inject @CryptoExecutor protected Executor cryptoExecutor; private Map bodyCache = new HashMap(); private ConversationAdapter adapter = null; private BriarRecyclerView list = null; @@ -82,10 +83,10 @@ public class ConversationActivity extends BriarActivity private ImageButton sendButton = null; // Fields that are accessed from background threads must be volatile - @Inject private volatile ContactManager contactManager; - @Inject private volatile MessagingManager messagingManager; - @Inject private volatile EventBus eventBus; - @Inject private volatile PrivateMessageFactory privateMessageFactory; + @Inject protected volatile ContactManager contactManager; + @Inject protected volatile MessagingManager messagingManager; + @Inject protected volatile EventBus eventBus; + @Inject protected volatile PrivateMessageFactory privateMessageFactory; private volatile GroupId groupId = null; private volatile ContactId contactId = null; private volatile String contactName = null; @@ -115,6 +116,11 @@ public class ConversationActivity extends BriarActivity sendButton.setOnClickListener(this); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + @Override public void onResume() { super.onResume(); diff --git a/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java index 2a9beba3c..6ce64a2a1 100644 --- a/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java +++ b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java @@ -8,6 +8,7 @@ import android.widget.ListView; import android.widget.Toast; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; import org.briarproject.android.util.ListLoadingProgressBar; import org.briarproject.api.contact.Contact; @@ -47,9 +48,9 @@ implements EventListener, OnItemClickListener { private ListView list = null; // Fields that are accessed from background threads must be volatile - @Inject private volatile ForumManager forumManager; - @Inject private volatile ForumSharingManager forumSharingManager; - @Inject private volatile EventBus eventBus; + @Inject protected volatile ForumManager forumManager; + @Inject protected volatile ForumSharingManager forumSharingManager; + @Inject protected volatile EventBus eventBus; @Override public void onCreate(Bundle state) { @@ -66,6 +67,11 @@ implements EventListener, OnItemClickListener { setContentView(loading); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + @Override public void onResume() { super.onResume(); diff --git a/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java b/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java index ca0b2ab13..9307bbb43 100644 --- a/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java +++ b/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java @@ -14,6 +14,7 @@ import android.widget.TextView.OnEditorActionListener; import android.widget.Toast; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; import org.briarproject.android.util.LayoutUtils; import org.briarproject.api.db.DbException; @@ -51,7 +52,7 @@ implements OnEditorActionListener, OnClickListener { private TextView feedback = null; // Fields that are accessed from background threads must be volatile - @Inject private volatile ForumSharingManager forumSharingManager; + @Inject protected volatile ForumSharingManager forumSharingManager; @Override public void onCreate(Bundle state) { @@ -102,6 +103,11 @@ implements OnEditorActionListener, OnClickListener { setContentView(layout); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + private void enableOrDisableCreateButton() { if (progress == null) return; // Not created yet createForumButton.setEnabled(validateName()); diff --git a/briar-android/src/org/briarproject/android/forum/ForumActivity.java b/briar-android/src/org/briarproject/android/forum/ForumActivity.java index 943db6269..96add7ce4 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java +++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java @@ -13,6 +13,7 @@ import android.widget.ListView; import android.widget.TextView; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; import org.briarproject.android.util.ElasticHorizontalSpace; import org.briarproject.android.util.HorizontalBorder; @@ -62,7 +63,7 @@ public class ForumActivity extends BriarActivity implements EventListener, private static final Logger LOG = Logger.getLogger(ForumActivity.class.getName()); - @Inject private AndroidNotificationManager notificationManager; + @Inject protected AndroidNotificationManager notificationManager; private Map bodyCache = new HashMap(); private TextView empty = null; private ForumAdapter adapter = null; @@ -71,8 +72,8 @@ public class ForumActivity extends BriarActivity implements EventListener, private ImageButton composeButton = null, shareButton = null; // Fields that are accessed from background threads must be volatile - @Inject private volatile ForumManager forumManager; - @Inject private volatile EventBus eventBus; + @Inject protected volatile ForumManager forumManager; + @Inject protected volatile EventBus eventBus; private volatile GroupId groupId = null; private volatile Forum forum = null; @@ -139,6 +140,11 @@ public class ForumActivity extends BriarActivity implements EventListener, setContentView(layout); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + @Override public void onResume() { super.onResume(); diff --git a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java index 30b62b282..1684a14fc 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java +++ b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java @@ -19,6 +19,7 @@ import android.widget.TextView; import android.widget.Toast; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.fragment.BaseEventFragment; import org.briarproject.android.util.HorizontalBorder; import org.briarproject.android.util.LayoutUtils; @@ -83,8 +84,8 @@ public class ForumListFragment extends BaseEventFragment implements private ImageButton newForumButton = null; // Fields that are accessed from background threads must be volatile - @Inject private volatile ForumManager forumManager; - @Inject private volatile ForumSharingManager forumSharingManager; + @Inject protected volatile ForumManager forumManager; + @Inject protected volatile ForumSharingManager forumSharingManager; @Nullable @Override @@ -152,6 +153,11 @@ public class ForumListFragment extends BaseEventFragment implements return TAG; } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + @Override public void onResume() { super.onResume(); diff --git a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java index 45cec82f6..890cc0398 100644 --- a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java +++ b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java @@ -12,6 +12,7 @@ import android.widget.ScrollView; import android.widget.TextView; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; import org.briarproject.android.util.AuthorView; import org.briarproject.android.util.ElasticHorizontalSpace; @@ -59,7 +60,7 @@ implements OnClickListener { private int position = -1; // Fields that are accessed from background threads must be volatile - @Inject private volatile ForumManager forumManager; + @Inject protected volatile ForumManager forumManager; private volatile MessageId messageId = null; @Override @@ -164,6 +165,11 @@ implements OnClickListener { setContentView(layout); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + @Override public void onPause() { super.onPause(); diff --git a/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java b/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java index 59821f9a1..cf252102e 100644 --- a/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java +++ b/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java @@ -11,6 +11,7 @@ import android.widget.RadioButton; import android.widget.RadioGroup; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; import org.briarproject.android.contact.SelectContactsDialog; import org.briarproject.android.invitation.AddContactActivity; @@ -51,8 +52,8 @@ SelectContactsDialog.Listener { private boolean changed = false; // Fields that are accessed from background threads must be volatile - @Inject private volatile ContactManager contactManager; - @Inject private volatile ForumSharingManager forumSharingManager; + @Inject protected volatile ContactManager contactManager; + @Inject protected volatile ForumSharingManager forumSharingManager; private volatile GroupId groupId = null; private volatile Collection contacts = null; private volatile Collection selected = null; @@ -109,6 +110,11 @@ SelectContactsDialog.Listener { setContentView(layout); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + public void onClick(View view) { if (view == shareWithAll) { changed = true; diff --git a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java index 6bd289e3e..a3f038f48 100644 --- a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java +++ b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java @@ -16,6 +16,7 @@ import android.widget.TextView; import android.widget.Toast; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; import org.briarproject.android.identity.CreateIdentityActivity; import org.briarproject.android.identity.LocalAuthorItem; @@ -67,7 +68,7 @@ implements OnItemSelectedListener, OnClickListener { private static final Logger LOG = Logger.getLogger(WriteForumPostActivity.class.getName()); - @Inject @CryptoExecutor private Executor cryptoExecutor; + @Inject @CryptoExecutor protected Executor cryptoExecutor; private LocalAuthorSpinnerAdapter adapter = null; private Spinner spinner = null; private ImageButton sendButton = null; @@ -76,10 +77,10 @@ implements OnItemSelectedListener, OnClickListener { private GroupId groupId = null; // Fields that are accessed from background threads must be volatile - @Inject private volatile IdentityManager identityManager; - @Inject private volatile ForumManager forumManager; - @Inject private volatile ForumPostFactory forumPostFactory; - @Inject private volatile CryptoComponent crypto; + @Inject protected volatile IdentityManager identityManager; + @Inject protected volatile ForumManager forumManager; + @Inject protected volatile ForumPostFactory forumPostFactory; + @Inject protected volatile CryptoComponent crypto; private volatile MessageId parentId = null; private volatile long minTimestamp = -1; private volatile LocalAuthor localAuthor = null; @@ -157,6 +158,11 @@ implements OnItemSelectedListener, OnClickListener { setContentView(layout); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + @Override public void onResume() { super.onResume(); diff --git a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java index 5d69a5870..03dd18953 100644 --- a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java +++ b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java @@ -1,12 +1,14 @@ package org.briarproject.android.fragment; import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; +import org.briarproject.android.BriarApplication; -import roboguice.fragment.RoboFragment; - -public abstract class BaseFragment extends RoboFragment { +public abstract class BaseFragment extends Fragment { public abstract String getUniqueTag(); @@ -25,10 +27,25 @@ public abstract class BaseFragment extends RoboFragment { } } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + AndroidComponent component = + ((BriarApplication) getActivity().getApplication()) + .getApplicationComponent(); + injectActivity(component); + } + + public abstract void injectActivity(AndroidComponent component); + public interface BaseFragmentListener { void showLoadingScreen(boolean isBlocking, int stringId); + void hideLoadingScreen(); + void runOnUiThread(Runnable runnable); + void runOnDbThread(Runnable runnable); } diff --git a/briar-android/src/org/briarproject/android/fragment/DashboardFragment.java b/briar-android/src/org/briarproject/android/fragment/DashboardFragment.java index b1eb92585..f98c16ab0 100644 --- a/briar-android/src/org/briarproject/android/fragment/DashboardFragment.java +++ b/briar-android/src/org/briarproject/android/fragment/DashboardFragment.java @@ -9,6 +9,7 @@ import android.view.ViewGroup; import android.widget.GridView; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.api.event.Event; import org.briarproject.api.plugins.PluginManager; @@ -16,8 +17,6 @@ import java.util.logging.Logger; import javax.inject.Inject; -import roboguice.inject.InjectView; - public class DashboardFragment extends BaseEventFragment { public final static String TAG = "DashboardFragment"; @@ -26,10 +25,7 @@ public class DashboardFragment extends BaseEventFragment { Logger.getLogger(DashboardFragment.class.getName()); @Inject - private PluginManager pluginManager; - - @InjectView(R.id.transportsView) - private GridView transportsView; + protected PluginManager pluginManager; public static DashboardFragment newInstance() { @@ -59,6 +55,11 @@ public class DashboardFragment extends BaseEventFragment { return TAG; } + @Override + public void injectActivity(AndroidComponent component) { + + } + @Override public void eventOccurred(Event e) { diff --git a/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java b/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java index 2b293e4e0..d1d37f9fa 100644 --- a/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java +++ b/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java @@ -14,6 +14,7 @@ import android.widget.TextView.OnEditorActionListener; import android.widget.Toast; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; import org.briarproject.android.util.LayoutUtils; import org.briarproject.api.crypto.CryptoComponent; @@ -50,16 +51,16 @@ implements OnEditorActionListener, OnClickListener { private static final Logger LOG = Logger.getLogger(CreateIdentityActivity.class.getName()); - @Inject @CryptoExecutor private Executor cryptoExecutor; + @Inject @CryptoExecutor protected Executor cryptoExecutor; private EditText nicknameEntry = null; private Button createIdentityButton = null; private ProgressBar progress = null; private TextView feedback = null; // Fields that are accessed from background threads must be volatile - @Inject private volatile CryptoComponent crypto; - @Inject private volatile AuthorFactory authorFactory; - @Inject private volatile IdentityManager identityManager; + @Inject protected volatile CryptoComponent crypto; + @Inject protected volatile AuthorFactory authorFactory; + @Inject protected volatile IdentityManager identityManager; @Override public void onCreate(Bundle state) { @@ -112,6 +113,11 @@ implements OnEditorActionListener, OnClickListener { setContentView(layout); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + private void enableOrDisableCreateButton() { if (progress == null) return; // Not created yet createIdentityButton.setEnabled(validateNickname()); diff --git a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java index 3ae2ae4bc..39f2b578e 100644 --- a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java +++ b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java @@ -5,6 +5,7 @@ import android.os.Bundle; import android.widget.Toast; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; import org.briarproject.api.android.ReferenceManager; import org.briarproject.api.crypto.CryptoComponent; @@ -38,9 +39,9 @@ implements InvitationListener { private static final Logger LOG = Logger.getLogger(AddContactActivity.class.getName()); - @Inject private CryptoComponent crypto; - @Inject private InvitationTaskFactory invitationTaskFactory; - @Inject private ReferenceManager referenceManager; + @Inject protected CryptoComponent crypto; + @Inject protected InvitationTaskFactory invitationTaskFactory; + @Inject protected ReferenceManager referenceManager; private AddContactView view = null; private InvitationTask task = null; private long taskHandle = -1; @@ -53,7 +54,7 @@ implements InvitationListener { private String contactName = null; // Fields that are accessed from background threads must be volatile - @Inject private volatile IdentityManager identityManager; + @Inject protected volatile IdentityManager identityManager; @Override public void onCreate(Bundle state) { @@ -138,6 +139,11 @@ implements InvitationListener { } } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + private void showToastAndFinish() { String format = getString(R.string.contact_added_toast); String text = String.format(format, contactName); diff --git a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java index 912d28cce..80a997b26 100644 --- a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java +++ b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java @@ -24,8 +24,6 @@ import java.util.Collection; import javax.inject.Inject; -import roboguice.RoboGuice; - import static android.bluetooth.BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE; import static android.bluetooth.BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION; import static org.briarproject.android.identity.LocalAuthorItem.NEW; @@ -35,7 +33,7 @@ import static org.briarproject.android.invitation.AddContactActivity.REQUEST_CRE class ChooseIdentityView extends AddContactView implements OnItemSelectedListener, OnClickListener { - @Inject private CryptoComponent crypto; + @Inject protected CryptoComponent crypto; private LocalAuthorSpinnerAdapter adapter = null; private Spinner spinner = null; @@ -46,7 +44,8 @@ implements OnItemSelectedListener, OnClickListener { void populate() { removeAllViews(); Context ctx = getContext(); - RoboGuice.injectMembers(ctx, this); + // TODO +// RoboGuice.injectMembers(ctx, this); LayoutInflater inflater = (LayoutInflater) ctx.getSystemService (Context.LAYOUT_INFLATER_SERVICE); diff --git a/briar-android/src/org/briarproject/android/panic/ExitActivity.java b/briar-android/src/org/briarproject/android/panic/ExitActivity.java index 9cfb775d2..4417c1fe8 100644 --- a/briar-android/src/org/briarproject/android/panic/ExitActivity.java +++ b/briar-android/src/org/briarproject/android/panic/ExitActivity.java @@ -3,6 +3,7 @@ package org.briarproject.android.panic; import android.os.Build; import android.os.Bundle; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BaseActivity; import java.util.logging.Logger; @@ -20,4 +21,9 @@ public class ExitActivity extends BaseActivity { LOG.info("Exiting"); System.exit(0); } + + @Override + public void injectActivity(AndroidComponent component) { + + } } \ No newline at end of file diff --git a/briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java b/briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java index 13556f838..c25461c34 100644 --- a/briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java +++ b/briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java @@ -5,6 +5,7 @@ import android.support.v7.app.ActionBar; import android.view.MenuItem; import org.briarproject.R; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; public class PanicPreferencesActivity extends BriarActivity { @@ -22,6 +23,11 @@ public class PanicPreferencesActivity extends BriarActivity { setContentView(R.layout.activity_panic_preferences); } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { onBackPressed(); diff --git a/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java index 2dd25617c..5e71c113f 100644 --- a/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java +++ b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java @@ -7,12 +7,16 @@ import android.os.Build; import android.os.Bundle; import android.support.v7.preference.PreferenceManager; +import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; -import org.briarproject.android.util.AndroidUtils; +import org.briarproject.api.db.DatabaseConfig; +import org.briarproject.util.FileUtils; import org.iilab.IilabEngineeringRSA2048Pin; import java.util.logging.Logger; +import javax.inject.Inject; + import info.guardianproject.GuardianProjectRSA4096; import info.guardianproject.panic.Panic; import info.guardianproject.panic.PanicResponder; @@ -26,6 +30,7 @@ public class PanicResponderActivity extends BriarActivity { private static final Logger LOG = Logger.getLogger(PanicResponderActivity.class.getName()); + @Inject protected DatabaseConfig databaseConfig; @Override public void onCreate(Bundle savedInstanceState) { @@ -95,13 +100,20 @@ public class PanicResponderActivity extends BriarActivity { } } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + private void deleteAllData() { new Thread() { @Override public void run() { clearSharedPrefs(); // TODO somehow delete/shred the database more thoroughly - AndroidUtils.deleteAppData(PanicResponderActivity.this); + FileUtils + .deleteFileOrDir( + databaseConfig.getDatabaseDirectory()); PanicResponder.deleteAllAppData(PanicResponderActivity.this); // nothing left to do after everything is deleted, diff --git a/briar-android/src/org/briarproject/android/util/AuthorView.java b/briar-android/src/org/briarproject/android/util/AuthorView.java index 0f247ce7c..7a5d38f9e 100644 --- a/briar-android/src/org/briarproject/android/util/AuthorView.java +++ b/briar-android/src/org/briarproject/android/util/AuthorView.java @@ -16,11 +16,10 @@ import org.briarproject.api.identity.AuthorId; import javax.inject.Inject; import im.delight.android.identicons.IdenticonDrawable; -import roboguice.RoboGuice; public class AuthorView extends FrameLayout { - @Inject private CryptoComponent crypto; + @Inject protected CryptoComponent crypto; private ImageView avatarView; private TextView nameView; private ImageView statusView; @@ -45,7 +44,6 @@ public class AuthorView extends FrameLayout { } private void initViews() { - RoboGuice.injectMembers(getContext(), this); if (isInEditMode()) return; diff --git a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java index d9625b36a..678725df8 100644 --- a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java +++ b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java @@ -3,7 +3,6 @@ package org.briarproject.plugins; import android.app.Application; import android.content.Context; -import com.google.inject.Provides; import org.briarproject.api.android.AndroidExecutor; import org.briarproject.api.event.EventBus; @@ -24,6 +23,10 @@ import java.util.Collection; import java.util.Collections; import java.util.concurrent.Executor; +import dagger.Module; +import dagger.Provides; + +@Module public class AndroidPluginsModule extends PluginsModule { @Provides diff --git a/briar-android/src/org/briarproject/system/AndroidLocationUtils.java b/briar-android/src/org/briarproject/system/AndroidLocationUtils.java index 3fe05e036..e5907c9c0 100644 --- a/briar-android/src/org/briarproject/system/AndroidLocationUtils.java +++ b/briar-android/src/org/briarproject/system/AndroidLocationUtils.java @@ -6,13 +6,13 @@ import android.content.Context; import android.telephony.TelephonyManager; import android.text.TextUtils; -import com.google.inject.Inject; - import org.briarproject.api.system.LocationUtils; import java.util.Locale; import java.util.logging.Logger; +import javax.inject.Inject; + import static android.content.Context.TELEPHONY_SERVICE; class AndroidLocationUtils implements LocationUtils { diff --git a/briar-android/src/org/briarproject/system/AndroidSystemModule.java b/briar-android/src/org/briarproject/system/AndroidSystemModule.java index 9528cb7db..2cd79468c 100644 --- a/briar-android/src/org/briarproject/system/AndroidSystemModule.java +++ b/briar-android/src/org/briarproject/system/AndroidSystemModule.java @@ -1,18 +1,37 @@ package org.briarproject.system; -import com.google.inject.AbstractModule; + +import android.app.Application; import org.briarproject.api.system.Clock; import org.briarproject.api.system.LocationUtils; import org.briarproject.api.system.SeedProvider; import org.briarproject.api.system.Timer; -public class AndroidSystemModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - protected void configure() { - bind(Clock.class).to(SystemClock.class); - bind(Timer.class).to(SystemTimer.class); - bind(SeedProvider.class).to(AndroidSeedProvider.class); - bind(LocationUtils.class).to(AndroidLocationUtils.class); +@Module +public class AndroidSystemModule { + + @Provides + Clock provideClock() { + return new SystemClock(); } + + @Provides + Timer provideTimer() { + return new SystemTimer(); + } + + @Provides + SeedProvider provideSeedProvider(final Application app) { + return new AndroidSeedProvider(app); + } + + @Provides + LocationUtils provideLocationUtils(final Application app) { + return new AndroidLocationUtils(app); + } + } diff --git a/briar-api/build.gradle b/briar-api/build.gradle index bd5a66093..fc84125c8 100644 --- a/briar-api/build.gradle +++ b/briar-api/build.gradle @@ -9,17 +9,17 @@ repositories { } dependencies { - compile "javax.inject:javax.inject:1" - compile "com.google.inject:guice:3.0:no_aop" + compile "com.google.dagger:dagger:2.0.2" + compile 'com.google.dagger:dagger-compiler:2.0.2' } dependencyVerification { verify = [ - 'javax.inject:javax.inject:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', - 'com.google.inject:guice:7c0624d0986ae2bd7a8f1cf4789bcaae5b82a042a7e3d27ba3041ed7b7f2cd3a', - 'aopalliance:aopalliance:0addec670fedcd3f113c5c8091d783280d23f75e3acb841b61a9cdb079376a08', - 'org.sonatype.sisu.inject:cglib:42e1dfb26becbf1a633f25b47e39fcc422b85e77e4c0468d9a44f885f5fa0be2', - 'asm:asm:333ff5369043975b7e031b8b27206937441854738e038c1f47f98d072a20437a', +// 'javax.inject:javax.inject:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', +// 'com.google.inject:guice:7c0624d0986ae2bd7a8f1cf4789bcaae5b82a042a7e3d27ba3041ed7b7f2cd3a', +// 'aopalliance:aopalliance:0addec670fedcd3f113c5c8091d783280d23f75e3acb841b61a9cdb079376a08', +// 'org.sonatype.sisu.inject:cglib:42e1dfb26becbf1a633f25b47e39fcc422b85e77e4c0468d9a44f885f5fa0be2', +// 'asm:asm:333ff5369043975b7e031b8b27206937441854738e038c1f47f98d072a20437a', ] } diff --git a/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java b/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java index c527c5812..340ee0884 100644 --- a/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java +++ b/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java @@ -5,13 +5,21 @@ import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import com.google.inject.BindingAnnotation; +import javax.inject.Qualifier; + +//import com.google.inject.BindingAnnotation; /** Annotation for injecting the executor for long-running crypto tasks. */ -@BindingAnnotation -@Target({ FIELD, METHOD, PARAMETER }) +//@BindingAnnotation +//@Target({ FIELD, METHOD, PARAMETER }) +//@Retention(RUNTIME) +//public @interface CryptoExecutor {} + +@Qualifier +@Target({FIELD, METHOD, PARAMETER}) @Retention(RUNTIME) public @interface CryptoExecutor {} diff --git a/briar-api/src/org/briarproject/api/db/DatabaseExecutor.java b/briar-api/src/org/briarproject/api/db/DatabaseExecutor.java index 22d04d015..f682121d0 100644 --- a/briar-api/src/org/briarproject/api/db/DatabaseExecutor.java +++ b/briar-api/src/org/briarproject/api/db/DatabaseExecutor.java @@ -8,7 +8,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import com.google.inject.BindingAnnotation; +import javax.inject.Qualifier; /** * Annotation for injecting the executor for database tasks. @@ -17,7 +17,7 @@ import com.google.inject.BindingAnnotation; * they're submitted, tasks are not executed concurrently, and submitting a * task will never block. */ -@BindingAnnotation +@Qualifier @Target({ FIELD, METHOD, PARAMETER }) @Retention(RUNTIME) public @interface DatabaseExecutor {} diff --git a/briar-api/src/org/briarproject/api/lifecycle/IoExecutor.java b/briar-api/src/org/briarproject/api/lifecycle/IoExecutor.java index 01e0ea499..02bc5bf87 100644 --- a/briar-api/src/org/briarproject/api/lifecycle/IoExecutor.java +++ b/briar-api/src/org/briarproject/api/lifecycle/IoExecutor.java @@ -8,10 +8,10 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import com.google.inject.BindingAnnotation; +import javax.inject.Qualifier; /** Annotation for injecting the executor used by long-lived IO tasks. */ -@BindingAnnotation +@Qualifier @Target({ FIELD, METHOD, PARAMETER }) @Retention(RUNTIME) public @interface IoExecutor {} \ No newline at end of file diff --git a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java index 4f5698acf..83de8540d 100644 --- a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java +++ b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java @@ -1,7 +1,5 @@ package org.briarproject.contact; -import com.google.inject.Inject; - import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager; @@ -21,7 +19,22 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +<<<<<<< 08099714bab27d1ed48a8bee431a35a38098ecec class ContactManagerImpl implements ContactManager, RemoveIdentityHook { +======= +import javax.inject.Inject; + +import static java.util.logging.Level.WARNING; +import static org.briarproject.api.db.StorageStatus.ACTIVE; +import static org.briarproject.api.db.StorageStatus.ADDING; +import static org.briarproject.api.db.StorageStatus.REMOVING; + +class ContactManagerImpl implements ContactManager, Service, + RemoveIdentityHook { + + private static final Logger LOG = + Logger.getLogger(ContactManagerImpl.class.getName()); +>>>>>>> Switched Roboguice/Guice out for Dagger 2 private final DatabaseComponent db; private final KeyManager keyManager; diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java index 8e9f3d632..55bb854b3 100644 --- a/briar-core/src/org/briarproject/contact/ContactModule.java +++ b/briar-core/src/org/briarproject/contact/ContactModule.java @@ -1,21 +1,23 @@ package org.briarproject.contact; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - import org.briarproject.api.contact.ContactManager; import org.briarproject.api.identity.IdentityManager; +import org.briarproject.api.lifecycle.LifecycleManager; import javax.inject.Singleton; -public class ContactModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() {} +@Module +public class ContactModule { - @Provides @Singleton - ContactManager getContactManager(IdentityManager identityManager, + @Provides + @Singleton + ContactManager getContactManager(LifecycleManager lifecycleManager, + IdentityManager identityManager, ContactManagerImpl contactManager) { + lifecycleManager.register(contactManager); identityManager.registerRemoveIdentityHook(contactManager); return contactManager; } diff --git a/briar-core/src/org/briarproject/crypto/CryptoModule.java b/briar-core/src/org/briarproject/crypto/CryptoModule.java index 5df7e38f0..04e216b80 100644 --- a/briar-core/src/org/briarproject/crypto/CryptoModule.java +++ b/briar-core/src/org/briarproject/crypto/CryptoModule.java @@ -1,14 +1,12 @@ package org.briarproject.crypto; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.crypto.PasswordStrengthEstimator; import org.briarproject.api.crypto.StreamDecrypterFactory; import org.briarproject.api.crypto.StreamEncrypterFactory; import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.system.SeedProvider; import java.security.SecureRandom; import java.util.concurrent.BlockingQueue; @@ -18,13 +16,20 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; +import javax.inject.Provider; import javax.inject.Singleton; +import dagger.Module; +import dagger.Provides; + import static java.util.concurrent.TimeUnit.SECONDS; -public class CryptoModule extends AbstractModule { +@Module +public class CryptoModule { - /** The maximum number of executor threads. */ + /** + * The maximum number of executor threads. + */ private static final int MAX_EXECUTOR_THREADS = Runtime.getRuntime().availableProcessors(); @@ -41,19 +46,37 @@ public class CryptoModule extends AbstractModule { 60, SECONDS, queue, policy); } - @Override - protected void configure() { - bind(AuthenticatedCipher.class).to( - XSalsa20Poly1305AuthenticatedCipher.class); - bind(CryptoComponent.class).to( - CryptoComponentImpl.class).in(Singleton.class); - bind(PasswordStrengthEstimator.class).to( - PasswordStrengthEstimatorImpl.class); - bind(StreamDecrypterFactory.class).to(StreamDecrypterFactoryImpl.class); - bind(StreamEncrypterFactory.class).to(StreamEncrypterFactoryImpl.class); + @Provides + AuthenticatedCipher provideAuthenticatedCipher() { + return new XSalsa20Poly1305AuthenticatedCipher(); } - @Provides @Singleton @CryptoExecutor + @Provides + @Singleton + CryptoComponent provideCryptoComponent(SeedProvider seedProvider) { + return new CryptoComponentImpl(seedProvider); + } + + @Provides + PasswordStrengthEstimator providePasswordStrengthEstimator() { + return new PasswordStrengthEstimatorImpl(); + } + + @Provides + StreamDecrypterFactory provideStreamDecrypterFactory( + Provider cipherProvider) { + return new StreamDecrypterFactoryImpl(cipherProvider); + } + + @Provides + StreamEncrypterFactory provideStreamEncrypterFactory(CryptoComponent crypto, + Provider cipherProvider) { + return new StreamEncrypterFactoryImpl(crypto, cipherProvider); + } + + @Provides + @Singleton + @CryptoExecutor Executor getCryptoExecutor(LifecycleManager lifecycleManager) { lifecycleManager.registerForShutdown(cryptoExecutor); return cryptoExecutor; @@ -63,4 +86,5 @@ public class CryptoModule extends AbstractModule { SecureRandom getSecureRandom(CryptoComponent crypto) { return crypto.getSecureRandom(); } + } diff --git a/briar-core/src/org/briarproject/data/DataModule.java b/briar-core/src/org/briarproject/data/DataModule.java index c3fe841ae..5c77b8ac7 100644 --- a/briar-core/src/org/briarproject/data/DataModule.java +++ b/briar-core/src/org/briarproject/data/DataModule.java @@ -1,19 +1,35 @@ package org.briarproject.data; -import com.google.inject.AbstractModule; import org.briarproject.api.data.BdfReaderFactory; import org.briarproject.api.data.BdfWriterFactory; import org.briarproject.api.data.MetadataEncoder; import org.briarproject.api.data.MetadataParser; -public class DataModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() { - bind(BdfReaderFactory.class).to(BdfReaderFactoryImpl.class); - bind(BdfWriterFactory.class).to(BdfWriterFactoryImpl.class); - bind(MetadataParser.class).to(MetadataParserImpl.class); - bind(MetadataEncoder.class).to(MetadataEncoderImpl.class); +@Module +public class DataModule { + + @Provides + BdfReaderFactory provideBdfReaderFactory() { + return new BdfReaderFactoryImpl(); } + + @Provides + BdfWriterFactory provideBdfWriterFactory() { + return new BdfWriterFactoryImpl(); + } + + @Provides + MetadataParser provideMetaDataParser() { + return new MetadataParserImpl(); + } + + @Provides + MetadataEncoder provideMetaDataEncoider() { + return new MetadataEncoderImpl(); + } + } diff --git a/briar-core/src/org/briarproject/db/DatabaseModule.java b/briar-core/src/org/briarproject/db/DatabaseModule.java index 6a050ed44..74512c9c0 100644 --- a/briar-core/src/org/briarproject/db/DatabaseModule.java +++ b/briar-core/src/org/briarproject/db/DatabaseModule.java @@ -1,8 +1,5 @@ package org.briarproject.db; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseConfig; import org.briarproject.api.db.DatabaseExecutor; @@ -20,11 +17,16 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; +import javax.inject.Named; import javax.inject.Singleton; +import dagger.Module; +import dagger.Provides; + import static java.util.concurrent.TimeUnit.SECONDS; -public class DatabaseModule extends AbstractModule { +@Module +public class DatabaseModule { private final ExecutorService databaseExecutor; @@ -39,30 +41,28 @@ public class DatabaseModule extends AbstractModule { policy); } - @Override - protected void configure() {} - - @Provides @Singleton - Database getDatabase(DatabaseConfig config, + @Provides + @Singleton + Database provideDatabase(DatabaseConfig config, SecureRandom random, Clock clock) { return new H2Database(config, random, clock); } @Provides @Singleton - DatabaseComponent getDatabaseComponent(Database db, + DatabaseComponent provideDatabaseComponent(Database db, EventBus eventBus, ShutdownManager shutdown) { return new DatabaseComponentImpl(db, Connection.class, eventBus, shutdown); } @Provides @Singleton @DatabaseExecutor - ExecutorService getDatabaseExecutor(LifecycleManager lifecycleManager) { + ExecutorService provideDatabaseExecutorService(LifecycleManager lifecycleManager) { lifecycleManager.registerForShutdown(databaseExecutor); return databaseExecutor; } @Provides @Singleton @DatabaseExecutor - Executor getDatabaseExecutor(@DatabaseExecutor ExecutorService dbExecutor) { + Executor provideDatabaseExecutor(@DatabaseExecutor ExecutorService dbExecutor) { return dbExecutor; } } diff --git a/briar-core/src/org/briarproject/event/EventModule.java b/briar-core/src/org/briarproject/event/EventModule.java index 34aa23eb6..e7f92f037 100644 --- a/briar-core/src/org/briarproject/event/EventModule.java +++ b/briar-core/src/org/briarproject/event/EventModule.java @@ -2,13 +2,17 @@ package org.briarproject.event; import org.briarproject.api.event.EventBus; -import com.google.inject.AbstractModule; -import com.google.inject.Singleton; +import javax.inject.Singleton; -public class EventModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() { - bind(EventBus.class).to(EventBusImpl.class).in(Singleton.class); +@Module +public class EventModule { + + @Provides + @Singleton + EventBus provideEventBus() { + return new EventBusImpl(); } } diff --git a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumManagerImpl.java index fe51b778b..534369d2d 100644 --- a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java +++ b/briar-core/src/org/briarproject/forum/ForumManagerImpl.java @@ -1,14 +1,15 @@ package org.briarproject.forum; -import com.google.inject.Inject; - import org.briarproject.api.FormatException; -import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.Contact; import org.briarproject.api.data.BdfDictionary; -import org.briarproject.api.data.BdfList; +import org.briarproject.api.data.BdfReader; +import org.briarproject.api.data.BdfReaderFactory; +import org.briarproject.api.data.MetadataEncoder; +import org.briarproject.api.data.MetadataParser; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; +import org.briarproject.api.db.Metadata; import org.briarproject.api.db.Transaction; import org.briarproject.api.forum.Forum; import org.briarproject.api.forum.ForumManager; @@ -23,6 +24,8 @@ import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; import org.briarproject.util.StringUtils; +import java.io.ByteArrayInputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -31,10 +34,18 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.logging.Logger; +import javax.inject.Inject; + +import static java.util.logging.Level.WARNING; +import static org.briarproject.api.forum.ForumConstants.FORUM_SALT_LENGTH; +import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH; +import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_POST_BODY_LENGTH; import static org.briarproject.api.identity.Author.Status.ANONYMOUS; import static org.briarproject.api.identity.Author.Status.UNKNOWN; import static org.briarproject.api.identity.Author.Status.VERIFIED; +import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; class ForumManagerImpl implements ForumManager { @@ -42,13 +53,21 @@ class ForumManagerImpl implements ForumManager { "859a7be50dca035b64bd6902fb797097" + "795af837abbf8c16d750b3c2ccc186ea")); + private static final Logger LOG = + Logger.getLogger(ForumManagerImpl.class.getName()); + private final DatabaseComponent db; - private final ClientHelper clientHelper; + private final BdfReaderFactory bdfReaderFactory; + private final MetadataEncoder metadataEncoder; + private final MetadataParser metadataParser; @Inject - ForumManagerImpl(DatabaseComponent db, ClientHelper clientHelper) { + ForumManagerImpl(DatabaseComponent db, BdfReaderFactory bdfReaderFactory, + MetadataEncoder metadataEncoder, MetadataParser metadataParser) { this.db = db; - this.clientHelper = clientHelper; + this.bdfReaderFactory = bdfReaderFactory; + this.metadataEncoder = metadataEncoder; + this.metadataParser = metadataParser; } @Override @@ -59,21 +78,29 @@ class ForumManagerImpl implements ForumManager { @Override public void addLocalPost(ForumPost p) throws DbException { try { - BdfDictionary meta = new BdfDictionary(); - meta.put("timestamp", p.getMessage().getTimestamp()); - if (p.getParent() != null) meta.put("parent", p.getParent()); + BdfDictionary d = new BdfDictionary(); + d.put("timestamp", p.getMessage().getTimestamp()); + if (p.getParent() != null) + d.put("parent", p.getParent().getBytes()); if (p.getAuthor() != null) { Author a = p.getAuthor(); - BdfDictionary authorMeta = new BdfDictionary(); - authorMeta.put("id", a.getId()); - authorMeta.put("name", a.getName()); - authorMeta.put("publicKey", a.getPublicKey()); - meta.put("author", authorMeta); + BdfDictionary d1 = new BdfDictionary(); + d1.put("id", a.getId().getBytes()); + d1.put("name", a.getName()); + d1.put("publicKey", a.getPublicKey()); + d.put("author", d1); + } + d.put("contentType", p.getContentType()); + d.put("local", true); + d.put("read", true); + Metadata meta = metadataEncoder.encode(d); + Transaction txn = db.startTransaction(); + try { + db.addLocalMessage(txn, p.getMessage(), CLIENT_ID, meta, true); + txn.setComplete(); + } finally { + db.endTransaction(txn); } - meta.put("contentType", p.getContentType()); - meta.put("local", true); - meta.put("read", true); - clientHelper.addLocalMessage(p.getMessage(), CLIENT_ID, meta, true); } catch (FormatException e) { throw new RuntimeException(e); } @@ -118,11 +145,34 @@ class ForumManagerImpl implements ForumManager { @Override public byte[] getPostBody(MessageId m) throws DbException { try { - // Parent ID, author, content type, forum post body, signature - BdfList message = clientHelper.getMessageAsList(m); - return message.getRaw(3); + byte[] raw; + Transaction txn = db.startTransaction(); + try { + raw = db.getRawMessage(txn, m); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } + ByteArrayInputStream in = new ByteArrayInputStream(raw, + MESSAGE_HEADER_LENGTH, raw.length - MESSAGE_HEADER_LENGTH); + BdfReader r = bdfReaderFactory.createReader(in); + r.readListStart(); + if (r.hasRaw()) r.skipRaw(); // Parent ID + else r.skipNull(); // No parent + if (r.hasList()) r.skipList(); // Author + else r.skipNull(); // No author + r.skipString(); // Content type + byte[] postBody = r.readRaw(MAX_FORUM_POST_BODY_LENGTH); + if (r.hasRaw()) r.skipRaw(); // Signature + else r.skipNull(); + r.readListEnd(); + if (!r.eof()) throw new FormatException(); + return postBody; } catch (FormatException e) { throw new DbException(e); + } catch (IOException e) { + // Shouldn't happen with ByteArrayInputStream + throw new RuntimeException(e); } } @@ -131,7 +181,7 @@ class ForumManagerImpl implements ForumManager { throws DbException { Set localAuthorIds = new HashSet(); Set contactAuthorIds = new HashSet(); - Map metadata; + Map metadata; Transaction txn = db.startTransaction(); try { // Load the IDs of the user's identities @@ -141,22 +191,20 @@ class ForumManagerImpl implements ForumManager { for (Contact c : db.getContacts(txn)) contactAuthorIds.add(c.getAuthor().getId()); // Load the metadata - metadata = clientHelper.getMessageMetadataAsDictionary(txn, g); + metadata = db.getMessageMetadata(txn, g); txn.setComplete(); - } catch (FormatException e) { - throw new DbException(e); } finally { db.endTransaction(txn); } // Parse the metadata Collection headers = new ArrayList(); - for (Entry entry : metadata.entrySet()) { + for (Entry e : metadata.entrySet()) { try { - BdfDictionary meta = entry.getValue(); - long timestamp = meta.getLong("timestamp"); + BdfDictionary d = metadataParser.parse(e.getValue()); + long timestamp = d.getLong("timestamp"); Author author = null; Author.Status authorStatus = ANONYMOUS; - BdfDictionary d1 = meta.getDictionary("author", null); + BdfDictionary d1 = d.getDictionary("author", null); if (d1 != null) { AuthorId authorId = new AuthorId(d1.getRaw("id")); String name = d1.getString("name"); @@ -168,12 +216,13 @@ class ForumManagerImpl implements ForumManager { authorStatus = VERIFIED; else authorStatus = UNKNOWN; } - String contentType = meta.getString("contentType"); - boolean read = meta.getBoolean("read"); - headers.add(new ForumPostHeader(entry.getKey(), timestamp, - author, authorStatus, contentType, read)); - } catch (FormatException e) { - throw new DbException(e); + String contentType = d.getString("contentType"); + boolean read = d.getBoolean("read"); + headers.add(new ForumPostHeader(e.getKey(), timestamp, author, + authorStatus, contentType, read)); + } catch (FormatException ex) { + if (LOG.isLoggable(WARNING)) + LOG.log(WARNING, ex.toString(), ex); } } return headers; @@ -182,18 +231,36 @@ class ForumManagerImpl implements ForumManager { @Override public void setReadFlag(MessageId m, boolean read) throws DbException { try { - BdfDictionary meta = new BdfDictionary(); - meta.put("read", read); - clientHelper.mergeMessageMetadata(m, meta); + BdfDictionary d = new BdfDictionary(); + d.put("read", read); + Metadata meta = metadataEncoder.encode(d); + Transaction txn = db.startTransaction(); + try { + db.mergeMessageMetadata(txn, m, meta); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } } catch (FormatException e) { throw new RuntimeException(e); } } private Forum parseForum(Group g) throws FormatException { - byte[] descriptor = g.getDescriptor(); - // Name, salt - BdfList forum = clientHelper.toList(descriptor, 0, descriptor.length); - return new Forum(g, forum.getString(0), forum.getRaw(1)); + ByteArrayInputStream in = new ByteArrayInputStream(g.getDescriptor()); + BdfReader r = bdfReaderFactory.createReader(in); + try { + r.readListStart(); + String name = r.readString(MAX_FORUM_NAME_LENGTH); + byte[] salt = r.readRaw(FORUM_SALT_LENGTH); + r.readListEnd(); + if (!r.eof()) throw new FormatException(); + return new Forum(g, name, salt); + } catch (FormatException e) { + throw e; + } catch (IOException e) { + // Shouldn't happen with ByteArrayInputStream + throw new RuntimeException(e); + } } } diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java index 19e7ce06f..e58b7e2a0 100644 --- a/briar-core/src/org/briarproject/forum/ForumModule.java +++ b/briar-core/src/org/briarproject/forum/ForumModule.java @@ -1,54 +1,80 @@ package org.briarproject.forum; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - -import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.CryptoComponent; +import org.briarproject.api.data.BdfReaderFactory; +import org.briarproject.api.data.BdfWriterFactory; import org.briarproject.api.data.MetadataEncoder; +import org.briarproject.api.data.MetadataParser; +import org.briarproject.api.data.ObjectReader; +import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.forum.ForumManager; import org.briarproject.api.forum.ForumPostFactory; import org.briarproject.api.forum.ForumSharingManager; -import org.briarproject.api.identity.AuthorFactory; +import org.briarproject.api.identity.Author; +import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; import javax.inject.Singleton; -public class ForumModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() { - bind(ForumManager.class).to(ForumManagerImpl.class).in(Singleton.class); - bind(ForumPostFactory.class).to(ForumPostFactoryImpl.class); +@Module +public class ForumModule { + + @Provides + @Singleton + ForumManager provideForumManager(DatabaseComponent db, + ContactManager contactManager, + BdfReaderFactory bdfReaderFactory, MetadataEncoder metadataEncoder, + MetadataParser metadataParser) { + return new ForumManagerImpl(db, contactManager, bdfReaderFactory, + metadataEncoder, metadataParser); } - @Provides @Singleton - ForumPostValidator getForumPostValidator( + @Provides + ForumPostFactory provideForumPostFactory(CryptoComponent crypto, + MessageFactory messageFactory, + BdfWriterFactory bdfWriterFactory) { + return new ForumPostFactoryImpl(crypto, messageFactory, + bdfWriterFactory); + } + + @Provides + @Singleton + ForumPostValidator provideForumPostValidator( ValidationManager validationManager, CryptoComponent crypto, - AuthorFactory authorFactory, ClientHelper clientHelper, - MetadataEncoder metadataEncoder, Clock clock) { + BdfReaderFactory bdfReaderFactory, + BdfWriterFactory bdfWriterFactory, + ObjectReader authorReader, MetadataEncoder metadataEncoder, + Clock clock) { ForumPostValidator validator = new ForumPostValidator(crypto, - authorFactory, clientHelper, metadataEncoder, clock); + bdfReaderFactory, bdfWriterFactory, authorReader, + metadataEncoder, clock); validationManager.registerMessageValidator( ForumManagerImpl.CLIENT_ID, validator); return validator; } - @Provides @Singleton - ForumListValidator getForumListValidator( - ValidationManager validationManager, ClientHelper clientHelper, - MetadataEncoder metadataEncoder, Clock clock) { - ForumListValidator validator = new ForumListValidator(clientHelper, - metadataEncoder, clock); + @Provides + @Singleton + ForumListValidator provideForumListValidator( + ValidationManager validationManager, + BdfReaderFactory bdfReaderFactory, + MetadataEncoder metadataEncoder) { + ForumListValidator validator = new ForumListValidator(bdfReaderFactory, + metadataEncoder); validationManager.registerMessageValidator( ForumSharingManagerImpl.CLIENT_ID, validator); return validator; } - @Provides @Singleton - ForumSharingManager getForumSharingManager(ContactManager contactManager, + @Provides + @Singleton + ForumSharingManager provideForumSharingManager( + ContactManager contactManager, ValidationManager validationManager, ForumSharingManagerImpl forumSharingManager) { contactManager.registerAddContactHook(forumSharingManager); diff --git a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java index aa083679d..c916a54e6 100644 --- a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java +++ b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java @@ -1,7 +1,5 @@ package org.briarproject.forum; -import com.google.inject.Inject; - import org.briarproject.api.FormatException; import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.PrivateGroupFactory; @@ -39,6 +37,12 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +<<<<<<< 08099714bab27d1ed48a8bee431a35a38098ecec +======= +import javax.inject.Inject; + +import static java.util.logging.Level.WARNING; +>>>>>>> Switched Roboguice/Guice out for Dagger 2 import static org.briarproject.api.forum.ForumConstants.FORUM_SALT_LENGTH; import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH; import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; diff --git a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java index 0ae2e5aa5..a35a85f6d 100644 --- a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java +++ b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java @@ -1,7 +1,5 @@ package org.briarproject.identity; -import com.google.inject.Inject; - import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; @@ -13,7 +11,21 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +<<<<<<< 08099714bab27d1ed48a8bee431a35a38098ecec class IdentityManagerImpl implements IdentityManager { +======= +import javax.inject.Inject; + +import static java.util.logging.Level.WARNING; +import static org.briarproject.api.db.StorageStatus.ACTIVE; +import static org.briarproject.api.db.StorageStatus.ADDING; +import static org.briarproject.api.db.StorageStatus.REMOVING; + +class IdentityManagerImpl implements IdentityManager, Service { + + private static final Logger LOG = + Logger.getLogger(IdentityManagerImpl.class.getName()); +>>>>>>> Switched Roboguice/Guice out for Dagger 2 private final DatabaseComponent db; private final List addHooks; diff --git a/briar-core/src/org/briarproject/identity/IdentityModule.java b/briar-core/src/org/briarproject/identity/IdentityModule.java index c987a8a55..78d2b776c 100644 --- a/briar-core/src/org/briarproject/identity/IdentityModule.java +++ b/briar-core/src/org/briarproject/identity/IdentityModule.java @@ -1,23 +1,20 @@ package org.briarproject.identity; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - -import org.briarproject.api.data.ObjectReader; -import org.briarproject.api.identity.Author; -import org.briarproject.api.identity.AuthorFactory; +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.event.EventBus; import org.briarproject.api.identity.IdentityManager; -public class IdentityModule extends AbstractModule { +import javax.inject.Singleton; - @Override - protected void configure() { - bind(AuthorFactory.class).to(AuthorFactoryImpl.class); - bind(IdentityManager.class).to(IdentityManagerImpl.class); - } +import dagger.Module; +import dagger.Provides; + +@Module +public class IdentityModule { @Provides - ObjectReader getAuthorReader(AuthorFactory authorFactory) { - return new AuthorReader(authorFactory); + @Singleton + IdentityManager provideIdendityModule(DatabaseComponent db, EventBus eventBus) { + return new IdentityManagerImpl(db, eventBus); } } diff --git a/briar-core/src/org/briarproject/invitation/InvitationModule.java b/briar-core/src/org/briarproject/invitation/InvitationModule.java index 057ec9732..de6d8bde2 100644 --- a/briar-core/src/org/briarproject/invitation/InvitationModule.java +++ b/briar-core/src/org/briarproject/invitation/InvitationModule.java @@ -2,14 +2,41 @@ package org.briarproject.invitation; import javax.inject.Singleton; +import org.briarproject.api.contact.ContactManager; +import org.briarproject.api.crypto.CryptoComponent; +import org.briarproject.api.data.BdfReaderFactory; +import org.briarproject.api.data.BdfWriterFactory; +import org.briarproject.api.identity.AuthorFactory; +import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.invitation.InvitationTaskFactory; +import org.briarproject.api.plugins.ConnectionManager; +import org.briarproject.api.plugins.PluginManager; +import org.briarproject.api.sync.GroupFactory; +import org.briarproject.api.system.Clock; +import org.briarproject.api.transport.KeyManager; +import org.briarproject.api.transport.StreamReaderFactory; +import org.briarproject.api.transport.StreamWriterFactory; -import com.google.inject.AbstractModule; +import dagger.Module; +import dagger.Provides; -public class InvitationModule extends AbstractModule { +@Module +public class InvitationModule { - protected void configure() { - bind(InvitationTaskFactory.class).to( - InvitationTaskFactoryImpl.class).in(Singleton.class); + @Provides + @Singleton + InvitationTaskFactory provideInvitationTaskFactory(CryptoComponent crypto, + BdfReaderFactory bdfReaderFactory, + BdfWriterFactory bdfWriterFactory, + StreamReaderFactory streamReaderFactory, + StreamWriterFactory streamWriterFactory, + AuthorFactory authorFactory, GroupFactory groupFactory, + KeyManager keyManager, ConnectionManager connectionManager, + IdentityManager identityManager, ContactManager contactManager, + Clock clock, PluginManager pluginManager) { + return new InvitationTaskFactoryImpl(crypto, bdfReaderFactory, + bdfWriterFactory, streamReaderFactory, streamWriterFactory, + authorFactory, groupFactory, keyManager, connectionManager, + identityManager, contactManager, clock, pluginManager); } } diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java index 0714a0555..5685dd2a2 100644 --- a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java +++ b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java @@ -11,14 +11,18 @@ import java.util.concurrent.ThreadPoolExecutor; import javax.inject.Singleton; +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.ShutdownManager; +import org.briarproject.api.system.Clock; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; +import dagger.Module; +import dagger.Provides; -public class LifecycleModule extends AbstractModule { +@Module +public class LifecycleModule { private final ExecutorService ioExecutor; @@ -33,17 +37,25 @@ public class LifecycleModule extends AbstractModule { 60, SECONDS, queue, policy); } - @Override - protected void configure() { - bind(LifecycleManager.class).to( - LifecycleManagerImpl.class).in(Singleton.class); - bind(ShutdownManager.class).to( - ShutdownManagerImpl.class).in(Singleton.class); + @Provides + @Singleton + ShutdownManager provideShutdownManager() { + return new ShutdownManagerImpl(); } - @Provides @Singleton @IoExecutor + @Provides + @Singleton + LifecycleManager provideLifeCycleManager(Clock clock, DatabaseComponent db, + EventBus eventBus) { + return new LifecycleManagerImpl(clock, db, eventBus); + } + + @Provides + @Singleton + @IoExecutor Executor getIoExecutor(LifecycleManager lifecycleManager) { lifecycleManager.registerForShutdown(ioExecutor); return ioExecutor; } + } diff --git a/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java b/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java index 928b793bf..657126053 100644 --- a/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java +++ b/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java @@ -1,18 +1,19 @@ package org.briarproject.messaging; -import com.google.inject.Inject; - import org.briarproject.api.FormatException; -import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.PrivateGroupFactory; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager.AddContactHook; import org.briarproject.api.contact.ContactManager.RemoveContactHook; import org.briarproject.api.data.BdfDictionary; -import org.briarproject.api.data.BdfList; +import org.briarproject.api.data.BdfReader; +import org.briarproject.api.data.BdfReaderFactory; +import org.briarproject.api.data.MetadataEncoder; +import org.briarproject.api.data.MetadataParser; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; +import org.briarproject.api.db.Metadata; import org.briarproject.api.db.Transaction; import org.briarproject.api.messaging.MessagingManager; import org.briarproject.api.messaging.PrivateMessage; @@ -24,9 +25,18 @@ import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageStatus; import org.briarproject.util.StringUtils; +import java.io.ByteArrayInputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Map; +import java.util.logging.Logger; + +import javax.inject.Inject; + +import static java.util.logging.Level.WARNING; +import static org.briarproject.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_BODY_LENGTH; +import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; class MessagingManagerImpl implements MessagingManager, AddContactHook, RemoveContactHook { @@ -35,16 +45,25 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, "6bcdc006c0910b0f44e40644c3b31f1a" + "8bf9a6d6021d40d219c86b731b903070")); + private static final Logger LOG = + Logger.getLogger(MessagingManagerImpl.class.getName()); + private final DatabaseComponent db; - private final ClientHelper clientHelper; private final PrivateGroupFactory privateGroupFactory; + private final BdfReaderFactory bdfReaderFactory; + private final MetadataEncoder metadataEncoder; + private final MetadataParser metadataParser; @Inject - MessagingManagerImpl(DatabaseComponent db, ClientHelper clientHelper, - PrivateGroupFactory privateGroupFactory) { + MessagingManagerImpl(DatabaseComponent db, + PrivateGroupFactory privateGroupFactory, + BdfReaderFactory bdfReaderFactory, MetadataEncoder metadataEncoder, + MetadataParser metadataParser) { this.db = db; - this.clientHelper = clientHelper; this.privateGroupFactory = privateGroupFactory; + this.bdfReaderFactory = bdfReaderFactory; + this.metadataEncoder = metadataEncoder; + this.metadataParser = metadataParser; } @Override @@ -58,7 +77,7 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, // Attach the contact ID to the group BdfDictionary d = new BdfDictionary(); d.put("contactId", c.getId().getInt()); - clientHelper.mergeGroupMetadata(txn, g.getId(), d); + db.mergeGroupMetadata(txn, g.getId(), metadataEncoder.encode(d)); } catch (FormatException e) { throw new RuntimeException(e); } @@ -81,13 +100,21 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, @Override public void addLocalMessage(PrivateMessage m) throws DbException { try { - BdfDictionary meta = new BdfDictionary(); - meta.put("timestamp", m.getMessage().getTimestamp()); - if (m.getParent() != null) meta.put("parent", m.getParent()); - meta.put("contentType", m.getContentType()); - meta.put("local", true); - meta.put("read", true); - clientHelper.addLocalMessage(m.getMessage(), CLIENT_ID, meta, true); + BdfDictionary d = new BdfDictionary(); + d.put("timestamp", m.getMessage().getTimestamp()); + if (m.getParent() != null) + d.put("parent", m.getParent().getBytes()); + d.put("contentType", m.getContentType()); + d.put("local", true); + d.put("read", true); + Metadata meta = metadataEncoder.encode(d); + Transaction txn = db.startTransaction(); + try { + db.addLocalMessage(txn, m.getMessage(), CLIENT_ID, meta, true); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } } catch (FormatException e) { throw new RuntimeException(e); } @@ -96,8 +123,16 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, @Override public ContactId getContactId(GroupId g) throws DbException { try { - BdfDictionary meta = clientHelper.getGroupMetadataAsDictionary(g); - return new ContactId(meta.getLong("contactId").intValue()); + Metadata meta; + Transaction txn = db.startTransaction(); + try { + meta = db.getGroupMetadata(txn, g); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } + BdfDictionary d = metadataParser.parse(meta); + return new ContactId(d.getLong("contactId").intValue()); } catch (FormatException e) { throw new DbException(e); } @@ -119,16 +154,14 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, @Override public Collection getMessageHeaders(ContactId c) throws DbException { - Map metadata; + Map metadata; Collection statuses; Transaction txn = db.startTransaction(); try { GroupId g = getContactGroup(db.getContact(txn, c)).getId(); - metadata = clientHelper.getMessageMetadataAsDictionary(txn, g); + metadata = db.getMessageMetadata(txn, g); statuses = db.getMessageStatus(txn, c, g); txn.setComplete(); - } catch (FormatException e) { - throw new DbException(e); } finally { db.endTransaction(txn); } @@ -136,17 +169,18 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, new ArrayList(); for (MessageStatus s : statuses) { MessageId id = s.getMessageId(); - BdfDictionary meta = metadata.get(id); - if (meta == null) continue; + Metadata m = metadata.get(id); + if (m == null) continue; try { - long timestamp = meta.getLong("timestamp"); - String contentType = meta.getString("contentType"); - boolean local = meta.getBoolean("local"); - boolean read = meta.getBoolean("read"); + BdfDictionary d = metadataParser.parse(m); + long timestamp = d.getLong("timestamp"); + String contentType = d.getString("contentType"); + boolean local = d.getBoolean("local"); + boolean read = d.getBoolean("read"); headers.add(new PrivateMessageHeader(id, timestamp, contentType, local, read, s.isSent(), s.isSeen())); } catch (FormatException e) { - throw new DbException(e); + if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); } } return headers; @@ -154,21 +188,47 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, @Override public byte[] getMessageBody(MessageId m) throws DbException { + byte[] raw; + Transaction txn = db.startTransaction(); try { - // Parent ID, content type, private message body - BdfList message = clientHelper.getMessageAsList(m); - return message.getRaw(2); + raw = db.getRawMessage(txn, m); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } + ByteArrayInputStream in = new ByteArrayInputStream(raw, + MESSAGE_HEADER_LENGTH, raw.length - MESSAGE_HEADER_LENGTH); + BdfReader r = bdfReaderFactory.createReader(in); + try { + r.readListStart(); + if (r.hasRaw()) r.skipRaw(); // Parent ID + else r.skipNull(); // No parent + r.skipString(); // Content type + byte[] messageBody = r.readRaw(MAX_PRIVATE_MESSAGE_BODY_LENGTH); + r.readListEnd(); + if (!r.eof()) throw new FormatException(); + return messageBody; } catch (FormatException e) { throw new DbException(e); + } catch (IOException e) { + // Shouldn't happen with ByteArrayInputStream + throw new RuntimeException(e); } } @Override public void setReadFlag(MessageId m, boolean read) throws DbException { try { - BdfDictionary meta = new BdfDictionary(); - meta.put("read", read); - clientHelper.mergeMessageMetadata(m, meta); + BdfDictionary d = new BdfDictionary(); + d.put("read", read); + Metadata meta = metadataEncoder.encode(d); + Transaction txn = db.startTransaction(); + try { + db.mergeMessageMetadata(txn, m, meta); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } } catch (FormatException e) { throw new RuntimeException(e); } diff --git a/briar-core/src/org/briarproject/messaging/MessagingModule.java b/briar-core/src/org/briarproject/messaging/MessagingModule.java index 4ea10f907..89c748a59 100644 --- a/briar-core/src/org/briarproject/messaging/MessagingModule.java +++ b/briar-core/src/org/briarproject/messaging/MessagingModule.java @@ -1,38 +1,46 @@ package org.briarproject.messaging; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - -import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.ContactManager; +import org.briarproject.api.data.BdfReaderFactory; +import org.briarproject.api.data.BdfWriterFactory; import org.briarproject.api.data.MetadataEncoder; import org.briarproject.api.messaging.MessagingManager; import org.briarproject.api.messaging.PrivateMessageFactory; +import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; import javax.inject.Singleton; +import dagger.Module; +import dagger.Provides; + import static org.briarproject.messaging.MessagingManagerImpl.CLIENT_ID; -public class MessagingModule extends AbstractModule { +@Module +public class MessagingModule { - @Override - protected void configure() { - bind(PrivateMessageFactory.class).to(PrivateMessageFactoryImpl.class); + @Provides + PrivateMessageFactory providePrivateMessageFactory( + MessageFactory messageFactory, + BdfWriterFactory bdfWriterFactory) { + return new PrivateMessageFactoryImpl(messageFactory, bdfWriterFactory); } - @Provides @Singleton + + @Provides + @Singleton PrivateMessageValidator getValidator(ValidationManager validationManager, - ClientHelper clientHelper, MetadataEncoder metadataEncoder, + BdfReaderFactory bdfReaderFactory, MetadataEncoder metadataEncoder, Clock clock) { PrivateMessageValidator validator = new PrivateMessageValidator( - clientHelper, metadataEncoder, clock); + bdfReaderFactory, metadataEncoder, clock); validationManager.registerMessageValidator(CLIENT_ID, validator); return validator; } - @Provides @Singleton + @Provides + @Singleton MessagingManager getMessagingManager(ContactManager contactManager, MessagingManagerImpl messagingManager) { contactManager.registerAddContactHook(messagingManager); diff --git a/briar-core/src/org/briarproject/plugins/ConnectionRegistryImpl.java b/briar-core/src/org/briarproject/plugins/ConnectionRegistryImpl.java index 245a37dbb..86cfab5a1 100644 --- a/briar-core/src/org/briarproject/plugins/ConnectionRegistryImpl.java +++ b/briar-core/src/org/briarproject/plugins/ConnectionRegistryImpl.java @@ -1,7 +1,5 @@ package org.briarproject.plugins; -import com.google.inject.Inject; - import org.briarproject.api.TransportId; import org.briarproject.api.contact.ContactId; import org.briarproject.api.event.ContactConnectedEvent; @@ -19,6 +17,8 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Logger; +import javax.inject.Inject; + import static java.util.logging.Level.INFO; class ConnectionRegistryImpl implements ConnectionRegistry { diff --git a/briar-core/src/org/briarproject/plugins/PluginsModule.java b/briar-core/src/org/briarproject/plugins/PluginsModule.java index d7f8962d7..67f27b08b 100644 --- a/briar-core/src/org/briarproject/plugins/PluginsModule.java +++ b/briar-core/src/org/briarproject/plugins/PluginsModule.java @@ -1,28 +1,54 @@ package org.briarproject.plugins; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - -import org.briarproject.api.lifecycle.LifecycleManager; -import org.briarproject.api.plugins.BackoffFactory; -import org.briarproject.api.plugins.ConnectionManager; -import org.briarproject.api.plugins.ConnectionRegistry; -import org.briarproject.api.plugins.PluginManager; - import javax.inject.Singleton; -public class PluginsModule extends AbstractModule { +import org.briarproject.api.event.EventBus; +import org.briarproject.api.lifecycle.IoExecutor; +import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.plugins.ConnectionManager; +import org.briarproject.api.plugins.ConnectionRegistry; +import org.briarproject.api.plugins.PluginManager; +import org.briarproject.api.sync.SyncSessionFactory; +import org.briarproject.api.system.Timer; +import org.briarproject.api.transport.KeyManager; +import org.briarproject.api.transport.StreamReaderFactory; +import org.briarproject.api.transport.StreamWriterFactory; - @Override - protected void configure() { - bind(BackoffFactory.class).to(BackoffFactoryImpl.class); - bind(Poller.class).to(PollerImpl.class); - bind(ConnectionManager.class).to(ConnectionManagerImpl.class); - bind(ConnectionRegistry.class).to( - ConnectionRegistryImpl.class).in(Singleton.class); +import java.util.concurrent.Executor; + +import dagger.Module; +import dagger.Provides; + + +@Module +public class PluginsModule { + + @Provides + Poller providePoller(@IoExecutor Executor ioExecutor, + ConnectionRegistry connectionRegistry, Timer timer) { + return new PollerImpl(ioExecutor, connectionRegistry, timer); } - @Provides @Singleton + @Provides + ConnectionManager provideConnectionManager( + @IoExecutor Executor ioExecutor, + KeyManager keyManager, StreamReaderFactory streamReaderFactory, + StreamWriterFactory streamWriterFactory, + SyncSessionFactory syncSessionFactory, + ConnectionRegistry connectionRegistry) { + return new ConnectionManagerImpl(ioExecutor, keyManager, + streamReaderFactory, streamWriterFactory, syncSessionFactory, + connectionRegistry); + } + + @Provides + @Singleton + ConnectionRegistry provideConnectionRegistry(EventBus eventBus) { + return new ConnectionRegistryImpl(eventBus); + } + + @Provides + @Singleton PluginManager getPluginManager(LifecycleManager lifecycleManager, PluginManagerImpl pluginManager) { lifecycleManager.register(pluginManager); diff --git a/briar-core/src/org/briarproject/properties/PropertiesModule.java b/briar-core/src/org/briarproject/properties/PropertiesModule.java index cd40134de..057f685ba 100644 --- a/briar-core/src/org/briarproject/properties/PropertiesModule.java +++ b/briar-core/src/org/briarproject/properties/PropertiesModule.java @@ -1,10 +1,7 @@ package org.briarproject.properties; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - -import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.ContactManager; +import org.briarproject.api.data.BdfReaderFactory; import org.briarproject.api.data.MetadataEncoder; import org.briarproject.api.properties.TransportPropertyManager; import org.briarproject.api.sync.ValidationManager; @@ -12,19 +9,21 @@ import org.briarproject.api.system.Clock; import javax.inject.Singleton; +import dagger.Module; +import dagger.Provides; + import static org.briarproject.properties.TransportPropertyManagerImpl.CLIENT_ID; -public class PropertiesModule extends AbstractModule { +@Module +public class PropertiesModule { - @Override - protected void configure() {} - - @Provides @Singleton + @Provides + @Singleton TransportPropertyValidator getValidator(ValidationManager validationManager, - ClientHelper clientHelper, MetadataEncoder metadataEncoder, + BdfReaderFactory bdfReaderFactory, MetadataEncoder metadataEncoder, Clock clock) { TransportPropertyValidator validator = new TransportPropertyValidator( - clientHelper, metadataEncoder, clock); + bdfReaderFactory, metadataEncoder, clock); validationManager.registerMessageValidator(CLIENT_ID, validator); return validator; } diff --git a/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java b/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java index 9c04d99fe..6bf9b5281 100644 --- a/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java +++ b/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java @@ -1,20 +1,23 @@ package org.briarproject.properties; -import com.google.inject.Inject; - import org.briarproject.api.DeviceId; import org.briarproject.api.FormatException; import org.briarproject.api.TransportId; -import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.PrivateGroupFactory; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager.AddContactHook; import org.briarproject.api.contact.ContactManager.RemoveContactHook; import org.briarproject.api.data.BdfDictionary; -import org.briarproject.api.data.BdfList; +import org.briarproject.api.data.BdfReader; +import org.briarproject.api.data.BdfReaderFactory; +import org.briarproject.api.data.BdfWriter; +import org.briarproject.api.data.BdfWriterFactory; +import org.briarproject.api.data.MetadataEncoder; +import org.briarproject.api.data.MetadataParser; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; +import org.briarproject.api.db.Metadata; import org.briarproject.api.db.NoSuchGroupException; import org.briarproject.api.db.Transaction; import org.briarproject.api.properties.TransportProperties; @@ -24,15 +27,24 @@ import org.briarproject.api.sync.Group; import org.briarproject.api.sync.GroupFactory; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.Message; +import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.MessageId; import org.briarproject.api.system.Clock; import org.briarproject.util.StringUtils; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import javax.inject.Inject; + +import static org.briarproject.api.properties.TransportPropertyConstants.MAX_PROPERTY_LENGTH; +import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; + class TransportPropertyManagerImpl implements TransportPropertyManager, AddContactHook, RemoveContactHook { @@ -43,18 +55,28 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, private static final byte[] LOCAL_GROUP_DESCRIPTOR = new byte[0]; private final DatabaseComponent db; - private final ClientHelper clientHelper; private final PrivateGroupFactory privateGroupFactory; + private final MessageFactory messageFactory; + private final BdfReaderFactory bdfReaderFactory; + private final BdfWriterFactory bdfWriterFactory; + private final MetadataEncoder metadataEncoder; + private final MetadataParser metadataParser; private final Clock clock; private final Group localGroup; @Inject TransportPropertyManagerImpl(DatabaseComponent db, - ClientHelper clientHelper, GroupFactory groupFactory, - PrivateGroupFactory privateGroupFactory, Clock clock) { + GroupFactory groupFactory, PrivateGroupFactory privateGroupFactory, + MessageFactory messageFactory, BdfReaderFactory bdfReaderFactory, + BdfWriterFactory bdfWriterFactory, MetadataEncoder metadataEncoder, + MetadataParser metadataParser, Clock clock) { this.db = db; - this.clientHelper = clientHelper; this.privateGroupFactory = privateGroupFactory; + this.messageFactory = messageFactory; + this.bdfReaderFactory = bdfReaderFactory; + this.bdfWriterFactory = bdfWriterFactory; + this.metadataEncoder = metadataEncoder; + this.metadataParser = metadataParser; this.clock = clock; localGroup = groupFactory.createGroup(CLIENT_ID, LOCAL_GROUP_DESCRIPTOR); @@ -123,9 +145,8 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, true); if (latest != null) { // Retrieve and parse the latest local properties - BdfList message = clientHelper.getMessageAsList(txn, - latest.messageId); - p = parseProperties(message); + byte[] raw = db.getRawMessage(txn, latest.messageId); + p = parseProperties(raw); } txn.setComplete(); } finally { @@ -154,9 +175,8 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, LatestUpdate latest = findLatest(txn, g.getId(), t, false); if (latest != null) { // Retrieve and parse the latest remote properties - BdfList message = clientHelper.getMessageAsList(txn, - latest.messageId); - remote.put(c.getId(), parseProperties(message)); + byte[] raw = db.getRawMessage(txn, latest.messageId); + remote.put(c.getId(), parseProperties(raw)); } } txn.setComplete(); @@ -186,9 +206,8 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, merged = p; changed = true; } else { - BdfList message = clientHelper.getMessageAsList(txn, - latest.messageId); - TransportProperties old = parseProperties(message); + byte[] raw = db.getRawMessage(txn, latest.messageId); + TransportProperties old = parseProperties(raw); merged = new TransportProperties(old); merged.putAll(p); changed = !merged.equals(old); @@ -231,9 +250,8 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, localGroup.getId(), true); // Retrieve and parse the latest local properties for (Entry e : latest.entrySet()) { - BdfList message = clientHelper.getMessageAsList(txn, - e.getValue().messageId); - local.put(e.getKey(), parseProperties(message)); + byte[] raw = db.getRawMessage(txn, e.getValue().messageId); + local.put(e.getKey(), parseProperties(raw)); } return local; } catch (NoSuchGroupException e) { @@ -248,35 +266,48 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, TransportId t, TransportProperties p, long version, boolean local, boolean shared) throws DbException { try { - BdfList body = encodeProperties(dev, t, p, version); + byte[] body = encodeProperties(dev, t, p, version); long now = clock.currentTimeMillis(); - Message m = clientHelper.createMessage(g, now, body); - BdfDictionary meta = new BdfDictionary(); - meta.put("transportId", t.getString()); - meta.put("version", version); - meta.put("local", local); - clientHelper.addLocalMessage(txn, m, CLIENT_ID, meta, shared); + Message m = messageFactory.createMessage(g, now, body); + BdfDictionary d = new BdfDictionary(); + d.put("transportId", t.getString()); + d.put("version", version); + d.put("local", local); + Metadata meta = metadataEncoder.encode(d); + db.addLocalMessage(txn, m, CLIENT_ID, meta, shared); } catch (FormatException e) { throw new RuntimeException(e); } } - private BdfList encodeProperties(DeviceId dev, TransportId t, + private byte[] encodeProperties(DeviceId dev, TransportId t, TransportProperties p, long version) { - return BdfList.of(dev, t.getString(), version, p); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + BdfWriter w = bdfWriterFactory.createWriter(out); + try { + w.writeListStart(); + w.writeRaw(dev.getBytes()); + w.writeString(t.getString()); + w.writeLong(version); + w.writeDictionary(p); + w.writeListEnd(); + } catch (IOException e) { + // Shouldn't happen with ByteArrayOutputStream + throw new RuntimeException(e); + } + return out.toByteArray(); } private Map findLatest(Transaction txn, GroupId g, boolean local) throws DbException, FormatException { Map latestUpdates = new HashMap(); - Map metadata = - clientHelper.getMessageMetadataAsDictionary(txn, g); - for (Entry e : metadata.entrySet()) { - BdfDictionary meta = e.getValue(); - if (meta.getBoolean("local") == local) { - TransportId t = new TransportId(meta.getString("transportId")); - long version = meta.getLong("version"); + Map metadata = db.getMessageMetadata(txn, g); + for (Entry e : metadata.entrySet()) { + BdfDictionary d = metadataParser.parse(e.getValue()); + if (d.getBoolean("local") == local) { + TransportId t = new TransportId(d.getString("transportId")); + long version = d.getLong("version"); LatestUpdate latest = latestUpdates.get(t); if (latest == null || version > latest.version) latestUpdates.put(t, new LatestUpdate(e.getKey(), version)); @@ -288,13 +319,12 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, private LatestUpdate findLatest(Transaction txn, GroupId g, TransportId t, boolean local) throws DbException, FormatException { LatestUpdate latest = null; - Map metadata = - clientHelper.getMessageMetadataAsDictionary(txn, g); - for (Entry e : metadata.entrySet()) { - BdfDictionary meta = e.getValue(); - if (meta.getString("transportId").equals(t.getString()) - && meta.getBoolean("local") == local) { - long version = meta.getLong("version"); + Map metadata = db.getMessageMetadata(txn, g); + for (Entry e : metadata.entrySet()) { + BdfDictionary d = metadataParser.parse(e.getValue()); + if (d.getString("transportId").equals(t.getString()) + && d.getBoolean("local") == local) { + long version = d.getLong("version"); if (latest == null || version > latest.version) latest = new LatestUpdate(e.getKey(), version); } @@ -302,14 +332,33 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, return latest; } - private TransportProperties parseProperties(BdfList message) + private TransportProperties parseProperties(byte[] raw) throws FormatException { - // Device ID, transport ID, version, properties - BdfDictionary dictionary = message.getDictionary(3); TransportProperties p = new TransportProperties(); - for (String key : dictionary.keySet()) - p.put(key, dictionary.getString(key)); - return p; + ByteArrayInputStream in = new ByteArrayInputStream(raw, + MESSAGE_HEADER_LENGTH, raw.length - MESSAGE_HEADER_LENGTH); + BdfReader r = bdfReaderFactory.createReader(in); + try { + r.readListStart(); + r.skipRaw(); // Device ID + r.skipString(); // Transport ID + r.skipLong(); // Version + r.readDictionaryStart(); + while (!r.hasDictionaryEnd()) { + String key = r.readString(MAX_PROPERTY_LENGTH); + String value = r.readString(MAX_PROPERTY_LENGTH); + p.put(key, value); + } + r.readDictionaryEnd(); + r.readListEnd(); + if (!r.eof()) throw new FormatException(); + return p; + } catch (FormatException e) { + throw e; + } catch (IOException e) { + // Shouldn't happen with ByteArrayInputStream + throw new RuntimeException(e); + } } private static class LatestUpdate { diff --git a/briar-core/src/org/briarproject/reliability/ReliabilityModule.java b/briar-core/src/org/briarproject/reliability/ReliabilityModule.java index aabd18e87..4c8ef0138 100644 --- a/briar-core/src/org/briarproject/reliability/ReliabilityModule.java +++ b/briar-core/src/org/briarproject/reliability/ReliabilityModule.java @@ -1,14 +1,30 @@ package org.briarproject.reliability; +import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.reliability.ReliabilityLayerFactory; -import com.google.inject.AbstractModule; +import java.util.concurrent.Executor; -public class ReliabilityModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() { - bind(ReliabilityLayerFactory.class).to( - ReliabilityLayerFactoryImpl.class); +@Module +public class ReliabilityModule { + + /* + @Provides + ReliabilityLayerFactory provideReliabilityFactory(@IoExecutor + Executor ioExecutor) { + return new ReliabilityLayerFactoryImpl(ioExecutor); } + */ + + + + @Provides + ReliabilityLayerFactory provideReliabilityFactory( + ReliabilityLayerFactoryImpl reliabilityLayerFactory) { + return reliabilityLayerFactory; + } + } diff --git a/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java b/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java index eb929aa09..4ff0ff221 100644 --- a/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java +++ b/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java @@ -1,6 +1,5 @@ package org.briarproject.settings; -import com.google.inject.Inject; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; @@ -8,6 +7,8 @@ import org.briarproject.api.db.Transaction; import org.briarproject.api.settings.Settings; import org.briarproject.api.settings.SettingsManager; +import javax.inject.Inject; + class SettingsManagerImpl implements SettingsManager { private final DatabaseComponent db; diff --git a/briar-core/src/org/briarproject/settings/SettingsModule.java b/briar-core/src/org/briarproject/settings/SettingsModule.java index f2d0e2b46..d8aa3b915 100644 --- a/briar-core/src/org/briarproject/settings/SettingsModule.java +++ b/briar-core/src/org/briarproject/settings/SettingsModule.java @@ -1,13 +1,17 @@ package org.briarproject.settings; -import com.google.inject.AbstractModule; - +import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.settings.SettingsManager; -public class SettingsModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() { - bind(SettingsManager.class).to(SettingsManagerImpl.class); +@Module +public class SettingsModule { + + @Provides + SettingsManager provideSettingsManager(DatabaseComponent db) { + return new SettingsManagerImpl(db); } + } diff --git a/briar-core/src/org/briarproject/sync/MessageFactoryImpl.java b/briar-core/src/org/briarproject/sync/MessageFactoryImpl.java index 1015b7daf..68b5e01b0 100644 --- a/briar-core/src/org/briarproject/sync/MessageFactoryImpl.java +++ b/briar-core/src/org/briarproject/sync/MessageFactoryImpl.java @@ -1,6 +1,5 @@ package org.briarproject.sync; -import com.google.inject.Inject; import org.briarproject.api.UniqueId; import org.briarproject.api.crypto.CryptoComponent; @@ -10,6 +9,8 @@ import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.MessageId; import org.briarproject.util.ByteUtils; +import javax.inject.Inject; + import static org.briarproject.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH; import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; diff --git a/briar-core/src/org/briarproject/sync/SyncModule.java b/briar-core/src/org/briarproject/sync/SyncModule.java index 64ed5d505..d52c9fa35 100644 --- a/briar-core/src/org/briarproject/sync/SyncModule.java +++ b/briar-core/src/org/briarproject/sync/SyncModule.java @@ -1,32 +1,84 @@ package org.briarproject.sync; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - +import org.briarproject.api.crypto.CryptoComponent; +import org.briarproject.api.data.BdfWriterFactory; +import org.briarproject.api.data.ObjectReader; +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.event.EventBus; +import org.briarproject.api.identity.Author; +import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.sync.Group; import org.briarproject.api.sync.GroupFactory; import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.PacketReaderFactory; import org.briarproject.api.sync.PacketWriterFactory; +import org.briarproject.api.sync.PrivateGroupFactory; import org.briarproject.api.sync.SyncSessionFactory; import org.briarproject.api.sync.ValidationManager; +import org.briarproject.api.system.Clock; + +import java.util.concurrent.Executor; import javax.inject.Singleton; -public class SyncModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() { - bind(GroupFactory.class).to(GroupFactoryImpl.class); - bind(MessageFactory.class).to(MessageFactoryImpl.class); - bind(PacketReaderFactory.class).to(PacketReaderFactoryImpl.class); - bind(PacketWriterFactory.class).to(PacketWriterFactoryImpl.class); - bind(SyncSessionFactory.class).to( - SyncSessionFactoryImpl.class).in(Singleton.class); +@Module +public class SyncModule { + + @Provides + AuthorFactory provideAuthFactory(CryptoComponent crypto, + BdfWriterFactory bdfWriterFactory, Clock clock) { + return new AuthorFactoryImpl(crypto, bdfWriterFactory, clock); } - @Provides @Singleton + @Provides + GroupFactory provideGroupFactory(CryptoComponent crypto) { + return new GroupFactoryImpl(crypto); + } + + @Provides + MessageFactory provideMessageFactory(CryptoComponent crypto) { + return new MessageFactoryImpl(crypto); + } + + @Provides + PacketReaderFactory providePacketReaderFactory(CryptoComponent crypto) { + return new PacketReaderFactoryImpl(crypto); + } + + @Provides + PacketWriterFactory providePacketWriterFactory() { + return new PacketWriterFactoryImpl(); + } + + @Provides + PrivateGroupFactory providePrivateGroupFactory(GroupFactory groupFactory, + BdfWriterFactory bdfWriterFactory) { + return new PrivateGroupFactoryImpl(groupFactory, bdfWriterFactory); + } + + @Provides + @Singleton + SyncSessionFactory provideSyncSessionFactory(DatabaseComponent db, + @DatabaseExecutor Executor dbExecutor, EventBus eventBus, + Clock clock, PacketReaderFactory packetReaderFactory, + PacketWriterFactory packetWriterFactory) { + return new SyncSessionFactoryImpl(db, dbExecutor, eventBus, clock, + packetReaderFactory, packetWriterFactory); + } + + + @Provides + ObjectReader getAuthorReader(AuthorFactory authorFactory) { + return new AuthorReader(authorFactory); + } + + @Provides + @Singleton ValidationManager getValidationManager(LifecycleManager lifecycleManager, EventBus eventBus, ValidationManagerImpl validationManager) { lifecycleManager.register(validationManager); diff --git a/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java b/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java index 949dcc516..4837a1b57 100644 --- a/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java +++ b/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java @@ -1,7 +1,5 @@ package org.briarproject.sync; -import com.google.inject.Inject; - import org.briarproject.api.UniqueId; import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.db.DatabaseComponent; @@ -30,6 +28,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.logging.Logger; +import javax.inject.Inject; + import static java.util.logging.Level.WARNING; import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; diff --git a/briar-core/src/org/briarproject/transport/TransportModule.java b/briar-core/src/org/briarproject/transport/TransportModule.java index 367340a4c..090882d1a 100644 --- a/briar-core/src/org/briarproject/transport/TransportModule.java +++ b/briar-core/src/org/briarproject/transport/TransportModule.java @@ -1,8 +1,7 @@ package org.briarproject.transport; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - +import org.briarproject.api.crypto.StreamDecrypterFactory; +import org.briarproject.api.crypto.StreamEncrypterFactory; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.transport.KeyManager; @@ -11,15 +10,26 @@ import org.briarproject.api.transport.StreamWriterFactory; import javax.inject.Singleton; -public class TransportModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() { - bind(StreamReaderFactory.class).to(StreamReaderFactoryImpl.class); - bind(StreamWriterFactory.class).to(StreamWriterFactoryImpl.class); +@Module +public class TransportModule { + + @Provides + StreamReaderFactory provideStreamReaderFactory( + StreamDecrypterFactory streamDecrypterFactory) { + return new StreamReaderFactoryImpl(streamDecrypterFactory); } - @Provides @Singleton + @Provides + StreamWriterFactory provideStreamWriterFactory( + StreamEncrypterFactory streamEncrypterFactory) { + return new StreamWriterFactoryImpl(streamEncrypterFactory); + } + + @Provides + @Singleton KeyManager getKeyManager(LifecycleManager lifecycleManager, EventBus eventBus, KeyManagerImpl keyManager) { lifecycleManager.register(keyManager); diff --git a/briar-desktop/src/org/briarproject/lifecycle/DesktopLifecycleModule.java b/briar-desktop/src/org/briarproject/lifecycle/DesktopLifecycleModule.java index bf1a41d2a..63c913cca 100644 --- a/briar-desktop/src/org/briarproject/lifecycle/DesktopLifecycleModule.java +++ b/briar-desktop/src/org/briarproject/lifecycle/DesktopLifecycleModule.java @@ -4,10 +4,11 @@ import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.ShutdownManager; import org.briarproject.util.OsUtils; -import com.google.inject.Singleton; public class DesktopLifecycleModule extends LifecycleModule { + /* + // TODO @Override protected void configure() { bind(LifecycleManager.class).to( @@ -20,4 +21,5 @@ public class DesktopLifecycleModule extends LifecycleModule { ShutdownManagerImpl.class).in(Singleton.class); } } + */ } diff --git a/briar-desktop/src/org/briarproject/plugins/DesktopPluginsModule.java b/briar-desktop/src/org/briarproject/plugins/DesktopPluginsModule.java index ff6972738..6d727a6d8 100644 --- a/briar-desktop/src/org/briarproject/plugins/DesktopPluginsModule.java +++ b/briar-desktop/src/org/briarproject/plugins/DesktopPluginsModule.java @@ -1,7 +1,5 @@ package org.briarproject.plugins; -import com.google.inject.Provides; - import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.ShutdownManager; import org.briarproject.api.plugins.BackoffFactory; @@ -22,6 +20,10 @@ import java.util.Collection; import java.util.Collections; import java.util.concurrent.Executor; +import dagger.Module; +import dagger.Provides; + +@Module public class DesktopPluginsModule extends PluginsModule { @Provides diff --git a/briar-desktop/src/org/briarproject/system/DesktopSystemModule.java b/briar-desktop/src/org/briarproject/system/DesktopSystemModule.java index 3ed1a7540..d3186ed1b 100644 --- a/briar-desktop/src/org/briarproject/system/DesktopSystemModule.java +++ b/briar-desktop/src/org/briarproject/system/DesktopSystemModule.java @@ -1,18 +1,19 @@ package org.briarproject.system; -import com.google.inject.AbstractModule; - import org.briarproject.api.system.Clock; import org.briarproject.api.system.SeedProvider; import org.briarproject.api.system.Timer; import org.briarproject.util.OsUtils; -public class DesktopSystemModule extends AbstractModule { +public class DesktopSystemModule { + /* + // TODO protected void configure() { bind(Clock.class).to(SystemClock.class); bind(Timer.class).to(SystemTimer.class); if (OsUtils.isLinux()) bind(SeedProvider.class).to(LinuxSeedProvider.class); } + */ } diff --git a/briar-tests/build.gradle b/briar-tests/build.gradle index afa7bbb2e..c5ae11237 100644 --- a/briar-tests/build.gradle +++ b/briar-tests/build.gradle @@ -13,7 +13,6 @@ dependencies { compile project(':briar-core') compile fileTree(dir: '../briar-desktop/libs', include: '*.jar') compile project(':briar-desktop') - compile "junit:junit:4.12" compile "org.jmock:jmock:2.8.1" compile "org.hamcrest:hamcrest-library:1.3" diff --git a/briar-tests/src/org/briarproject/TestDatabaseModule.java b/briar-tests/src/org/briarproject/TestDatabaseModule.java index 429f6a9de..b6659315f 100644 --- a/briar-tests/src/org/briarproject/TestDatabaseModule.java +++ b/briar-tests/src/org/briarproject/TestDatabaseModule.java @@ -1,12 +1,14 @@ package org.briarproject; -import com.google.inject.AbstractModule; - import org.briarproject.api.db.DatabaseConfig; import java.io.File; -public class TestDatabaseModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; + +@Module +public class TestDatabaseModule { private final DatabaseConfig config; @@ -22,7 +24,9 @@ public class TestDatabaseModule extends AbstractModule { this.config = new TestDatabaseConfig(dir, maxSize); } - protected void configure() { - bind(DatabaseConfig.class).toInstance(config); + @Provides + DatabaseConfig provideDatabaseConfig() { + return config; } + } diff --git a/briar-tests/src/org/briarproject/TestLifecycleModule.java b/briar-tests/src/org/briarproject/TestLifecycleModule.java index a6b6a6186..8df124d7d 100644 --- a/briar-tests/src/org/briarproject/TestLifecycleModule.java +++ b/briar-tests/src/org/briarproject/TestLifecycleModule.java @@ -1,7 +1,5 @@ package org.briarproject; -import com.google.inject.AbstractModule; - import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.Service; @@ -11,37 +9,70 @@ import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -public class TestLifecycleModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() { - bind(LifecycleManager.class).toInstance(new LifecycleManager() { +@Module +public class TestLifecycleModule { - public void register(Service s) {} + @Provides + LifecycleManager provideLifecycleManager() { + return new LifecycleManager() { + @Override + public void register(Service s) { - public void registerForShutdown(ExecutorService e) {} + } - public StartResult startServices() { return StartResult.SUCCESS; } + @Override + public void registerForShutdown(ExecutorService e) { - public void stopServices() {} + } - public void waitForDatabase() throws InterruptedException {} + @Override + public StartResult startServices() { + return StartResult.SUCCESS; + } - public void waitForStartup() throws InterruptedException {} + @Override + public void stopServices() { - public void waitForShutdown() throws InterruptedException {} - }); - bind(ShutdownManager.class).toInstance(new ShutdownManager() { + } + @Override + public void waitForDatabase() throws InterruptedException { + + } + + @Override + public void waitForStartup() throws InterruptedException { + + } + + @Override + public void waitForShutdown() throws InterruptedException { + + } + }; + } + + ShutdownManager provideShutdownManager() { + return new ShutdownManager() { + @Override public int addShutdownHook(Runnable hook) { return 0; } + @Override public boolean removeShutdownHook(int handle) { return true; } - }); - bind(Executor.class).annotatedWith(IoExecutor.class).toInstance( - Executors.newCachedThreadPool()); + }; } + + @Provides + @IoExecutor + Executor provideExecutor() { + return Executors.newCachedThreadPool(); + } + } diff --git a/briar-tests/src/org/briarproject/TestSystemModule.java b/briar-tests/src/org/briarproject/TestSystemModule.java index 9734f533e..2082896a3 100644 --- a/briar-tests/src/org/briarproject/TestSystemModule.java +++ b/briar-tests/src/org/briarproject/TestSystemModule.java @@ -1,18 +1,29 @@ package org.briarproject; -import com.google.inject.AbstractModule; - import org.briarproject.api.system.Clock; import org.briarproject.api.system.SeedProvider; import org.briarproject.api.system.Timer; import org.briarproject.system.SystemClock; import org.briarproject.system.SystemTimer; -public class TestSystemModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - protected void configure() { - bind(Clock.class).to(SystemClock.class); - bind(Timer.class).to(SystemTimer.class); - bind(SeedProvider.class).to(TestSeedProvider.class); +@Module +public class TestSystemModule { + + @Provides + Clock provideClock() { + return new SystemClock(); + } + + @Provides + Timer provideSystemTimer() { + return new SystemTimer(); + } + + @Provides + SeedProvider provideSeedProvider() { + return new TestSeedProvider(); } } diff --git a/build.gradle b/build.gradle index 614bca7eb..ced77342b 100644 --- a/build.gradle +++ b/build.gradle @@ -2,9 +2,13 @@ buildscript { repositories { mavenCentral() + maven { + url "https://plugins.gradle.org/m2/" + } } dependencies { classpath 'com.android.tools.build:gradle:1.5.0' + classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath files('briar-core/libs/gradle-witness.jar') } } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 06909cf9e..6de5aebc6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -include ':briar-api' +include ':briar-api', ':briar-android-tests' include ':briar-core' include ':briar-desktop' include ':briar-tests' From 25324697acc636f5c1578aeb0aeff9a9d287b2a9 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Thu, 3 Mar 2016 10:49:57 +0100 Subject: [PATCH 02/13] cleanup and added missing desktop modules --- .../sync/SimplexMessagingComponent.java | 3 -- .../android/SplashScreenActivity.java | 3 -- .../lifecycle/DesktopLifecycleModule.java | 35 ++++++++++++------- .../system/DesktopSystemModule.java | 28 ++++++++++----- 4 files changed, 43 insertions(+), 26 deletions(-) diff --git a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java index 83bc5f1c8..2e3e19442 100644 --- a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java +++ b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java @@ -28,9 +28,6 @@ import javax.inject.Singleton; import dagger.Component; -/** - * Created by Ernir Erlingsson (ernir@ymirmobile.com) on 3.3.2016. - */ @Singleton @Component(modules = {TestDatabaseModule.class, TestSystemModule.class, LifecycleModule.class, ContactModule.class, CryptoModule.class, diff --git a/briar-android/src/org/briarproject/android/SplashScreenActivity.java b/briar-android/src/org/briarproject/android/SplashScreenActivity.java index c79f9a350..ef374c113 100644 --- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java +++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java @@ -1,8 +1,6 @@ package org.briarproject.android; -import android.app.Activity; import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; @@ -16,7 +14,6 @@ import android.widget.LinearLayout; import org.briarproject.R; import org.briarproject.android.util.LayoutUtils; import org.briarproject.api.db.DatabaseConfig; -import org.briarproject.api.ui.UiCallback; import org.briarproject.util.FileUtils; import java.util.logging.Logger; diff --git a/briar-desktop/src/org/briarproject/lifecycle/DesktopLifecycleModule.java b/briar-desktop/src/org/briarproject/lifecycle/DesktopLifecycleModule.java index 63c913cca..4986668b1 100644 --- a/briar-desktop/src/org/briarproject/lifecycle/DesktopLifecycleModule.java +++ b/briar-desktop/src/org/briarproject/lifecycle/DesktopLifecycleModule.java @@ -1,25 +1,36 @@ package org.briarproject.lifecycle; +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.ShutdownManager; +import org.briarproject.api.system.Clock; import org.briarproject.util.OsUtils; +import javax.inject.Singleton; +import dagger.Module; +import dagger.Provides; + +@Module public class DesktopLifecycleModule extends LifecycleModule { - /* - // TODO - @Override - protected void configure() { - bind(LifecycleManager.class).to( - LifecycleManagerImpl.class).in(Singleton.class); + @Provides + @Singleton + LifecycleManager provideLifecycleManager(Clock clock, DatabaseComponent db, + EventBus eventBus) { + return new LifecycleManagerImpl(clock, db, eventBus); + } + + @Provides + @Singleton + ShutdownManager provideDesktopShutdownManager() { if (OsUtils.isWindows()) { - bind(ShutdownManager.class).to( - WindowsShutdownManagerImpl.class).in(Singleton.class); - } else { - bind(ShutdownManager.class).to( - ShutdownManagerImpl.class).in(Singleton.class); + return new WindowsShutdownManagerImpl(); + } + else { + return new ShutdownManagerImpl(); } } - */ + } diff --git a/briar-desktop/src/org/briarproject/system/DesktopSystemModule.java b/briar-desktop/src/org/briarproject/system/DesktopSystemModule.java index d3186ed1b..ab811ebba 100644 --- a/briar-desktop/src/org/briarproject/system/DesktopSystemModule.java +++ b/briar-desktop/src/org/briarproject/system/DesktopSystemModule.java @@ -5,15 +5,27 @@ import org.briarproject.api.system.SeedProvider; import org.briarproject.api.system.Timer; import org.briarproject.util.OsUtils; +import dagger.Module; +import dagger.Provides; + +@Module public class DesktopSystemModule { - /* - // TODO - protected void configure() { - bind(Clock.class).to(SystemClock.class); - bind(Timer.class).to(SystemTimer.class); - if (OsUtils.isLinux()) - bind(SeedProvider.class).to(LinuxSeedProvider.class); + @Provides + Clock provideClock() { + return new SystemClock(); + } + + @Provides + Timer provideTimer() { + return new SystemTimer(); + } + + @Provides + SeedProvider provideSeedProvider() { + if (OsUtils.isLinux()) { + return new LinuxSeedProvider(); + } + return null; } - */ } From ac5d68df8142561a0f26eb27dd363840e9dae3f8 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Thu, 3 Mar 2016 11:05:40 +0100 Subject: [PATCH 03/13] Added dependency verifications and removed Splash header --- briar-android-tests/build.gradle | 12 +++++++++++- briar-android/AndroidManifest.xml | 1 + briar-android/build.gradle | 3 +-- briar-api/build.gradle | 10 +++++----- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/briar-android-tests/build.gradle b/briar-android-tests/build.gradle index 858711df4..d9dcdc2d0 100644 --- a/briar-android-tests/build.gradle +++ b/briar-android-tests/build.gradle @@ -34,6 +34,16 @@ dependencies { compile 'com.android.support:appcompat-v7:23.2.0' testApt 'com.google.dagger:dagger-compiler:2.0.2' provided 'javax.annotation:jsr250-api:1.0' - compile 'cglib:cglib-nodep:3.1' testCompile project(':briar-tests') } + +dependencyVerification { + verify = [ + 'com.android.support:appcompat-v7:14ab04eb2e3f302a082b79c308f6283d21909d1feb831a4e117cdacdad70adb7', + 'com.google.dagger:dagger:84c0282ed8be73a29e0475d639da030b55dee72369e58dd35ae7d4fe6243dcf9', + 'com.google.dagger:dagger-compiler:b74bc9de063dd4c6400b232231f2ef5056145b8fbecbf5382012007dd1c071b3', + 'com.android.support:support-v4:992666398b80724a2f95ea3d7bf7c3d94fb810dcba7ae1aa6e38c0d6120d2603', + 'com.android.support:support-annotations:7f21659b084da073b77b6f7fe7ab250c4f23346238d4efdbbbb937e017ae4693', + ] + +} diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml index 92340fd50..cab5c80b9 100644 --- a/briar-android/AndroidManifest.xml +++ b/briar-android/AndroidManifest.xml @@ -67,6 +67,7 @@ diff --git a/briar-android/build.gradle b/briar-android/build.gradle index c3a03b93a..81228e918 100644 --- a/briar-android/build.gradle +++ b/briar-android/build.gradle @@ -33,8 +33,6 @@ dependencies { compile "de.hdodenhof:circleimageview:2.0.0" apt 'com.google.dagger:dagger-compiler:2.0.2' provided 'javax.annotation:jsr250-api:1.0' - - compile 'cglib:cglib-nodep:3.1' } dependencyVerification { @@ -48,6 +46,7 @@ dependencyVerification { 'com.android.support:recyclerview-v7:7606373da0931a1e62588335465a0e390cd676c98117edab29220317495faefd', 'info.guardianproject.panic:panic:a7ed9439826db2e9901649892cf9afbe76f00991b768d8f4c26332d7c9406cb2', 'info.guardianproject.trustedintents:trustedintents:6221456d8821a8d974c2acf86306900237cf6afaaa94a4c9c44e161350f80f3e', + 'com.android.support:support-annotations:f347a35b9748a4103b39a6714a77e2100f488d623fd6268e259c177b200e9d82' ] } diff --git a/briar-api/build.gradle b/briar-api/build.gradle index fc84125c8..71e8c70be 100644 --- a/briar-api/build.gradle +++ b/briar-api/build.gradle @@ -15,11 +15,11 @@ dependencies { dependencyVerification { verify = [ -// 'javax.inject:javax.inject:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', -// 'com.google.inject:guice:7c0624d0986ae2bd7a8f1cf4789bcaae5b82a042a7e3d27ba3041ed7b7f2cd3a', -// 'aopalliance:aopalliance:0addec670fedcd3f113c5c8091d783280d23f75e3acb841b61a9cdb079376a08', -// 'org.sonatype.sisu.inject:cglib:42e1dfb26becbf1a633f25b47e39fcc422b85e77e4c0468d9a44f885f5fa0be2', -// 'asm:asm:333ff5369043975b7e031b8b27206937441854738e038c1f47f98d072a20437a', + 'com.google.dagger:dagger:84c0282ed8be73a29e0475d639da030b55dee72369e58dd35ae7d4fe6243dcf9', + 'com.google.dagger:dagger-compiler:b74bc9de063dd4c6400b232231f2ef5056145b8fbecbf5382012007dd1c071b3', + 'javax.inject:javax.inject:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', + 'com.google.dagger:dagger-producers:99ec15e8a0507ba569e7655bc1165ee5e5ca5aa914b3c8f7e2c2458f724edd6b', + 'com.google.guava:guava:d664fbfc03d2e5ce9cab2a44fb01f1d0bf9dfebeccc1a473b1f9ea31f79f6f99', ] } From 95d89553d500894dbe831f678538cd0028f61766 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Thu, 3 Mar 2016 15:02:54 +0100 Subject: [PATCH 04/13] merged with master --- .../sync/SimplexMessagingComponent.java | 3 +- .../sync/SimplexMessagingIntegrationTest.java | 139 +++++++++++++++++- briar-android/res/values/roboguice.xml | 23 --- .../android/AndroidComponent.java | 3 +- .../clients/ClientHelperImpl.java | 4 +- .../briarproject/clients/ClientsModule.java | 39 +++-- .../contact/ContactManagerImpl.java | 15 +- .../briarproject/contact/ContactModule.java | 1 - .../org/briarproject/forum/ForumModule.java | 9 +- .../forum/ForumSharingManagerImpl.java | 4 - .../identity/IdentityManagerImpl.java | 15 +- .../briarproject/identity/IdentityModule.java | 22 ++- .../invitation/InvitationModule.java | 7 +- .../briarproject/plugins/PluginsModule.java | 12 +- .../src/org/briarproject/sync/SyncModule.java | 20 --- 15 files changed, 209 insertions(+), 107 deletions(-) delete mode 100644 briar-android/res/values/roboguice.xml diff --git a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java index 2e3e19442..1d0a7d70f 100644 --- a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java +++ b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java @@ -14,6 +14,7 @@ import org.briarproject.api.sync.PacketWriterFactory; import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; +import org.briarproject.clients.ClientsModule; import org.briarproject.contact.ContactModule; import org.briarproject.crypto.CryptoModule; import org.briarproject.data.DataModule; @@ -33,7 +34,7 @@ import dagger.Component; LifecycleModule.class, ContactModule.class, CryptoModule.class, DatabaseModule.class, EventModule.class, SyncModule.class, DataModule.class, TransportModule.class, IdentityModule.class, - MessagingModule.class}) + MessagingModule.class, ClientsModule.class}) public interface SimplexMessagingComponent { void inject(SimplexMessagingIntegrationTest testCase); LifecycleManager getLifeCycleManager(); diff --git a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java index dbc1b6a4f..d8eefc25b 100644 --- a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java @@ -1,6 +1,7 @@ package org.briarproject.sync; import org.briarproject.BriarTestCase; +import org.briarproject.ImmediateExecutor; import org.briarproject.TestDatabaseModule; import org.briarproject.TestUtils; import org.briarproject.api.TransportId; @@ -8,7 +9,7 @@ import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.db.DatabaseComponent; -import org.briarproject.api.db.StorageStatus; +import org.briarproject.api.db.Transaction; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventListener; @@ -31,7 +32,6 @@ import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamContext; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; -import org.briarproject.plugins.ImmediateExecutor; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -79,6 +79,140 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { read(write()); } + private byte[] write() throws Exception { + // Instantiate Alice's services + LifecycleManager lifecycleManager = alice.getLifeCycleManager(); + DatabaseComponent db = alice.getDatabaseComponent(); + IdentityManager identityManager = alice.getIdentityManager(); + ContactManager contactManager = alice.getContactManager(); + MessagingManager messagingManager = alice.getMessagingManager(); + KeyManager keyManager = alice.getKeyManager(); + PrivateMessageFactory privateMessageFactory = + alice.getPrivateMessageFactory(); + PacketWriterFactory packetWriterFactory = + alice.getPacketWriterFactory(); + EventBus eventBus = alice.getEventBus(); + StreamWriterFactory streamWriterFactory = + alice.getStreamWriterFactory(); + + // Start the lifecycle manager + lifecycleManager.startServices(); + lifecycleManager.waitForStartup(); + // Add a transport + Transaction txn = db.startTransaction(); + try { + db.addTransport(txn, transportId, MAX_LATENCY); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } + // Add an identity for Alice + LocalAuthor aliceAuthor = new LocalAuthor(aliceId, "Alice", + new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp); + identityManager.addLocalAuthor(aliceAuthor); + // Add Bob as a contact + Author bobAuthor = new Author(bobId, "Bob", + new byte[MAX_PUBLIC_KEY_LENGTH]); + ContactId contactId = contactManager.addContact(bobAuthor, aliceId, + master, timestamp, true, true); + + // Send Bob a message + GroupId groupId = messagingManager.getConversationId(contactId); + byte[] body = "Hi Bob!".getBytes("UTF-8"); + PrivateMessage message = privateMessageFactory.createPrivateMessage( + groupId, timestamp, null, "text/plain", body); + messagingManager.addLocalMessage(message); + // Get a stream context + StreamContext ctx = keyManager.getStreamContext(contactId, transportId); + assertNotNull(ctx); + // Create a stream writer + ByteArrayOutputStream out = new ByteArrayOutputStream(); + OutputStream streamWriter = streamWriterFactory.createStreamWriter( + out, ctx); + // Create an outgoing sync session + PacketWriter packetWriter = packetWriterFactory.createPacketWriter( + streamWriter); + SyncSession session = new SimplexOutgoingSession(db, + new ImmediateExecutor(), eventBus, contactId, transportId, + MAX_LATENCY, packetWriter); + // Write whatever needs to be written + session.run(); + streamWriter.close(); + + // Clean up + lifecycleManager.stopServices(); + lifecycleManager.waitForShutdown(); + + // Return the contents of the stream + return out.toByteArray(); + } + + private void read(byte[] stream) throws Exception { + // Instantiate Bob's services + LifecycleManager lifecycleManager = bob.getLifeCycleManager(); + DatabaseComponent db = bob.getDatabaseComponent(); + IdentityManager identityManager = bob.getIdentityManager(); + ContactManager contactManager = bob.getContactManager(); + KeyManager keyManager = bob.getKeyManager(); + StreamReaderFactory streamReaderFactory = bob.getStreamReaderFactory(); + PacketReaderFactory packetReaderFactory = bob.getPacketReaderFactory(); + EventBus eventBus = bob.getEventBus(); + // Bob needs a MessagingManager even though we're not using it directly + bob.getMessagingManager(); + + // Start the lifecyle manager + lifecycleManager.startServices(); + lifecycleManager.waitForStartup(); + // Add a transport + Transaction txn = db.startTransaction(); + try { + db.addTransport(txn, transportId, MAX_LATENCY); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } + // Add an identity for Bob + LocalAuthor bobAuthor = new LocalAuthor(bobId, "Bob", + new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp); + identityManager.addLocalAuthor(bobAuthor); + // Add Alice as a contact + Author aliceAuthor = new Author(aliceId, "Alice", + new byte[MAX_PUBLIC_KEY_LENGTH]); + ContactId contactId = contactManager.addContact(aliceAuthor, bobId, + master, timestamp, false, true); + + // Set up an event listener + MessageListener listener = new MessageListener(); + bob.getEventBus().addListener(listener); + // Read and recognise the tag + ByteArrayInputStream in = new ByteArrayInputStream(stream); + byte[] tag = new byte[TAG_LENGTH]; + int read = in.read(tag); + assertEquals(tag.length, read); + StreamContext ctx = keyManager.getStreamContext(transportId, tag); + assertNotNull(ctx); + // Create a stream reader + InputStream streamReader = streamReaderFactory.createStreamReader( + in, ctx); + // Create an incoming sync session + PacketReader packetReader = packetReaderFactory.createPacketReader( + streamReader); + SyncSession session = new IncomingSession(db, new ImmediateExecutor(), + eventBus, contactId, transportId, packetReader); + // No messages should have been added yet + assertFalse(listener.messageAdded); + // Read whatever needs to be read + session.run(); + streamReader.close(); + // The private message from Alice should have been added + assertTrue(listener.messageAdded); + + // Clean up + lifecycleManager.stopServices(); + lifecycleManager.waitForShutdown(); + } + + /* private byte[] write() throws Exception { // Instantiate Alice's services LifecycleManager lifecycleManager = alice.getLifeCycleManager(); @@ -201,6 +335,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { lifecycleManager.stopServices(); lifecycleManager.waitForShutdown(); } + */ @After public void tearDown() { diff --git a/briar-android/res/values/roboguice.xml b/briar-android/res/values/roboguice.xml deleted file mode 100644 index 60265f1c2..000000000 --- a/briar-android/res/values/roboguice.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - org.briarproject.android.AndroidModule - org.briarproject.clients.ClientsModule - org.briarproject.contact.ContactModule - org.briarproject.crypto.CryptoModule - org.briarproject.data.DataModule - org.briarproject.db.DatabaseModule - org.briarproject.event.EventModule - org.briarproject.forum.ForumModule - org.briarproject.identity.IdentityModule - org.briarproject.invitation.InvitationModule - org.briarproject.lifecycle.LifecycleModule - org.briarproject.messaging.MessagingModule - org.briarproject.plugins.AndroidPluginsModule - org.briarproject.properties.PropertiesModule - org.briarproject.sync.SyncModule - org.briarproject.system.AndroidSystemModule - org.briarproject.transport.TransportModule - org.briarproject.settings.SettingsModule - - diff --git a/briar-android/src/org/briarproject/android/AndroidComponent.java b/briar-android/src/org/briarproject/android/AndroidComponent.java index e360a10ec..caf43416a 100644 --- a/briar-android/src/org/briarproject/android/AndroidComponent.java +++ b/briar-android/src/org/briarproject/android/AndroidComponent.java @@ -14,6 +14,7 @@ import org.briarproject.android.identity.CreateIdentityActivity; import org.briarproject.android.invitation.AddContactActivity; import org.briarproject.android.panic.PanicPreferencesActivity; import org.briarproject.android.panic.PanicResponderActivity; +import org.briarproject.clients.ClientsModule; import org.briarproject.contact.ContactModule; import org.briarproject.crypto.CryptoModule; import org.briarproject.data.DataModule; @@ -44,7 +45,7 @@ import dagger.Component; EventModule.class, DataModule.class, ContactModule.class, AndroidSystemModule.class, AndroidPluginsModule.class, PropertiesModule.class, TransportModule.class, SyncModule.class, - SettingsModule.class}) + SettingsModule.class, ClientsModule.class}) public interface AndroidComponent { void inject(SplashScreenActivity activity); void inject(SetupActivity activity); diff --git a/briar-core/src/org/briarproject/clients/ClientHelperImpl.java b/briar-core/src/org/briarproject/clients/ClientHelperImpl.java index 65740a391..40640c17a 100644 --- a/briar-core/src/org/briarproject/clients/ClientHelperImpl.java +++ b/briar-core/src/org/briarproject/clients/ClientHelperImpl.java @@ -1,7 +1,5 @@ package org.briarproject.clients; -import com.google.inject.Inject; - import org.briarproject.api.FormatException; import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.data.BdfDictionary; @@ -30,6 +28,8 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import javax.inject.Inject; + import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; class ClientHelperImpl implements ClientHelper { diff --git a/briar-core/src/org/briarproject/clients/ClientsModule.java b/briar-core/src/org/briarproject/clients/ClientsModule.java index b4c1a306c..10bcbc3c7 100644 --- a/briar-core/src/org/briarproject/clients/ClientsModule.java +++ b/briar-core/src/org/briarproject/clients/ClientsModule.java @@ -1,19 +1,36 @@ package org.briarproject.clients; -import com.google.inject.AbstractModule; - import org.briarproject.api.clients.ClientHelper; -import org.briarproject.api.clients.MessageQueueManager; import org.briarproject.api.clients.PrivateGroupFactory; -import org.briarproject.api.clients.QueueMessageFactory; +import org.briarproject.api.data.BdfReaderFactory; +import org.briarproject.api.data.BdfWriterFactory; +import org.briarproject.api.data.MetadataEncoder; +import org.briarproject.api.data.MetadataParser; +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.sync.GroupFactory; +import org.briarproject.api.sync.MessageFactory; -public class ClientsModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() { - bind(ClientHelper.class).to(ClientHelperImpl.class); - bind(MessageQueueManager.class).to(MessageQueueManagerImpl.class); - bind(PrivateGroupFactory.class).to(PrivateGroupFactoryImpl.class); - bind(QueueMessageFactory.class).to(QueueMessageFactoryImpl.class); +@Module +public class ClientsModule { + + @Provides + ClientHelper provideClientHelper(DatabaseComponent db, + MessageFactory messageFactory, BdfReaderFactory bdfReaderFactory, + BdfWriterFactory bdfWriterFactory, MetadataParser metadataParser, + MetadataEncoder metadataEncoder) { + return new ClientHelperImpl(db, messageFactory, bdfReaderFactory, + bdfWriterFactory, metadataParser, metadataEncoder); } + + @Provides + PrivateGroupFactory providePrivateGroupFactory(GroupFactory groupFactory, + BdfWriterFactory bdfWriterFactory) { + return new PrivateGroupFactoryImpl(groupFactory, bdfWriterFactory); + } + + bind(QueueMessageFactory.class).to(QueueMessageFactoryImpl.class); + } diff --git a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java index 83de8540d..df75b73e1 100644 --- a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java +++ b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java @@ -19,22 +19,9 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -<<<<<<< 08099714bab27d1ed48a8bee431a35a38098ecec -class ContactManagerImpl implements ContactManager, RemoveIdentityHook { -======= import javax.inject.Inject; -import static java.util.logging.Level.WARNING; -import static org.briarproject.api.db.StorageStatus.ACTIVE; -import static org.briarproject.api.db.StorageStatus.ADDING; -import static org.briarproject.api.db.StorageStatus.REMOVING; - -class ContactManagerImpl implements ContactManager, Service, - RemoveIdentityHook { - - private static final Logger LOG = - Logger.getLogger(ContactManagerImpl.class.getName()); ->>>>>>> Switched Roboguice/Guice out for Dagger 2 +class ContactManagerImpl implements ContactManager, RemoveIdentityHook { private final DatabaseComponent db; private final KeyManager keyManager; diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java index 55bb854b3..f2009be57 100644 --- a/briar-core/src/org/briarproject/contact/ContactModule.java +++ b/briar-core/src/org/briarproject/contact/ContactModule.java @@ -17,7 +17,6 @@ public class ContactModule { ContactManager getContactManager(LifecycleManager lifecycleManager, IdentityManager identityManager, ContactManagerImpl contactManager) { - lifecycleManager.register(contactManager); identityManager.registerRemoveIdentityHook(contactManager); return contactManager; } diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java index e58b7e2a0..5712c165e 100644 --- a/briar-core/src/org/briarproject/forum/ForumModule.java +++ b/briar-core/src/org/briarproject/forum/ForumModule.java @@ -27,11 +27,10 @@ public class ForumModule { @Provides @Singleton ForumManager provideForumManager(DatabaseComponent db, - ContactManager contactManager, - BdfReaderFactory bdfReaderFactory, MetadataEncoder metadataEncoder, - MetadataParser metadataParser) { - return new ForumManagerImpl(db, contactManager, bdfReaderFactory, - metadataEncoder, metadataParser); + ContactManager contactManager, BdfReaderFactory bdfReaderFactory, + MetadataEncoder metadataEncoder, MetadataParser metadataParser) { + return new ForumManagerImpl(db, bdfReaderFactory, metadataEncoder, + metadataParser); } @Provides diff --git a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java index c916a54e6..b0e8fd486 100644 --- a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java +++ b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java @@ -37,12 +37,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -<<<<<<< 08099714bab27d1ed48a8bee431a35a38098ecec -======= import javax.inject.Inject; -import static java.util.logging.Level.WARNING; ->>>>>>> Switched Roboguice/Guice out for Dagger 2 import static org.briarproject.api.forum.ForumConstants.FORUM_SALT_LENGTH; import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH; import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; diff --git a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java index a35a85f6d..997456d29 100644 --- a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java +++ b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java @@ -11,22 +11,9 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -<<<<<<< 08099714bab27d1ed48a8bee431a35a38098ecec -class IdentityManagerImpl implements IdentityManager { -======= import javax.inject.Inject; -import static java.util.logging.Level.WARNING; -import static org.briarproject.api.db.StorageStatus.ACTIVE; -import static org.briarproject.api.db.StorageStatus.ADDING; -import static org.briarproject.api.db.StorageStatus.REMOVING; - -class IdentityManagerImpl implements IdentityManager, Service { - - private static final Logger LOG = - Logger.getLogger(IdentityManagerImpl.class.getName()); ->>>>>>> Switched Roboguice/Guice out for Dagger 2 - +class IdentityManagerImpl implements IdentityManager { private final DatabaseComponent db; private final List addHooks; private final List removeHooks; diff --git a/briar-core/src/org/briarproject/identity/IdentityModule.java b/briar-core/src/org/briarproject/identity/IdentityModule.java index 78d2b776c..99e8eeb0f 100644 --- a/briar-core/src/org/briarproject/identity/IdentityModule.java +++ b/briar-core/src/org/briarproject/identity/IdentityModule.java @@ -1,8 +1,14 @@ package org.briarproject.identity; +import org.briarproject.api.crypto.CryptoComponent; +import org.briarproject.api.data.BdfWriterFactory; +import org.briarproject.api.data.ObjectReader; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.event.EventBus; +import org.briarproject.api.identity.Author; +import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.identity.IdentityManager; +import org.briarproject.api.system.Clock; import javax.inject.Singleton; @@ -13,8 +19,18 @@ import dagger.Provides; public class IdentityModule { @Provides - @Singleton - IdentityManager provideIdendityModule(DatabaseComponent db, EventBus eventBus) { - return new IdentityManagerImpl(db, eventBus); + AuthorFactory provideAuthorFactory(CryptoComponent crypto, + BdfWriterFactory bdfWriterFactory, Clock clock) { + return new AuthorFactoryImpl(crypto, bdfWriterFactory, clock); + } + + @Provides + IdentityManager provideIdendityModule(DatabaseComponent db) { + return new IdentityManagerImpl(db); + } + + @Provides + ObjectReader provideAuthorReader(AuthorFactory authorFactory) { + return new AuthorReader(authorFactory); } } diff --git a/briar-core/src/org/briarproject/invitation/InvitationModule.java b/briar-core/src/org/briarproject/invitation/InvitationModule.java index de6d8bde2..1a604c9e6 100644 --- a/briar-core/src/org/briarproject/invitation/InvitationModule.java +++ b/briar-core/src/org/briarproject/invitation/InvitationModule.java @@ -30,13 +30,12 @@ public class InvitationModule { BdfWriterFactory bdfWriterFactory, StreamReaderFactory streamReaderFactory, StreamWriterFactory streamWriterFactory, - AuthorFactory authorFactory, GroupFactory groupFactory, - KeyManager keyManager, ConnectionManager connectionManager, + AuthorFactory authorFactory, ConnectionManager connectionManager, IdentityManager identityManager, ContactManager contactManager, Clock clock, PluginManager pluginManager) { return new InvitationTaskFactoryImpl(crypto, bdfReaderFactory, bdfWriterFactory, streamReaderFactory, streamWriterFactory, - authorFactory, groupFactory, keyManager, connectionManager, - identityManager, contactManager, clock, pluginManager); + authorFactory, connectionManager, identityManager, + contactManager, clock, pluginManager); } } diff --git a/briar-core/src/org/briarproject/plugins/PluginsModule.java b/briar-core/src/org/briarproject/plugins/PluginsModule.java index 67f27b08b..6b750c214 100644 --- a/briar-core/src/org/briarproject/plugins/PluginsModule.java +++ b/briar-core/src/org/briarproject/plugins/PluginsModule.java @@ -5,6 +5,7 @@ import javax.inject.Singleton; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.plugins.BackoffFactory; import org.briarproject.api.plugins.ConnectionManager; import org.briarproject.api.plugins.ConnectionRegistry; import org.briarproject.api.plugins.PluginManager; @@ -14,6 +15,7 @@ import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; +import java.security.SecureRandom; import java.util.concurrent.Executor; import dagger.Module; @@ -23,10 +25,16 @@ import dagger.Provides; @Module public class PluginsModule { + @Provides + BackoffFactory provideBackoffFactory() { + return new BackoffFactoryImpl(); + } + @Provides Poller providePoller(@IoExecutor Executor ioExecutor, - ConnectionRegistry connectionRegistry, Timer timer) { - return new PollerImpl(ioExecutor, connectionRegistry, timer); + ConnectionRegistry connectionRegistry, SecureRandom random, + Timer timer) { + return new PollerImpl(ioExecutor, connectionRegistry, random, timer); } @Provides diff --git a/briar-core/src/org/briarproject/sync/SyncModule.java b/briar-core/src/org/briarproject/sync/SyncModule.java index d52c9fa35..654f029e6 100644 --- a/briar-core/src/org/briarproject/sync/SyncModule.java +++ b/briar-core/src/org/briarproject/sync/SyncModule.java @@ -9,12 +9,10 @@ import org.briarproject.api.event.EventBus; import org.briarproject.api.identity.Author; import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.lifecycle.LifecycleManager; -import org.briarproject.api.sync.Group; import org.briarproject.api.sync.GroupFactory; import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.PacketReaderFactory; import org.briarproject.api.sync.PacketWriterFactory; -import org.briarproject.api.sync.PrivateGroupFactory; import org.briarproject.api.sync.SyncSessionFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; @@ -29,12 +27,6 @@ import dagger.Provides; @Module public class SyncModule { - @Provides - AuthorFactory provideAuthFactory(CryptoComponent crypto, - BdfWriterFactory bdfWriterFactory, Clock clock) { - return new AuthorFactoryImpl(crypto, bdfWriterFactory, clock); - } - @Provides GroupFactory provideGroupFactory(CryptoComponent crypto) { return new GroupFactoryImpl(crypto); @@ -55,12 +47,6 @@ public class SyncModule { return new PacketWriterFactoryImpl(); } - @Provides - PrivateGroupFactory providePrivateGroupFactory(GroupFactory groupFactory, - BdfWriterFactory bdfWriterFactory) { - return new PrivateGroupFactoryImpl(groupFactory, bdfWriterFactory); - } - @Provides @Singleton SyncSessionFactory provideSyncSessionFactory(DatabaseComponent db, @@ -71,12 +57,6 @@ public class SyncModule { packetReaderFactory, packetWriterFactory); } - - @Provides - ObjectReader getAuthorReader(AuthorFactory authorFactory) { - return new AuthorReader(authorFactory); - } - @Provides @Singleton ValidationManager getValidationManager(LifecycleManager lifecycleManager, From 5aba1d79f101d285674bb7ec58d516c47c5ed312 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Thu, 3 Mar 2016 23:00:57 +0100 Subject: [PATCH 05/13] Fixes after comments, also removed the CryptoComoponent from the IdentIcons --- briar-android-tests/build.gradle | 2 +- .../sync/SimplexMessagingIntegrationTest.java | 126 ------------------ .../identicons/AsymmetricIdenticon.java | 5 - .../android/identicons/IdenticonBase.java | 26 +--- .../android/identicons/IdenticonDrawable.java | 8 +- .../identicons/SymmetricIdenticon.java | 7 +- .../android/contact/ContactListAdapter.java | 6 +- .../android/contact/ContactListFragment.java | 9 +- .../android/contact/ConversationActivity.java | 3 +- .../android/contact/ConversationAdapter.java | 6 +- .../android/forum/WriteForumPostActivity.java | 2 +- .../identity/LocalAuthorSpinnerAdapter.java | 9 +- .../invitation/ChooseIdentityView.java | 2 +- .../briarproject/android/util/AuthorView.java | 3 +- .../api/crypto/CryptoExecutor.java | 8 -- .../reliability/ReliabilityModule.java | 8 +- 16 files changed, 21 insertions(+), 209 deletions(-) diff --git a/briar-android-tests/build.gradle b/briar-android-tests/build.gradle index d9dcdc2d0..5fb287884 100644 --- a/briar-android-tests/build.gradle +++ b/briar-android-tests/build.gradle @@ -14,7 +14,7 @@ android { defaultConfig { minSdkVersion 10 - targetSdkVersion 23 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java index d8eefc25b..9ad9df0f2 100644 --- a/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java @@ -62,7 +62,6 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { private final AuthorId aliceId = new AuthorId(TestUtils.getRandomId()); private final AuthorId bobId = new AuthorId(TestUtils.getRandomId()); - // private Injector alice, bob; private SimplexMessagingComponent alice, bob; @Before @@ -212,131 +211,6 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { lifecycleManager.waitForShutdown(); } - /* - private byte[] write() throws Exception { - // Instantiate Alice's services - LifecycleManager lifecycleManager = alice.getLifeCycleManager(); - DatabaseComponent db = alice.getDatabaseComponent(); - IdentityManager identityManager = alice.getIdentityManager(); - - ContactManager contactManager = alice.getContactManager(); - MessagingManager messagingManager = alice.getMessagingManager(); - KeyManager keyManager = alice.getKeyManager(); - PrivateMessageFactory privateMessageFactory = alice.getPrivateMessageFactory(); - PacketWriterFactory packetWriterFactory = alice.getPacketWriterFactory(); - EventBus eventBus = alice.getEventBus(); - StreamWriterFactory streamWriterFactory = alice.getStreamWriterFactory(); - - // Start the lifecycle manager - lifecycleManager.startServices(); - lifecycleManager.waitForStartup(); - // Add a transport - db.addTransport(transportId, MAX_LATENCY); - // Add an identity for Alice - LocalAuthor aliceAuthor = new LocalAuthor(aliceId, "Alice", - new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp, - StorageStatus.ADDING); - identityManager.addLocalAuthor(aliceAuthor); - // Add Bob as a contact - Author bobAuthor = new Author(bobId, "Bob", - new byte[MAX_PUBLIC_KEY_LENGTH]); - ContactId contactId = contactManager.addContact(bobAuthor, aliceId); - // Derive and store the transport keys - keyManager.addContact(contactId, master, timestamp, true); - - // Send Bob a message - GroupId groupId = messagingManager.getConversationId(contactId); - byte[] body = "Hi Bob!".getBytes("UTF-8"); - PrivateMessage message = privateMessageFactory.createPrivateMessage( - groupId, timestamp, null, "text/plain", body); - messagingManager.addLocalMessage(message); - // Get a stream context - StreamContext ctx = keyManager.getStreamContext(contactId, transportId); - assertNotNull(ctx); - // Create a stream writer - ByteArrayOutputStream out = new ByteArrayOutputStream(); - OutputStream streamWriter = streamWriterFactory.createStreamWriter( - out, ctx); - // Create an outgoing sync session - PacketWriter packetWriter = packetWriterFactory.createPacketWriter( - streamWriter); - SyncSession session = new SimplexOutgoingSession(db, - new ImmediateExecutor(), eventBus, contactId, transportId, - MAX_LATENCY, packetWriter); - // Write whatever needs to be written - session.run(); - streamWriter.close(); - - // Clean up - lifecycleManager.stopServices(); - lifecycleManager.waitForShutdown(); - - // Return the contents of the stream - return out.toByteArray(); - } - - private void read(byte[] stream) throws Exception { - // Instantiate Bob's services - LifecycleManager lifecycleManager = bob.getLifeCycleManager(); - DatabaseComponent db = bob.getDatabaseComponent(); - IdentityManager identityManager = bob.getIdentityManager(); - ContactManager contactManager = bob.getContactManager(); - KeyManager keyManager = bob.getKeyManager(); - StreamReaderFactory streamReaderFactory = bob.getStreamReaderFactory(); - PacketReaderFactory packetReaderFactory = bob.getPacketReaderFactory(); - EventBus eventBus = bob.getEventBus(); - // Bob needs a MessagingManager even though we're not using it directly - bob.getMessagingManager(); - - // Start the lifecyle manager - lifecycleManager.startServices(); - lifecycleManager.waitForStartup(); - // Add a transport - db.addTransport(transportId, MAX_LATENCY); - // Add an identity for Bob - LocalAuthor bobAuthor = new LocalAuthor(bobId, "Bob", - new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp, - StorageStatus.ADDING); - identityManager.addLocalAuthor(bobAuthor); - // Add Alice as a contact - Author aliceAuthor = new Author(aliceId, "Alice", - new byte[MAX_PUBLIC_KEY_LENGTH]); - ContactId contactId = contactManager.addContact(aliceAuthor, bobId); - // Derive and store the transport keys - keyManager.addContact(contactId, master, timestamp, false); - - // Set up an event listener - MessageListener listener = new MessageListener(); - bob.getEventBus().addListener(listener); - // Read and recognise the tag - ByteArrayInputStream in = new ByteArrayInputStream(stream); - byte[] tag = new byte[TAG_LENGTH]; - int read = in.read(tag); - assertEquals(tag.length, read); - StreamContext ctx = keyManager.getStreamContext(transportId, tag); - assertNotNull(ctx); - // Create a stream reader - InputStream streamReader = streamReaderFactory.createStreamReader( - in, ctx); - // Create an incoming sync session - PacketReader packetReader = packetReaderFactory.createPacketReader( - streamReader); - SyncSession session = new IncomingSession(db, new ImmediateExecutor(), - eventBus, contactId, transportId, packetReader); - // No messages should have been added yet - assertFalse(listener.messageAdded); - // Read whatever needs to be read - session.run(); - streamReader.close(); - // The private message from Alice should have been added - assertTrue(listener.messageAdded); - - // Clean up - lifecycleManager.stopServices(); - lifecycleManager.waitForShutdown(); - } - */ - @After public void tearDown() { TestUtils.deleteTestDirectory(testDir); diff --git a/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java b/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java index 5be099400..49e9a3cc8 100644 --- a/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java +++ b/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java @@ -25,7 +25,6 @@ import javax.inject.Inject; public class AsymmetricIdenticon extends IdenticonView { - @Inject protected CryptoComponent mCrypto; private IdenticonBase mDelegate; public AsymmetricIdenticon(Context context) { @@ -50,10 +49,6 @@ public class AsymmetricIdenticon extends IdenticonView { private void initDelegate() { mDelegate = new IdenticonBase() { - @Override - protected CryptoComponent getCrypto() { - return mCrypto; - } @Override protected int getRowCount() { diff --git a/briar-android/src/im/delight/android/identicons/IdenticonBase.java b/briar-android/src/im/delight/android/identicons/IdenticonBase.java index 71998de61..7b45675be 100644 --- a/briar-android/src/im/delight/android/identicons/IdenticonBase.java +++ b/briar-android/src/im/delight/android/identicons/IdenticonBase.java @@ -10,7 +10,6 @@ import org.briarproject.api.crypto.CryptoComponent; * Created by saiimons on 05/10/14. */ public abstract class IdenticonBase { - private final CryptoComponent mCrypto; private final int mRowCount; private final int mColumnCount; private final Paint mPaint; @@ -21,7 +20,6 @@ public abstract class IdenticonBase { private volatile boolean mReady; public IdenticonBase() { - mCrypto = getCrypto(); mRowCount = getRowCount(); mColumnCount = getColumnCount(); mPaint = new Paint(); @@ -32,20 +30,7 @@ public abstract class IdenticonBase { } public byte[] getHash(byte[] input) { - byte[] mHash; - // if the input was null - if (input == null) { - // we can't create a hash value and have nothing to show (draw to the view) - mHash = null; - } else { - // generate a hash from the input to get unique but deterministic byte values - try { - mHash = mCrypto.hash(input); - } catch (Exception e) { - mHash = null; - } - } - return mHash; + return input; } protected void setupColors() { @@ -65,11 +50,8 @@ public abstract class IdenticonBase { } public void show(byte[] input) { - if(input != null) { - mHash = getHash(input); - } else { - mHash = null; - } + mHash = input; + // set up the cell colors according to the input that was provided via show(...) setupColors(); @@ -85,8 +67,6 @@ public abstract class IdenticonBase { } } - abstract protected CryptoComponent getCrypto(); - abstract protected int getRowCount(); abstract protected int getColumnCount(); diff --git a/briar-android/src/im/delight/android/identicons/IdenticonDrawable.java b/briar-android/src/im/delight/android/identicons/IdenticonDrawable.java index 8034a6a1d..8d805cab9 100644 --- a/briar-android/src/im/delight/android/identicons/IdenticonDrawable.java +++ b/briar-android/src/im/delight/android/identicons/IdenticonDrawable.java @@ -6,8 +6,6 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.Log; -import org.briarproject.api.crypto.CryptoComponent; - /** * Created by saiimons on 05/10/14. */ @@ -16,13 +14,9 @@ public class IdenticonDrawable extends Drawable { private static final int CENTER_COLUMN_INDEX = 5; - public IdenticonDrawable(final CryptoComponent crypto, byte[] toShow) { + public IdenticonDrawable(byte[] toShow) { super(); mDelegate = new IdenticonBase() { - @Override - protected CryptoComponent getCrypto() { - return crypto; - } @Override protected int getRowCount() { diff --git a/briar-android/src/im/delight/android/identicons/SymmetricIdenticon.java b/briar-android/src/im/delight/android/identicons/SymmetricIdenticon.java index e89068e39..cb5dcc5bc 100644 --- a/briar-android/src/im/delight/android/identicons/SymmetricIdenticon.java +++ b/briar-android/src/im/delight/android/identicons/SymmetricIdenticon.java @@ -26,8 +26,7 @@ import javax.inject.Inject; public class SymmetricIdenticon extends IdenticonView { private static final int CENTER_COLUMN_INDEX = 5; - - @Inject protected CryptoComponent mCrypto; + private IdenticonBase mDelegate; public SymmetricIdenticon(Context context) { @@ -47,10 +46,6 @@ public class SymmetricIdenticon extends IdenticonView { private void initDelegate() { mDelegate = new IdenticonBase() { - @Override - protected CryptoComponent getCrypto() { - return mCrypto; - } @Override protected int getRowCount() { diff --git a/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java b/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java index 739912d95..38c64e839 100644 --- a/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java +++ b/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java @@ -87,11 +87,9 @@ public class ContactListAdapter } }); private Context ctx; - private CryptoComponent crypto; - public ContactListAdapter(Context context, CryptoComponent cryptoComponent) { + public ContactListAdapter(Context context) { ctx = context; - crypto = cryptoComponent; } @Override @@ -121,7 +119,7 @@ public class ContactListAdapter Author author = item.getContact().getAuthor(); ui.avatar.setImageDrawable( - new IdenticonDrawable(crypto, author.getId().getBytes())); + new IdenticonDrawable(author.getId().getBytes())); String contactName = author.getName(); if (unread > 0) { ui.name.setText(contactName + " (" + unread + ")"); diff --git a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java index afdb74a42..30d7ecb5d 100644 --- a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java +++ b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java @@ -65,8 +65,6 @@ public class ContactListFragment extends BaseEventFragment { return TAG; } - @Inject - protected CryptoComponent crypto; @Inject protected ConnectionRegistry connectionRegistry; private ContactListAdapter adapter = null; @@ -80,11 +78,6 @@ public class ContactListFragment extends BaseEventFragment { @Inject protected volatile EventBus eventBus; - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - @Override public void injectActivity(AndroidComponent component) { component.inject(this); @@ -98,7 +91,7 @@ public class ContactListFragment extends BaseEventFragment { inflater.inflate(R.layout.activity_contact_list, container, false); - adapter = new ContactListAdapter(getContext(), crypto); + adapter = new ContactListAdapter(getContext()); list = (BriarRecyclerView) contentView.findViewById(R.id.contactList); list.setLayoutManager(new LinearLayoutManager(getContext())); list.setAdapter(adapter); diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index a170bfdb2..4555d8c9d 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -72,7 +72,6 @@ public class ConversationActivity extends BriarActivity private static final Logger LOG = Logger.getLogger(ConversationActivity.class.getName()); - @Inject protected CryptoComponent crypto; @Inject protected AndroidNotificationManager notificationManager; @Inject protected ConnectionRegistry connectionRegistry; @Inject @CryptoExecutor protected Executor cryptoExecutor; @@ -104,7 +103,7 @@ public class ConversationActivity extends BriarActivity setContentView(R.layout.activity_conversation); - adapter = new ConversationAdapter(this, crypto); + adapter = new ConversationAdapter(this); list = (BriarRecyclerView) findViewById(R.id.conversationView); list.setLayoutManager(new LinearLayoutManager(this)); list.setAdapter(adapter); diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java index a35db98bd..7cb722732 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java @@ -73,12 +73,10 @@ class ConversationAdapter extends } }); private Context ctx; - private CryptoComponent crypto; private byte[] identiconKey; - public ConversationAdapter(Context context, CryptoComponent cryptoComponent) { + public ConversationAdapter(Context context) { ctx = context; - crypto = cryptoComponent; } public void setIdenticonKey(byte[] key) { @@ -133,7 +131,7 @@ class ConversationAdapter extends } else { if (identiconKey != null) ui.avatar.setImageDrawable( - new IdenticonDrawable(crypto, identiconKey)); + new IdenticonDrawable(identiconKey)); if (!header.isRead()) { int left = ui.layout.getPaddingLeft(); int top = ui.layout.getPaddingTop(); diff --git a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java index a3f038f48..59b5b4c39 100644 --- a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java +++ b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java @@ -124,7 +124,7 @@ implements OnItemSelectedListener, OnClickListener { left.addRule(CENTER_VERTICAL); header.addView(from, left); - adapter = new LocalAuthorSpinnerAdapter(this, crypto, true); + adapter = new LocalAuthorSpinnerAdapter(this, true); spinner = new Spinner(this); spinner.setId(2); spinner.setAdapter(adapter); diff --git a/briar-android/src/org/briarproject/android/identity/LocalAuthorSpinnerAdapter.java b/briar-android/src/org/briarproject/android/identity/LocalAuthorSpinnerAdapter.java index a0e2d88de..3a87c7c35 100644 --- a/briar-android/src/org/briarproject/android/identity/LocalAuthorSpinnerAdapter.java +++ b/briar-android/src/org/briarproject/android/identity/LocalAuthorSpinnerAdapter.java @@ -23,17 +23,14 @@ import static org.briarproject.android.identity.LocalAuthorItem.ANONYMOUS; import static org.briarproject.android.identity.LocalAuthorItem.NEW; public class LocalAuthorSpinnerAdapter extends BaseAdapter -implements SpinnerAdapter { + implements SpinnerAdapter { private final Context ctx; - private final CryptoComponent crypto; private final boolean includeAnonymous; private final List list = new ArrayList(); - public LocalAuthorSpinnerAdapter(Context ctx, - CryptoComponent crypto, boolean includeAnonymous) { + public LocalAuthorSpinnerAdapter(Context ctx, boolean includeAnonymous) { this.ctx = ctx; - this.crypto = crypto; this.includeAnonymous = includeAnonymous; } @@ -78,7 +75,7 @@ implements SpinnerAdapter { } else { name.setText(item.getLocalAuthor().getName()); avatar.setVisibility(View.VISIBLE); - avatar.setImageDrawable(new IdenticonDrawable(crypto, + avatar.setImageDrawable(new IdenticonDrawable( item.getLocalAuthor().getId().getBytes())); } return view; diff --git a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java index 80a997b26..e4baf6e13 100644 --- a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java +++ b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java @@ -56,7 +56,7 @@ implements OnItemSelectedListener, OnClickListener { TextView step = (TextView) view.findViewById(R.id.stepView); step.setText(String.format(ctx.getString(R.string.step), 1, 3)); - adapter = new LocalAuthorSpinnerAdapter(ctx, crypto, false); + adapter = new LocalAuthorSpinnerAdapter(ctx, false); spinner = (Spinner) view.findViewById(R.id.spinner); spinner.setAdapter(adapter); spinner.setOnItemSelectedListener(this); diff --git a/briar-android/src/org/briarproject/android/util/AuthorView.java b/briar-android/src/org/briarproject/android/util/AuthorView.java index 7a5d38f9e..4b11d51e8 100644 --- a/briar-android/src/org/briarproject/android/util/AuthorView.java +++ b/briar-android/src/org/briarproject/android/util/AuthorView.java @@ -19,7 +19,6 @@ import im.delight.android.identicons.IdenticonDrawable; public class AuthorView extends FrameLayout { - @Inject protected CryptoComponent crypto; private ImageView avatarView; private TextView nameView; private ImageView statusView; @@ -61,7 +60,7 @@ public class AuthorView extends FrameLayout { } else { nameView.setText(name); avatarView.setImageDrawable( - new IdenticonDrawable(crypto, id.getBytes())); + new IdenticonDrawable(id.getBytes())); } switch(status) { diff --git a/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java b/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java index 340ee0884..3d531c4e0 100644 --- a/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java +++ b/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java @@ -5,20 +5,12 @@ import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import javax.inject.Qualifier; -//import com.google.inject.BindingAnnotation; - /** Annotation for injecting the executor for long-running crypto tasks. */ -//@BindingAnnotation -//@Target({ FIELD, METHOD, PARAMETER }) -//@Retention(RUNTIME) -//public @interface CryptoExecutor {} - @Qualifier @Target({FIELD, METHOD, PARAMETER}) @Retention(RUNTIME) diff --git a/briar-core/src/org/briarproject/reliability/ReliabilityModule.java b/briar-core/src/org/briarproject/reliability/ReliabilityModule.java index 4c8ef0138..092f218b3 100644 --- a/briar-core/src/org/briarproject/reliability/ReliabilityModule.java +++ b/briar-core/src/org/briarproject/reliability/ReliabilityModule.java @@ -5,21 +5,19 @@ import org.briarproject.api.reliability.ReliabilityLayerFactory; import java.util.concurrent.Executor; +import javax.inject.Named; + import dagger.Module; import dagger.Provides; @Module public class ReliabilityModule { - /* @Provides - ReliabilityLayerFactory provideReliabilityFactory(@IoExecutor + ReliabilityLayerFactory provideReliabilityFactoryByExector(@IoExecutor Executor ioExecutor) { return new ReliabilityLayerFactoryImpl(ioExecutor); } - */ - - @Provides ReliabilityLayerFactory provideReliabilityFactory( From 9af3ce123a94bce69632cdeaaafde8780adf64a7 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Tue, 8 Mar 2016 22:35:42 +0100 Subject: [PATCH 06/13] Added eager singletons and made some fixes --- .../android/AndroidComponent.java | 2 ++ .../briarproject/android/AndroidModule.java | 27 ++++++++++++++++--- .../android/BriarApplication.java | 8 +++++- .../android/SplashScreenActivity.java | 3 +++ .../invitation/ChooseIdentityView.java | 6 ----- .../briarproject/clients/ClientsModule.java | 4 +++ .../briarproject/contact/ContactModule.java | 2 ++ .../org/briarproject/crypto/CryptoModule.java | 1 + .../org/briarproject/db/DatabaseModule.java | 4 +++ .../org/briarproject/forum/ForumModule.java | 5 ++++ .../briarproject/identity/IdentityModule.java | 3 +++ .../lifecycle/LifecycleModule.java | 1 + .../messaging/MessagingModule.java | 3 +++ .../properties/PropertiesModule.java | 3 +++ .../briarproject/settings/SettingsModule.java | 1 + .../src/org/briarproject/sync/SyncModule.java | 5 ++++ .../transport/TransportModule.java | 2 ++ 17 files changed, 70 insertions(+), 10 deletions(-) diff --git a/briar-android/src/org/briarproject/android/AndroidComponent.java b/briar-android/src/org/briarproject/android/AndroidComponent.java index caf43416a..5be1919a3 100644 --- a/briar-android/src/org/briarproject/android/AndroidComponent.java +++ b/briar-android/src/org/briarproject/android/AndroidComponent.java @@ -67,5 +67,7 @@ public interface AndroidComponent { void inject(ContactListFragment fragment); void inject(SettingsFragment fragment); void inject(ForumListFragment fragment); + // Eager singleton load + void inject(AndroidModule.EagerSingletons init); } diff --git a/briar-android/src/org/briarproject/android/AndroidModule.java b/briar-android/src/org/briarproject/android/AndroidModule.java index 427b884b5..b258be889 100644 --- a/briar-android/src/org/briarproject/android/AndroidModule.java +++ b/briar-android/src/org/briarproject/android/AndroidModule.java @@ -1,20 +1,24 @@ package org.briarproject.android; import android.app.Application; -import android.content.SharedPreferences; -import android.support.v7.preference.PreferenceManager; import org.briarproject.api.android.AndroidExecutor; import org.briarproject.api.android.AndroidNotificationManager; import org.briarproject.api.android.ReferenceManager; +import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.db.DatabaseConfig; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.plugins.PluginManager; +import org.briarproject.api.properties.TransportPropertyManager; +import org.briarproject.api.sync.ValidationManager; +import org.briarproject.api.transport.KeyManager; import org.briarproject.api.ui.UiCallback; import java.io.File; +import javax.inject.Inject; import javax.inject.Singleton; import dagger.Module; @@ -25,6 +29,24 @@ import static android.content.Context.MODE_PRIVATE; @Module public class AndroidModule { + static class EagerSingletons { + // Load all relevant eager singletons and their references + @Inject + KeyManager keyManager; + @Inject + ValidationManager validationManager; + @Inject + PluginManager pluginManager; + @Inject + AndroidNotificationManager androidNotificationManager; + @Inject + TransportPropertyManager transportPropertyManager; + } + + static void injectEager(AndroidComponent c) { + c.inject(new EagerSingletons()); + } + private final UiCallback uiCallback; public AndroidModule() { @@ -93,7 +115,6 @@ public class AndroidModule { }; } - @Provides @Singleton AndroidNotificationManager provideAndroidNotificationManager( diff --git a/briar-android/src/org/briarproject/android/BriarApplication.java b/briar-android/src/org/briarproject/android/BriarApplication.java index 1478b6e2d..e56688e69 100644 --- a/briar-android/src/org/briarproject/android/BriarApplication.java +++ b/briar-android/src/org/briarproject/android/BriarApplication.java @@ -6,6 +6,8 @@ import java.util.logging.Logger; import android.app.Application; import android.content.Context; +import org.briarproject.event.EventModule; + public class BriarApplication extends Application { private static final Logger LOG = @@ -16,7 +18,7 @@ public class BriarApplication extends Application { @Override public void onCreate() { super.onCreate(); - LOG.info("Created"); + LOG.info("Application Created"); UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler(); Context ctx = getApplicationContext(); @@ -27,6 +29,10 @@ public class BriarApplication extends Application { .appModule(new AppModule(this)) .androidModule(new AndroidModule()) .build(); + // We need to load the eager singletons directly after making the + // dependency graph + AndroidModule.injectEager(applicationComponent); + } public AndroidComponent getApplicationComponent() { diff --git a/briar-android/src/org/briarproject/android/SplashScreenActivity.java b/briar-android/src/org/briarproject/android/SplashScreenActivity.java index ef374c113..acc0652af 100644 --- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java +++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java @@ -8,6 +8,7 @@ import android.os.StrictMode; import android.os.StrictMode.ThreadPolicy; import android.os.StrictMode.VmPolicy; import android.support.v7.preference.PreferenceManager; +import android.util.Log; import android.widget.ImageView; import android.widget.LinearLayout; @@ -38,6 +39,8 @@ public class SplashScreenActivity extends BaseActivity { @Inject DatabaseConfig dbConfig; + + public SplashScreenActivity() { Logger.getLogger("").setLevel(DEFAULT_LOG_LEVEL); enableStrictMode(); diff --git a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java index e4baf6e13..940de7e75 100644 --- a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java +++ b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java @@ -16,14 +16,11 @@ import org.briarproject.android.identity.CreateIdentityActivity; import org.briarproject.android.identity.LocalAuthorItem; import org.briarproject.android.identity.LocalAuthorItemComparator; import org.briarproject.android.identity.LocalAuthorSpinnerAdapter; -import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.identity.AuthorId; import org.briarproject.api.identity.LocalAuthor; import java.util.Collection; -import javax.inject.Inject; - import static android.bluetooth.BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE; import static android.bluetooth.BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION; import static org.briarproject.android.identity.LocalAuthorItem.NEW; @@ -33,7 +30,6 @@ import static org.briarproject.android.invitation.AddContactActivity.REQUEST_CRE class ChooseIdentityView extends AddContactView implements OnItemSelectedListener, OnClickListener { - @Inject protected CryptoComponent crypto; private LocalAuthorSpinnerAdapter adapter = null; private Spinner spinner = null; @@ -44,8 +40,6 @@ implements OnItemSelectedListener, OnClickListener { void populate() { removeAllViews(); Context ctx = getContext(); - // TODO -// RoboGuice.injectMembers(ctx, this); LayoutInflater inflater = (LayoutInflater) ctx.getSystemService (Context.LAYOUT_INFLATER_SERVICE); diff --git a/briar-core/src/org/briarproject/clients/ClientsModule.java b/briar-core/src/org/briarproject/clients/ClientsModule.java index 10bcbc3c7..055143d43 100644 --- a/briar-core/src/org/briarproject/clients/ClientsModule.java +++ b/briar-core/src/org/briarproject/clients/ClientsModule.java @@ -9,6 +9,10 @@ import org.briarproject.api.data.MetadataParser; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.sync.GroupFactory; import org.briarproject.api.sync.MessageFactory; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.messaging.MessagingModule; +import org.briarproject.sync.SyncModule; import dagger.Module; import dagger.Provides; diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java index f2009be57..e4927a74f 100644 --- a/briar-core/src/org/briarproject/contact/ContactModule.java +++ b/briar-core/src/org/briarproject/contact/ContactModule.java @@ -3,6 +3,8 @@ package org.briarproject.contact; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.identity.IdentityModule; +import org.briarproject.lifecycle.LifecycleModule; import javax.inject.Singleton; diff --git a/briar-core/src/org/briarproject/crypto/CryptoModule.java b/briar-core/src/org/briarproject/crypto/CryptoModule.java index 04e216b80..c8b1d4845 100644 --- a/briar-core/src/org/briarproject/crypto/CryptoModule.java +++ b/briar-core/src/org/briarproject/crypto/CryptoModule.java @@ -7,6 +7,7 @@ import org.briarproject.api.crypto.StreamDecrypterFactory; import org.briarproject.api.crypto.StreamEncrypterFactory; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.system.SeedProvider; +import org.briarproject.lifecycle.LifecycleModule; import java.security.SecureRandom; import java.util.concurrent.BlockingQueue; diff --git a/briar-core/src/org/briarproject/db/DatabaseModule.java b/briar-core/src/org/briarproject/db/DatabaseModule.java index 74512c9c0..c177c9ae4 100644 --- a/briar-core/src/org/briarproject/db/DatabaseModule.java +++ b/briar-core/src/org/briarproject/db/DatabaseModule.java @@ -7,6 +7,9 @@ import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.ShutdownManager; import org.briarproject.api.system.Clock; +import org.briarproject.data.DataModule; +import org.briarproject.event.EventModule; +import org.briarproject.lifecycle.LifecycleModule; import java.security.SecureRandom; import java.sql.Connection; @@ -17,6 +20,7 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; +import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java index 5712c165e..dba71334f 100644 --- a/briar-core/src/org/briarproject/forum/ForumModule.java +++ b/briar-core/src/org/briarproject/forum/ForumModule.java @@ -15,6 +15,11 @@ import org.briarproject.api.identity.Author; import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; +import org.briarproject.contact.ContactModule; +import org.briarproject.crypto.CryptoModule; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.sync.SyncModule; import javax.inject.Singleton; diff --git a/briar-core/src/org/briarproject/identity/IdentityModule.java b/briar-core/src/org/briarproject/identity/IdentityModule.java index 99e8eeb0f..e27015612 100644 --- a/briar-core/src/org/briarproject/identity/IdentityModule.java +++ b/briar-core/src/org/briarproject/identity/IdentityModule.java @@ -9,6 +9,9 @@ import org.briarproject.api.identity.Author; import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.system.Clock; +import org.briarproject.crypto.CryptoModule; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; import javax.inject.Singleton; diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java index 5685dd2a2..c6218f273 100644 --- a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java +++ b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java @@ -17,6 +17,7 @@ import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.ShutdownManager; import org.briarproject.api.system.Clock; +import org.briarproject.event.EventModule; import dagger.Module; import dagger.Provides; diff --git a/briar-core/src/org/briarproject/messaging/MessagingModule.java b/briar-core/src/org/briarproject/messaging/MessagingModule.java index 89c748a59..6a68b0fe1 100644 --- a/briar-core/src/org/briarproject/messaging/MessagingModule.java +++ b/briar-core/src/org/briarproject/messaging/MessagingModule.java @@ -9,6 +9,9 @@ import org.briarproject.api.messaging.PrivateMessageFactory; import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; +import org.briarproject.contact.ContactModule; +import org.briarproject.data.DataModule; +import org.briarproject.sync.SyncModule; import javax.inject.Singleton; diff --git a/briar-core/src/org/briarproject/properties/PropertiesModule.java b/briar-core/src/org/briarproject/properties/PropertiesModule.java index 057f685ba..15fcf56aa 100644 --- a/briar-core/src/org/briarproject/properties/PropertiesModule.java +++ b/briar-core/src/org/briarproject/properties/PropertiesModule.java @@ -6,6 +6,9 @@ import org.briarproject.api.data.MetadataEncoder; import org.briarproject.api.properties.TransportPropertyManager; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; +import org.briarproject.contact.ContactModule; +import org.briarproject.data.DataModule; +import org.briarproject.sync.SyncModule; import javax.inject.Singleton; diff --git a/briar-core/src/org/briarproject/settings/SettingsModule.java b/briar-core/src/org/briarproject/settings/SettingsModule.java index d8aa3b915..b9edc9951 100644 --- a/briar-core/src/org/briarproject/settings/SettingsModule.java +++ b/briar-core/src/org/briarproject/settings/SettingsModule.java @@ -2,6 +2,7 @@ package org.briarproject.settings; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.settings.SettingsManager; +import org.briarproject.db.DatabaseModule; import dagger.Module; import dagger.Provides; diff --git a/briar-core/src/org/briarproject/sync/SyncModule.java b/briar-core/src/org/briarproject/sync/SyncModule.java index 654f029e6..6c286f8af 100644 --- a/briar-core/src/org/briarproject/sync/SyncModule.java +++ b/briar-core/src/org/briarproject/sync/SyncModule.java @@ -16,9 +16,14 @@ import org.briarproject.api.sync.PacketWriterFactory; import org.briarproject.api.sync.SyncSessionFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; +import org.briarproject.crypto.CryptoModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.event.EventModule; +import org.briarproject.lifecycle.LifecycleModule; import java.util.concurrent.Executor; +import javax.inject.Inject; import javax.inject.Singleton; import dagger.Module; diff --git a/briar-core/src/org/briarproject/transport/TransportModule.java b/briar-core/src/org/briarproject/transport/TransportModule.java index 090882d1a..5a4ae8936 100644 --- a/briar-core/src/org/briarproject/transport/TransportModule.java +++ b/briar-core/src/org/briarproject/transport/TransportModule.java @@ -7,6 +7,8 @@ import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; +import org.briarproject.event.EventModule; +import org.briarproject.lifecycle.LifecycleModule; import javax.inject.Singleton; From 10764d727b519b45454ac7ebcb828345cc60bdb1 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Tue, 8 Mar 2016 23:05:10 +0100 Subject: [PATCH 07/13] rebased with master --- .../briarproject/sync/ConstantsComponent.java | 3 ++- .../briarproject/android/AndroidModule.java | 11 ++++++++ .../android/BriarApplication.java | 2 -- .../src/org/briarproject/data/DataModule.java | 8 +++--- .../data/MetadataEncoderImpl.java | 4 +-- .../briarproject/data/MetadataParserImpl.java | 4 +-- .../org/briarproject/forum/ForumModule.java | 26 ++++++++----------- .../messaging/MessagingModule.java | 10 +++---- .../messaging/PrivateMessageValidator.java | 2 +- .../properties/PropertiesModule.java | 5 ++-- .../TransportPropertyValidator.java | 2 +- .../org/briarproject/TestLifecycleModule.java | 1 + 12 files changed, 43 insertions(+), 35 deletions(-) diff --git a/briar-android-tests/src/test/java/org/briarproject/sync/ConstantsComponent.java b/briar-android-tests/src/test/java/org/briarproject/sync/ConstantsComponent.java index 9a59db135..6e8b2c782 100644 --- a/briar-android-tests/src/test/java/org/briarproject/sync/ConstantsComponent.java +++ b/briar-android-tests/src/test/java/org/briarproject/sync/ConstantsComponent.java @@ -3,6 +3,7 @@ package org.briarproject.sync; import org.briarproject.TestDatabaseModule; import org.briarproject.TestLifecycleModule; import org.briarproject.TestSystemModule; +import org.briarproject.clients.ClientsModule; import org.briarproject.contact.ContactModule; import org.briarproject.crypto.CryptoModule; import org.briarproject.data.DataModule; @@ -22,7 +23,7 @@ import dagger.Component; TestSystemModule.class, ContactModule.class, CryptoModule.class, DatabaseModule.class, EventModule.class, SyncModule.class, DataModule.class, TransportModule.class, ForumModule.class, - IdentityModule.class, MessagingModule.class}) + IdentityModule.class, MessagingModule.class, ClientsModule.class}) public interface ConstantsComponent { void inject(ConstantsTest testCase); } diff --git a/briar-android/src/org/briarproject/android/AndroidModule.java b/briar-android/src/org/briarproject/android/AndroidModule.java index b258be889..9343a31e8 100644 --- a/briar-android/src/org/briarproject/android/AndroidModule.java +++ b/briar-android/src/org/briarproject/android/AndroidModule.java @@ -10,11 +10,14 @@ import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.db.DatabaseConfig; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.messaging.MessagingManager; import org.briarproject.api.plugins.PluginManager; import org.briarproject.api.properties.TransportPropertyManager; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.transport.KeyManager; import org.briarproject.api.ui.UiCallback; +import org.briarproject.messaging.PrivateMessageValidator; +import org.briarproject.properties.TransportPropertyValidator; import java.io.File; @@ -41,6 +44,14 @@ public class AndroidModule { AndroidNotificationManager androidNotificationManager; @Inject TransportPropertyManager transportPropertyManager; + @Inject + MessagingManager messagingManager; + @Inject + PrivateMessageValidator privateMessageValidator; + @Inject + TransportPropertyValidator transportPropertyValidator; + + } static void injectEager(AndroidComponent c) { diff --git a/briar-android/src/org/briarproject/android/BriarApplication.java b/briar-android/src/org/briarproject/android/BriarApplication.java index e56688e69..ac670b9ef 100644 --- a/briar-android/src/org/briarproject/android/BriarApplication.java +++ b/briar-android/src/org/briarproject/android/BriarApplication.java @@ -6,8 +6,6 @@ import java.util.logging.Logger; import android.app.Application; import android.content.Context; -import org.briarproject.event.EventModule; - public class BriarApplication extends Application { private static final Logger LOG = diff --git a/briar-core/src/org/briarproject/data/DataModule.java b/briar-core/src/org/briarproject/data/DataModule.java index 5c77b8ac7..8a8286511 100644 --- a/briar-core/src/org/briarproject/data/DataModule.java +++ b/briar-core/src/org/briarproject/data/DataModule.java @@ -23,13 +23,13 @@ public class DataModule { } @Provides - MetadataParser provideMetaDataParser() { - return new MetadataParserImpl(); + MetadataParser provideMetaDataParser(BdfReaderFactory bdfReaderFactory) { + return new MetadataParserImpl(bdfReaderFactory); } @Provides - MetadataEncoder provideMetaDataEncoider() { - return new MetadataEncoderImpl(); + MetadataEncoder provideMetaDataEncoider(BdfWriterFactory bdfWriterFactory) { + return new MetadataEncoderImpl(bdfWriterFactory); } } diff --git a/briar-core/src/org/briarproject/data/MetadataEncoderImpl.java b/briar-core/src/org/briarproject/data/MetadataEncoderImpl.java index c35ee3ddb..d6cc64b14 100644 --- a/briar-core/src/org/briarproject/data/MetadataEncoderImpl.java +++ b/briar-core/src/org/briarproject/data/MetadataEncoderImpl.java @@ -1,7 +1,5 @@ package org.briarproject.data; -import com.google.inject.Inject; - import org.briarproject.api.Bytes; import org.briarproject.api.FormatException; import org.briarproject.api.data.BdfDictionary; @@ -16,6 +14,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import javax.inject.Inject; + import static org.briarproject.api.data.BdfDictionary.NULL_VALUE; import static org.briarproject.api.db.Metadata.REMOVE; diff --git a/briar-core/src/org/briarproject/data/MetadataParserImpl.java b/briar-core/src/org/briarproject/data/MetadataParserImpl.java index 7d59970b8..f387b2d0c 100644 --- a/briar-core/src/org/briarproject/data/MetadataParserImpl.java +++ b/briar-core/src/org/briarproject/data/MetadataParserImpl.java @@ -1,7 +1,5 @@ package org.briarproject.data; -import com.google.inject.Inject; - import org.briarproject.api.FormatException; import org.briarproject.api.data.BdfDictionary; import org.briarproject.api.data.BdfReader; @@ -13,6 +11,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Map.Entry; +import javax.inject.Inject; + import static org.briarproject.api.data.BdfDictionary.NULL_VALUE; import static org.briarproject.api.db.Metadata.REMOVE; diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java index dba71334f..cbe2c7f19 100644 --- a/briar-core/src/org/briarproject/forum/ForumModule.java +++ b/briar-core/src/org/briarproject/forum/ForumModule.java @@ -1,5 +1,6 @@ package org.briarproject.forum; +import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.data.BdfReaderFactory; @@ -12,6 +13,7 @@ import org.briarproject.api.forum.ForumManager; import org.briarproject.api.forum.ForumPostFactory; import org.briarproject.api.forum.ForumSharingManager; import org.briarproject.api.identity.Author; +import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; @@ -40,23 +42,18 @@ public class ForumModule { @Provides ForumPostFactory provideForumPostFactory(CryptoComponent crypto, - MessageFactory messageFactory, - BdfWriterFactory bdfWriterFactory) { - return new ForumPostFactoryImpl(crypto, messageFactory, - bdfWriterFactory); + ClientHelper clientHelper) { + return new ForumPostFactoryImpl(crypto, clientHelper); } @Provides @Singleton ForumPostValidator provideForumPostValidator( ValidationManager validationManager, CryptoComponent crypto, - BdfReaderFactory bdfReaderFactory, - BdfWriterFactory bdfWriterFactory, - ObjectReader authorReader, MetadataEncoder metadataEncoder, - Clock clock) { + AuthorFactory authorFactory, ClientHelper clientHelper, + MetadataEncoder metadataEncoder, Clock clock) { ForumPostValidator validator = new ForumPostValidator(crypto, - bdfReaderFactory, bdfWriterFactory, authorReader, - metadataEncoder, clock); + authorFactory, clientHelper, metadataEncoder, clock); validationManager.registerMessageValidator( ForumManagerImpl.CLIENT_ID, validator); return validator; @@ -65,11 +62,10 @@ public class ForumModule { @Provides @Singleton ForumListValidator provideForumListValidator( - ValidationManager validationManager, - BdfReaderFactory bdfReaderFactory, - MetadataEncoder metadataEncoder) { - ForumListValidator validator = new ForumListValidator(bdfReaderFactory, - metadataEncoder); + ValidationManager validationManager, ClientHelper clientHelper, + MetadataEncoder metadataEncoder, Clock clock) { + ForumListValidator validator = new ForumListValidator(clientHelper, + metadataEncoder, clock); validationManager.registerMessageValidator( ForumSharingManagerImpl.CLIENT_ID, validator); return validator; diff --git a/briar-core/src/org/briarproject/messaging/MessagingModule.java b/briar-core/src/org/briarproject/messaging/MessagingModule.java index 6a68b0fe1..6f0921d82 100644 --- a/briar-core/src/org/briarproject/messaging/MessagingModule.java +++ b/briar-core/src/org/briarproject/messaging/MessagingModule.java @@ -1,5 +1,6 @@ package org.briarproject.messaging; +import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.data.BdfReaderFactory; import org.briarproject.api.data.BdfWriterFactory; @@ -25,19 +26,18 @@ public class MessagingModule { @Provides PrivateMessageFactory providePrivateMessageFactory( - MessageFactory messageFactory, - BdfWriterFactory bdfWriterFactory) { - return new PrivateMessageFactoryImpl(messageFactory, bdfWriterFactory); + ClientHelper clientHelper) { + return new PrivateMessageFactoryImpl(clientHelper); } @Provides @Singleton PrivateMessageValidator getValidator(ValidationManager validationManager, - BdfReaderFactory bdfReaderFactory, MetadataEncoder metadataEncoder, + ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock) { PrivateMessageValidator validator = new PrivateMessageValidator( - bdfReaderFactory, metadataEncoder, clock); + clientHelper, metadataEncoder, clock); validationManager.registerMessageValidator(CLIENT_ID, validator); return validator; } diff --git a/briar-core/src/org/briarproject/messaging/PrivateMessageValidator.java b/briar-core/src/org/briarproject/messaging/PrivateMessageValidator.java index 550da3f9c..ad1fcb81b 100644 --- a/briar-core/src/org/briarproject/messaging/PrivateMessageValidator.java +++ b/briar-core/src/org/briarproject/messaging/PrivateMessageValidator.java @@ -14,7 +14,7 @@ import org.briarproject.clients.BdfMessageValidator; import static org.briarproject.api.messaging.MessagingConstants.MAX_CONTENT_TYPE_LENGTH; import static org.briarproject.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_BODY_LENGTH; -class PrivateMessageValidator extends BdfMessageValidator { +public class PrivateMessageValidator extends BdfMessageValidator { PrivateMessageValidator(ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock) { diff --git a/briar-core/src/org/briarproject/properties/PropertiesModule.java b/briar-core/src/org/briarproject/properties/PropertiesModule.java index 15fcf56aa..e008146d2 100644 --- a/briar-core/src/org/briarproject/properties/PropertiesModule.java +++ b/briar-core/src/org/briarproject/properties/PropertiesModule.java @@ -1,5 +1,6 @@ package org.briarproject.properties; +import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.data.BdfReaderFactory; import org.briarproject.api.data.MetadataEncoder; @@ -23,10 +24,10 @@ public class PropertiesModule { @Provides @Singleton TransportPropertyValidator getValidator(ValidationManager validationManager, - BdfReaderFactory bdfReaderFactory, MetadataEncoder metadataEncoder, + ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock) { TransportPropertyValidator validator = new TransportPropertyValidator( - bdfReaderFactory, metadataEncoder, clock); + clientHelper, metadataEncoder, clock); validationManager.registerMessageValidator(CLIENT_ID, validator); return validator; } diff --git a/briar-core/src/org/briarproject/properties/TransportPropertyValidator.java b/briar-core/src/org/briarproject/properties/TransportPropertyValidator.java index 55b913c7d..b26775d73 100644 --- a/briar-core/src/org/briarproject/properties/TransportPropertyValidator.java +++ b/briar-core/src/org/briarproject/properties/TransportPropertyValidator.java @@ -15,7 +15,7 @@ import static org.briarproject.api.TransportId.MAX_TRANSPORT_ID_LENGTH; import static org.briarproject.api.properties.TransportPropertyConstants.MAX_PROPERTIES_PER_TRANSPORT; import static org.briarproject.api.properties.TransportPropertyConstants.MAX_PROPERTY_LENGTH; -class TransportPropertyValidator extends BdfMessageValidator { +public class TransportPropertyValidator extends BdfMessageValidator { TransportPropertyValidator(ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock) { diff --git a/briar-tests/src/org/briarproject/TestLifecycleModule.java b/briar-tests/src/org/briarproject/TestLifecycleModule.java index 8df124d7d..6022af177 100644 --- a/briar-tests/src/org/briarproject/TestLifecycleModule.java +++ b/briar-tests/src/org/briarproject/TestLifecycleModule.java @@ -55,6 +55,7 @@ public class TestLifecycleModule { }; } + @Provides ShutdownManager provideShutdownManager() { return new ShutdownManager() { @Override From 6f233070fec8598d729e4739b04ec91c9bdfa715 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Thu, 10 Mar 2016 22:31:08 +0100 Subject: [PATCH 08/13] Semi-encapsulated the core/api dependency graphs and created a proper structure to load eager singletons --- .../android/AndroidComponent.java | 33 +----- .../android/AndroidEagerSingletons.java | 8 ++ .../briarproject/android/AndroidModule.java | 107 +----------------- .../AndroidNotificationManagerImpl.java | 22 ++-- .../org/briarproject/android/AppModule.java | 5 +- .../android/ApplicationScope.java | 11 ++ .../android/BriarApplication.java | 22 +++- .../briarproject/android/BriarService.java | 6 +- .../plugins/AndroidPluginsModule.java | 22 +--- .../plugins/PluginsModuleExtension.java | 50 ++++++++ .../AndroidExecutorImpl.java | 7 +- .../system/PlatformModuleExtension.java | 78 +++++++++++++ .../system/SystemModuleExtension.java | 32 ++++++ ...oidExecutor.java => PlatformExecutor.java} | 2 +- .../src/org/briarproject/CoreComponent.java | 103 +++++++++++++++++ .../org/briarproject/CoreEagerSingletons.java | 28 +++++ .../src/org/briarproject/PlatformModule.java | 36 ++++++ .../briarproject/contact/ContactModule.java | 7 +- .../org/briarproject/crypto/CryptoModule.java | 7 +- .../org/briarproject/db/DatabaseModule.java | 9 +- .../org/briarproject/forum/ForumModule.java | 19 ++-- .../lifecycle/LifecycleModule.java | 7 +- .../messaging/MessagingModule.java | 13 +-- .../briarproject/plugins/PluginsModule.java | 30 +++++ .../properties/PropertiesModule.java | 10 +- .../src/org/briarproject/sync/SyncModule.java | 12 +- .../org/briarproject/system/SystemModule.java | 15 +-- .../transport/TransportModule.java | 7 +- 28 files changed, 483 insertions(+), 225 deletions(-) create mode 100644 briar-android/src/org/briarproject/android/AndroidEagerSingletons.java create mode 100644 briar-android/src/org/briarproject/android/ApplicationScope.java create mode 100644 briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java rename briar-android/src/org/briarproject/{android => system}/AndroidExecutorImpl.java (85%) create mode 100644 briar-android/src/org/briarproject/system/PlatformModuleExtension.java create mode 100644 briar-android/src/org/briarproject/system/SystemModuleExtension.java rename briar-api/src/org/briarproject/api/android/{AndroidExecutor.java => PlatformExecutor.java} (92%) create mode 100644 briar-core/src/org/briarproject/CoreComponent.java create mode 100644 briar-core/src/org/briarproject/CoreEagerSingletons.java create mode 100644 briar-core/src/org/briarproject/PlatformModule.java rename briar-android/src/org/briarproject/system/AndroidSystemModule.java => briar-core/src/org/briarproject/system/SystemModule.java (61%) diff --git a/briar-android/src/org/briarproject/android/AndroidComponent.java b/briar-android/src/org/briarproject/android/AndroidComponent.java index 5be1919a3..27f156e91 100644 --- a/briar-android/src/org/briarproject/android/AndroidComponent.java +++ b/briar-android/src/org/briarproject/android/AndroidComponent.java @@ -1,5 +1,6 @@ package org.briarproject.android; +import org.briarproject.CoreComponent; import org.briarproject.android.contact.ContactListFragment; import org.briarproject.android.contact.ConversationActivity; import org.briarproject.android.forum.AvailableForumsActivity; @@ -14,38 +15,12 @@ import org.briarproject.android.identity.CreateIdentityActivity; import org.briarproject.android.invitation.AddContactActivity; import org.briarproject.android.panic.PanicPreferencesActivity; import org.briarproject.android.panic.PanicResponderActivity; -import org.briarproject.clients.ClientsModule; -import org.briarproject.contact.ContactModule; -import org.briarproject.crypto.CryptoModule; -import org.briarproject.data.DataModule; -import org.briarproject.db.DatabaseModule; -import org.briarproject.event.EventModule; -import org.briarproject.forum.ForumModule; -import org.briarproject.identity.IdentityModule; -import org.briarproject.invitation.InvitationModule; -import org.briarproject.lifecycle.LifecycleModule; -import org.briarproject.messaging.MessagingModule; -import org.briarproject.plugins.AndroidPluginsModule; -import org.briarproject.properties.PropertiesModule; -import org.briarproject.reliability.ReliabilityModule; -import org.briarproject.settings.SettingsModule; -import org.briarproject.sync.SyncModule; -import org.briarproject.system.AndroidSystemModule; -import org.briarproject.transport.TransportModule; - -import javax.inject.Singleton; import dagger.Component; -@Singleton +@ApplicationScope @Component( - modules = {AppModule.class, AndroidModule.class, DatabaseModule.class, - CryptoModule.class, LifecycleModule.class, - ReliabilityModule.class, MessagingModule.class, - InvitationModule.class, ForumModule.class, IdentityModule.class, - EventModule.class, DataModule.class, ContactModule.class, - AndroidSystemModule.class, AndroidPluginsModule.class, - PropertiesModule.class, TransportModule.class, SyncModule.class, - SettingsModule.class, ClientsModule.class}) + dependencies = {CoreComponent.class}, + modules = {AppModule.class, AndroidModule.class}) public interface AndroidComponent { void inject(SplashScreenActivity activity); void inject(SetupActivity activity); diff --git a/briar-android/src/org/briarproject/android/AndroidEagerSingletons.java b/briar-android/src/org/briarproject/android/AndroidEagerSingletons.java new file mode 100644 index 000000000..b14a78593 --- /dev/null +++ b/briar-android/src/org/briarproject/android/AndroidEagerSingletons.java @@ -0,0 +1,8 @@ +package org.briarproject.android; + +public class AndroidEagerSingletons { + + public static void initEagerSingletons(AndroidComponent c) { + c.inject(new AndroidModule.EagerSingletons()); + } +} diff --git a/briar-android/src/org/briarproject/android/AndroidModule.java b/briar-android/src/org/briarproject/android/AndroidModule.java index 9343a31e8..53ea73f15 100644 --- a/briar-android/src/org/briarproject/android/AndroidModule.java +++ b/briar-android/src/org/briarproject/android/AndroidModule.java @@ -1,138 +1,37 @@ package org.briarproject.android; -import android.app.Application; - -import org.briarproject.api.android.AndroidExecutor; import org.briarproject.api.android.AndroidNotificationManager; import org.briarproject.api.android.ReferenceManager; -import org.briarproject.api.contact.ContactManager; -import org.briarproject.api.crypto.SecretKey; -import org.briarproject.api.db.DatabaseConfig; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.LifecycleManager; -import org.briarproject.api.messaging.MessagingManager; -import org.briarproject.api.plugins.PluginManager; -import org.briarproject.api.properties.TransportPropertyManager; -import org.briarproject.api.sync.ValidationManager; -import org.briarproject.api.transport.KeyManager; -import org.briarproject.api.ui.UiCallback; -import org.briarproject.messaging.PrivateMessageValidator; -import org.briarproject.properties.TransportPropertyValidator; - -import java.io.File; import javax.inject.Inject; -import javax.inject.Singleton; import dagger.Module; import dagger.Provides; -import static android.content.Context.MODE_PRIVATE; - @Module public class AndroidModule { static class EagerSingletons { - // Load all relevant eager singletons and their references - @Inject - KeyManager keyManager; - @Inject - ValidationManager validationManager; - @Inject - PluginManager pluginManager; @Inject AndroidNotificationManager androidNotificationManager; - @Inject - TransportPropertyManager transportPropertyManager; - @Inject - MessagingManager messagingManager; - @Inject - PrivateMessageValidator privateMessageValidator; - @Inject - TransportPropertyValidator transportPropertyValidator; - - - } - - static void injectEager(AndroidComponent c) { - c.inject(new EagerSingletons()); - } - - private final UiCallback uiCallback; - - public AndroidModule() { - // Use a dummy UI callback - uiCallback = new UiCallback() { - - public int showChoice(String[] options, String... message) { - throw new UnsupportedOperationException(); - } - - public boolean showConfirmationMessage(String... message) { - throw new UnsupportedOperationException(); - } - - public void showMessage(String... message) { - throw new UnsupportedOperationException(); - } - }; } @Provides - UiCallback provideUICallback() { - return uiCallback; - } - - @Provides - @Singleton + @ApplicationScope ReferenceManager provideReferenceManager() { return new ReferenceManagerImpl(); } @Provides - @Singleton - AndroidExecutor provideAndroidExecutor( - AndroidExecutorImpl androidExecutor) { - return androidExecutor; - } - - @Provides - @Singleton - DatabaseConfig provideDatabaseConfig(final Application app) { - final File dir = app.getApplicationContext().getDir("db", MODE_PRIVATE); - return new DatabaseConfig() { - - private volatile SecretKey key = null; - - public boolean databaseExists() { - return dir.isDirectory() && dir.listFiles().length > 0; - } - - public File getDatabaseDirectory() { - return dir; - } - - public void setEncryptionKey(SecretKey key) { - this.key = key; - } - - public SecretKey getEncryptionKey() { - return key; - } - - public long getMaxSize() { - return Long.MAX_VALUE; - } - }; - } - - @Provides - @Singleton + @ApplicationScope AndroidNotificationManager provideAndroidNotificationManager( LifecycleManager lifecycleManager, EventBus eventBus, AndroidNotificationManagerImpl notificationManager) { lifecycleManager.register(notificationManager); eventBus.addListener(notificationManager); + return notificationManager; } diff --git a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java index 8a0561f4d..64ae4e90e 100644 --- a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java +++ b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java @@ -12,7 +12,7 @@ import android.support.v4.app.TaskStackBuilder; import org.briarproject.R; import org.briarproject.android.contact.ConversationActivity; import org.briarproject.android.forum.ForumActivity; -import org.briarproject.api.android.AndroidExecutor; +import org.briarproject.api.android.PlatformExecutor; import org.briarproject.api.android.AndroidNotificationManager; import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.db.DbException; @@ -65,7 +65,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, private final SettingsManager settingsManager; private final MessagingManager messagingManager; private final ForumManager forumManager; - private final AndroidExecutor androidExecutor; + private final PlatformExecutor platformExecutor; private final Context appContext; // The following must only be accessed on the main UI thread @@ -82,13 +82,13 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, @Inject public AndroidNotificationManagerImpl(@DatabaseExecutor Executor dbExecutor, SettingsManager settingsManager, MessagingManager messagingManager, - ForumManager forumManager, AndroidExecutor androidExecutor, + ForumManager forumManager, PlatformExecutor platformExecutor, Application app) { this.dbExecutor = dbExecutor; this.settingsManager = settingsManager; this.messagingManager = messagingManager; this.forumManager = forumManager; - this.androidExecutor = androidExecutor; + this.platformExecutor = platformExecutor; appContext = app.getApplicationContext(); } @@ -118,7 +118,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } private void clearNotifications() { - androidExecutor.execute(new Runnable() { + platformExecutor.execute(new Runnable() { public void run() { clearPrivateMessageNotification(); clearForumPostNotification(); @@ -155,7 +155,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void showPrivateMessageNotification(final GroupId g) { - androidExecutor.execute(new Runnable() { + platformExecutor.execute(new Runnable() { public void run() { Integer count = contactCounts.get(g); if (count == null) contactCounts.put(g, 1); @@ -168,7 +168,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void clearPrivateMessageNotification(final GroupId g) { - androidExecutor.execute(new Runnable() { + platformExecutor.execute(new Runnable() { public void run() { Integer count = contactCounts.remove(g); if (count == null) return; // Already cleared @@ -239,7 +239,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void showForumPostNotification(final GroupId g) { - androidExecutor.execute(new Runnable() { + platformExecutor.execute(new Runnable() { public void run() { Integer count = forumCounts.get(g); if (count == null) forumCounts.put(g, 1); @@ -252,7 +252,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void clearForumPostNotification(final GroupId g) { - androidExecutor.execute(new Runnable() { + platformExecutor.execute(new Runnable() { public void run() { Integer count = forumCounts.remove(g); if (count == null) return; // Already cleared @@ -311,7 +311,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void blockNotification(final GroupId g) { - androidExecutor.execute(new Runnable() { + platformExecutor.execute(new Runnable() { public void run() { visibleGroup = g; } @@ -319,7 +319,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void unblockNotification(final GroupId g) { - androidExecutor.execute(new Runnable() { + platformExecutor.execute(new Runnable() { public void run() { if (g.equals(visibleGroup)) visibleGroup = null; } diff --git a/briar-android/src/org/briarproject/android/AppModule.java b/briar-android/src/org/briarproject/android/AppModule.java index d3779d1a1..b48d752e3 100644 --- a/briar-android/src/org/briarproject/android/AppModule.java +++ b/briar-android/src/org/briarproject/android/AppModule.java @@ -1,9 +1,6 @@ package org.briarproject.android; import android.app.Application; -import android.content.Context; - -import javax.inject.Singleton; import dagger.Module; import dagger.Provides; @@ -18,7 +15,7 @@ public class AppModule { } @Provides - @Singleton + @ApplicationScope Application providesApplication() { return application; } diff --git a/briar-android/src/org/briarproject/android/ApplicationScope.java b/briar-android/src/org/briarproject/android/ApplicationScope.java new file mode 100644 index 000000000..ad1fb2a4a --- /dev/null +++ b/briar-android/src/org/briarproject/android/ApplicationScope.java @@ -0,0 +1,11 @@ +package org.briarproject.android; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.inject.Scope; + +@Scope +@Retention(RetentionPolicy.RUNTIME) +public @interface ApplicationScope { +} diff --git a/briar-android/src/org/briarproject/android/BriarApplication.java b/briar-android/src/org/briarproject/android/BriarApplication.java index ac670b9ef..6a01e57fb 100644 --- a/briar-android/src/org/briarproject/android/BriarApplication.java +++ b/briar-android/src/org/briarproject/android/BriarApplication.java @@ -6,6 +6,13 @@ import java.util.logging.Logger; import android.app.Application; import android.content.Context; +import org.briarproject.CoreComponent; +import org.briarproject.CoreEagerSingletons; +import org.briarproject.DaggerCoreComponent; +import org.briarproject.plugins.PluginsModuleExtension; +import org.briarproject.system.PlatformModuleExtension; +import org.briarproject.system.SystemModuleExtension; + public class BriarApplication extends Application { private static final Logger LOG = @@ -23,14 +30,21 @@ public class BriarApplication extends Application { CrashHandler newHandler = new CrashHandler(ctx, oldHandler); Thread.setDefaultUncaughtExceptionHandler(newHandler); + CoreComponent coreComponent = DaggerCoreComponent.builder() + .systemModule(new SystemModuleExtension(this)) + .platformModule(new PlatformModuleExtension(this)) + .pluginsModule(new PluginsModuleExtension(this)) + .build(); + applicationComponent = DaggerAndroidComponent.builder() .appModule(new AppModule(this)) - .androidModule(new AndroidModule()) + .coreComponent(coreComponent) .build(); - // We need to load the eager singletons directly after making the - // dependency graph - AndroidModule.injectEager(applicationComponent); + // We need to load the eager singletons directly after making the + // dependency graphs + CoreEagerSingletons.initEagerSingletons(coreComponent); + AndroidEagerSingletons.initEagerSingletons(applicationComponent); } public AndroidComponent getApplicationComponent() { diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java index 3d88616f3..2a2bd6522 100644 --- a/briar-android/src/org/briarproject/android/BriarService.java +++ b/briar-android/src/org/briarproject/android/BriarService.java @@ -12,7 +12,7 @@ import android.os.IBinder; import android.support.v4.app.NotificationCompat; import org.briarproject.R; -import org.briarproject.api.android.AndroidExecutor; +import org.briarproject.api.android.PlatformExecutor; import org.briarproject.api.db.DatabaseConfig; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.LifecycleManager.StartResult; @@ -48,7 +48,7 @@ public class BriarService extends Service { // Fields that are accessed from background threads must be volatile @Inject protected volatile LifecycleManager lifecycleManager; - @Inject protected volatile AndroidExecutor androidExecutor; + @Inject protected volatile PlatformExecutor platformExecutor; private volatile boolean started = false; @Override @@ -106,7 +106,7 @@ public class BriarService extends Service { } private void showStartupFailureNotification(final StartResult result) { - androidExecutor.execute(new Runnable() { + platformExecutor.execute(new Runnable() { public void run() { NotificationCompat.Builder b = new NotificationCompat.Builder(BriarService.this); diff --git a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java index 678725df8..9b6f5319f 100644 --- a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java +++ b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java @@ -4,14 +4,12 @@ import android.app.Application; import android.content.Context; -import org.briarproject.api.android.AndroidExecutor; +import org.briarproject.api.android.PlatformExecutor; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.plugins.BackoffFactory; import org.briarproject.api.plugins.duplex.DuplexPluginConfig; import org.briarproject.api.plugins.duplex.DuplexPluginFactory; -import org.briarproject.api.plugins.simplex.SimplexPluginConfig; -import org.briarproject.api.plugins.simplex.SimplexPluginFactory; import org.briarproject.api.system.LocationUtils; import org.briarproject.plugins.droidtooth.DroidtoothPluginFactory; import org.briarproject.plugins.tcp.AndroidLanTcpPluginFactory; @@ -20,32 +18,22 @@ import org.briarproject.plugins.tor.TorPluginFactory; import java.security.SecureRandom; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.concurrent.Executor; import dagger.Module; import dagger.Provides; @Module -public class AndroidPluginsModule extends PluginsModule { +public class AndroidPluginsModule { @Provides - SimplexPluginConfig getSimplexPluginConfig() { - return new SimplexPluginConfig() { - public Collection getFactories() { - return Collections.emptyList(); - } - }; - } - - @Provides - DuplexPluginConfig getDuplexPluginConfig(@IoExecutor Executor ioExecutor, - AndroidExecutor androidExecutor, Application app, + DuplexPluginConfig provideDuplexPluginConfig(@IoExecutor Executor ioExecutor, + PlatformExecutor platformExecutor, Application app, SecureRandom random, BackoffFactory backoffFactory, LocationUtils locationUtils, EventBus eventBus) { Context appContext = app.getApplicationContext(); DuplexPluginFactory bluetooth = new DroidtoothPluginFactory(ioExecutor, - androidExecutor, appContext, random, backoffFactory); + platformExecutor, appContext, random, backoffFactory); DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, appContext, locationUtils, eventBus); DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor, diff --git a/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java b/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java new file mode 100644 index 000000000..b2b408f8d --- /dev/null +++ b/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java @@ -0,0 +1,50 @@ +package org.briarproject.plugins; + +import android.app.Application; +import android.content.Context; + +import org.briarproject.api.android.PlatformExecutor; +import org.briarproject.api.event.EventBus; +import org.briarproject.api.lifecycle.IoExecutor; +import org.briarproject.api.plugins.BackoffFactory; +import org.briarproject.api.plugins.duplex.DuplexPluginConfig; +import org.briarproject.api.plugins.duplex.DuplexPluginFactory; +import org.briarproject.api.system.LocationUtils; +import org.briarproject.plugins.droidtooth.DroidtoothPluginFactory; +import org.briarproject.plugins.tcp.AndroidLanTcpPluginFactory; +import org.briarproject.plugins.tor.TorPluginFactory; + +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.Collection; +import java.util.concurrent.Executor; + +public class PluginsModuleExtension extends PluginsModule { + + private final Application app; + + public PluginsModuleExtension(Application app) { + this.app = app; + } + + @Override + public DuplexPluginConfig provideDuplexPluginConfig( + @IoExecutor Executor ioExecutor, PlatformExecutor platformExecutor, + SecureRandom random, BackoffFactory backoffFactory, + LocationUtils locationUtils, EventBus eventBus) { + Context appContext = app.getApplicationContext(); + DuplexPluginFactory bluetooth = new DroidtoothPluginFactory(ioExecutor, + platformExecutor, appContext, random, backoffFactory); + DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, appContext, + locationUtils, eventBus); + DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor, + backoffFactory, appContext); + final Collection factories = + Arrays.asList(bluetooth, tor, lan); + return new DuplexPluginConfig() { + public Collection getFactories() { + return factories; + } + }; + } +} diff --git a/briar-android/src/org/briarproject/android/AndroidExecutorImpl.java b/briar-android/src/org/briarproject/system/AndroidExecutorImpl.java similarity index 85% rename from briar-android/src/org/briarproject/android/AndroidExecutorImpl.java rename to briar-android/src/org/briarproject/system/AndroidExecutorImpl.java index e46e7193b..b119fb8c7 100644 --- a/briar-android/src/org/briarproject/android/AndroidExecutorImpl.java +++ b/briar-android/src/org/briarproject/system/AndroidExecutorImpl.java @@ -1,4 +1,4 @@ -package org.briarproject.android; +package org.briarproject.system; import android.app.Application; import android.content.Context; @@ -6,7 +6,7 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; -import org.briarproject.api.android.AndroidExecutor; +import org.briarproject.api.android.PlatformExecutor; import java.util.concurrent.Callable; import java.util.concurrent.Future; @@ -14,11 +14,10 @@ import java.util.concurrent.FutureTask; import javax.inject.Inject; -class AndroidExecutorImpl implements AndroidExecutor { +class AndroidExecutorImpl implements PlatformExecutor { private final Handler handler; - @Inject AndroidExecutorImpl(Application app) { Context ctx = app.getApplicationContext(); handler = new FutureTaskHandler(ctx.getMainLooper()); diff --git a/briar-android/src/org/briarproject/system/PlatformModuleExtension.java b/briar-android/src/org/briarproject/system/PlatformModuleExtension.java new file mode 100644 index 000000000..dc2ae6a4a --- /dev/null +++ b/briar-android/src/org/briarproject/system/PlatformModuleExtension.java @@ -0,0 +1,78 @@ +package org.briarproject.system; + +import android.app.Application; +import android.content.Context; + +import org.briarproject.PlatformModule; +import org.briarproject.android.ApplicationScope; +import org.briarproject.api.android.PlatformExecutor; +import org.briarproject.api.crypto.SecretKey; +import org.briarproject.api.db.DatabaseConfig; +import org.briarproject.api.ui.UiCallback; + +import java.io.File; + +public class PlatformModuleExtension extends PlatformModule { + + private final UiCallback uiCallback; + private final Application app; + + public PlatformModuleExtension(Application app) { + this.app = app; + // Use a dummy UI callback + uiCallback = new UiCallback() { + + public int showChoice(String[] options, String... message) { + throw new UnsupportedOperationException(); + } + + public boolean showConfirmationMessage(String... message) { + throw new UnsupportedOperationException(); + } + + public void showMessage(String... message) { + throw new UnsupportedOperationException(); + } + }; + } + + @Override + public UiCallback provideUICallback() { + return uiCallback; + } + + @Override + @ApplicationScope + public DatabaseConfig provideDatabaseConfig() { + final File dir = app.getApplicationContext().getDir("db", Context.MODE_PRIVATE); + return new DatabaseConfig() { + + private volatile SecretKey key = null; + + public boolean databaseExists() { + return dir.isDirectory() && dir.listFiles().length > 0; + } + + public File getDatabaseDirectory() { + return dir; + } + + public void setEncryptionKey(SecretKey key) { + this.key = key; + } + + public SecretKey getEncryptionKey() { + return key; + } + + public long getMaxSize() { + return Long.MAX_VALUE; + } + }; + } + + @Override + public PlatformExecutor providePlatformExecutor() { + return new AndroidExecutorImpl(app); + } +} diff --git a/briar-android/src/org/briarproject/system/SystemModuleExtension.java b/briar-android/src/org/briarproject/system/SystemModuleExtension.java new file mode 100644 index 000000000..72ea338b4 --- /dev/null +++ b/briar-android/src/org/briarproject/system/SystemModuleExtension.java @@ -0,0 +1,32 @@ +package org.briarproject.system; + + +import android.app.Application; + +import org.briarproject.api.system.Clock; +import org.briarproject.api.system.LocationUtils; +import org.briarproject.api.system.SeedProvider; +import org.briarproject.api.system.Timer; + +import dagger.Module; +import dagger.Provides; + +public class SystemModuleExtension extends SystemModule { + + private final Application app; + + public SystemModuleExtension(final Application app) { + this.app = app; + } + + @Override + public SeedProvider provideSeedProvider() { + return new AndroidSeedProvider(app); + } + + @Override + public LocationUtils provideLocationUtils() { + return new AndroidLocationUtils(app); + } + +} diff --git a/briar-api/src/org/briarproject/api/android/AndroidExecutor.java b/briar-api/src/org/briarproject/api/android/PlatformExecutor.java similarity index 92% rename from briar-api/src/org/briarproject/api/android/AndroidExecutor.java rename to briar-api/src/org/briarproject/api/android/PlatformExecutor.java index 635702d01..4cd309374 100644 --- a/briar-api/src/org/briarproject/api/android/AndroidExecutor.java +++ b/briar-api/src/org/briarproject/api/android/PlatformExecutor.java @@ -7,7 +7,7 @@ import java.util.concurrent.Future; * Enables background threads to make Android API calls that must be made from * a thread with a message queue. */ -public interface AndroidExecutor { +public interface PlatformExecutor { /** * Runs the given task on the main UI thread and returns a Future for diff --git a/briar-core/src/org/briarproject/CoreComponent.java b/briar-core/src/org/briarproject/CoreComponent.java new file mode 100644 index 000000000..9f7c41df0 --- /dev/null +++ b/briar-core/src/org/briarproject/CoreComponent.java @@ -0,0 +1,103 @@ +package org.briarproject; + +import org.briarproject.api.android.PlatformExecutor; +import org.briarproject.api.android.ReferenceManager; +import org.briarproject.api.contact.ContactManager; +import org.briarproject.api.crypto.CryptoComponent; +import org.briarproject.api.crypto.CryptoExecutor; +import org.briarproject.api.crypto.PasswordStrengthEstimator; +import org.briarproject.api.db.DatabaseConfig; +import org.briarproject.api.db.DatabaseExecutor; +import org.briarproject.api.event.EventBus; +import org.briarproject.api.forum.ForumManager; +import org.briarproject.api.forum.ForumPostFactory; +import org.briarproject.api.forum.ForumSharingManager; +import org.briarproject.api.identity.AuthorFactory; +import org.briarproject.api.identity.IdentityManager; +import org.briarproject.api.invitation.InvitationTaskFactory; +import org.briarproject.api.lifecycle.IoExecutor; +import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.messaging.MessagingManager; +import org.briarproject.api.messaging.PrivateMessageFactory; +import org.briarproject.api.plugins.ConnectionRegistry; +import org.briarproject.api.plugins.PluginManager; +import org.briarproject.api.properties.TransportPropertyManager; +import org.briarproject.api.settings.SettingsManager; +import org.briarproject.api.sync.ValidationManager; +import org.briarproject.api.transport.KeyManager; +import org.briarproject.clients.ClientsModule; +import org.briarproject.contact.ContactModule; +import org.briarproject.crypto.CryptoModule; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.event.EventModule; +import org.briarproject.forum.ForumModule; +import org.briarproject.identity.IdentityModule; +import org.briarproject.invitation.InvitationModule; +import org.briarproject.lifecycle.LifecycleModule; +import org.briarproject.messaging.MessagingModule; +import org.briarproject.messaging.PrivateMessageValidator; +import org.briarproject.plugins.PluginsModule; +import org.briarproject.properties.PropertiesModule; +import org.briarproject.properties.TransportPropertyValidator; +import org.briarproject.reliability.ReliabilityModule; +import org.briarproject.settings.SettingsModule; +import org.briarproject.sync.SyncModule; +import org.briarproject.system.SystemModule; +import org.briarproject.transport.TransportModule; + +import java.util.concurrent.Executor; + +import javax.inject.Singleton; + +import dagger.Component; + +@Singleton +@Component(modules = {DatabaseModule.class, + CryptoModule.class, LifecycleModule.class, PlatformModule.class, + ReliabilityModule.class, MessagingModule.class, + InvitationModule.class, ForumModule.class, IdentityModule.class, + EventModule.class, DataModule.class, ContactModule.class, + PropertiesModule.class, TransportModule.class, SyncModule.class, + SettingsModule.class, ClientsModule.class, SystemModule.class, + PluginsModule.class}) +public interface CoreComponent { + @IoExecutor + Executor ioExecutor(); + ContactManager contactManager(); + @CryptoExecutor Executor cryptoExecutor(); + DatabaseConfig databaseConfig(); + PasswordStrengthEstimator passwordStrengthEstimator(); + CryptoComponent cryptoComponent(); + @DatabaseExecutor Executor dbExecutor(); + LifecycleManager lifecycleManager(); + AuthorFactory authFactory(); + EventBus eventBus(); + KeyManager keyManager(); + ValidationManager validationManager(); + ForumManager forumManager(); + IdentityManager identityManager(); + PluginManager pluginManager(); + SettingsManager settingsManater(); + InvitationTaskFactory invitationTaskFactory(); + MessagingManager messagingManager(); + TransportPropertyManager transportPropertyManager(); + ConnectionRegistry connectionRegistry(); + ForumSharingManager forumSharingManager(); + PrivateMessageFactory privateMessageFactory(); + ForumPostFactory forumPostFactory(); + PrivateMessageValidator privateMessageValidator(); + TransportPropertyValidator transportPropertyValidator(); + PlatformExecutor platformExecutor(); + // Eager singletons + void inject(ContactModule.EagerSingletons init); + void inject(CryptoModule.EagerSingletons init); + void inject(DatabaseModule.EagerSingletons init); + void inject(ForumModule.EagerSingletons init); + void inject(LifecycleModule.EagerSingletons init); + void inject(MessagingModule.EagerSingletons init); + void inject(PluginsModule.EagerSingletons init); + void inject(PropertiesModule.EagerSingletons init); + void inject(SyncModule.EagerSingletons init); + void inject(TransportModule.EagerSingletons init); +} diff --git a/briar-core/src/org/briarproject/CoreEagerSingletons.java b/briar-core/src/org/briarproject/CoreEagerSingletons.java new file mode 100644 index 000000000..8637f7106 --- /dev/null +++ b/briar-core/src/org/briarproject/CoreEagerSingletons.java @@ -0,0 +1,28 @@ +package org.briarproject; + +import org.briarproject.contact.ContactModule; +import org.briarproject.crypto.CryptoModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.forum.ForumModule; +import org.briarproject.lifecycle.LifecycleModule; +import org.briarproject.messaging.MessagingModule; +import org.briarproject.plugins.PluginsModule; +import org.briarproject.properties.PropertiesModule; +import org.briarproject.sync.SyncModule; +import org.briarproject.transport.TransportModule; + +public class CoreEagerSingletons { + + public static void initEagerSingletons(CoreComponent c) { + c.inject(new ContactModule.EagerSingletons()); + c.inject(new CryptoModule.EagerSingletons()); + c.inject(new DatabaseModule.EagerSingletons()); + c.inject(new ForumModule.EagerSingletons()); + c.inject(new LifecycleModule.EagerSingletons()); + c.inject(new MessagingModule.EagerSingletons()); + c.inject(new PluginsModule.EagerSingletons()); + c.inject(new PropertiesModule.EagerSingletons()); + c.inject(new SyncModule.EagerSingletons()); + c.inject(new TransportModule.EagerSingletons()); + } +} diff --git a/briar-core/src/org/briarproject/PlatformModule.java b/briar-core/src/org/briarproject/PlatformModule.java new file mode 100644 index 000000000..c4242048a --- /dev/null +++ b/briar-core/src/org/briarproject/PlatformModule.java @@ -0,0 +1,36 @@ +package org.briarproject; + +import org.briarproject.api.android.PlatformExecutor; +import org.briarproject.api.db.DatabaseConfig; +import org.briarproject.api.ui.UiCallback; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +/** + * This class contains methods that MUST(!) be overridden in platform specific + * modules that use the core. + */ +@Module +public class PlatformModule { + + @Provides + @Singleton + public DatabaseConfig provideDatabaseConfig() { + return null; + } + + @Provides + public UiCallback provideUICallback() { + return null; + } + + + @Provides + public PlatformExecutor providePlatformExecutor() { + return null; + } + +} diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java index e4927a74f..bd8e2d3af 100644 --- a/briar-core/src/org/briarproject/contact/ContactModule.java +++ b/briar-core/src/org/briarproject/contact/ContactModule.java @@ -3,9 +3,8 @@ package org.briarproject.contact; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.lifecycle.LifecycleManager; -import org.briarproject.identity.IdentityModule; -import org.briarproject.lifecycle.LifecycleModule; +import javax.inject.Inject; import javax.inject.Singleton; import dagger.Module; @@ -14,6 +13,10 @@ import dagger.Provides; @Module public class ContactModule { + public static class EagerSingletons { + @Inject ContactManager contactManager; + } + @Provides @Singleton ContactManager getContactManager(LifecycleManager lifecycleManager, diff --git a/briar-core/src/org/briarproject/crypto/CryptoModule.java b/briar-core/src/org/briarproject/crypto/CryptoModule.java index c8b1d4845..aa9744483 100644 --- a/briar-core/src/org/briarproject/crypto/CryptoModule.java +++ b/briar-core/src/org/briarproject/crypto/CryptoModule.java @@ -7,7 +7,6 @@ import org.briarproject.api.crypto.StreamDecrypterFactory; import org.briarproject.api.crypto.StreamEncrypterFactory; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.system.SeedProvider; -import org.briarproject.lifecycle.LifecycleModule; import java.security.SecureRandom; import java.util.concurrent.BlockingQueue; @@ -17,6 +16,7 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; +import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; @@ -28,6 +28,11 @@ import static java.util.concurrent.TimeUnit.SECONDS; @Module public class CryptoModule { + public static class EagerSingletons { + @Inject + @CryptoExecutor Executor cryptoExecutor; + } + /** * The maximum number of executor threads. */ diff --git a/briar-core/src/org/briarproject/db/DatabaseModule.java b/briar-core/src/org/briarproject/db/DatabaseModule.java index c177c9ae4..7f590ddd5 100644 --- a/briar-core/src/org/briarproject/db/DatabaseModule.java +++ b/briar-core/src/org/briarproject/db/DatabaseModule.java @@ -7,9 +7,6 @@ import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.ShutdownManager; import org.briarproject.api.system.Clock; -import org.briarproject.data.DataModule; -import org.briarproject.event.EventModule; -import org.briarproject.lifecycle.LifecycleModule; import java.security.SecureRandom; import java.sql.Connection; @@ -21,7 +18,6 @@ import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import javax.inject.Inject; -import javax.inject.Named; import javax.inject.Singleton; import dagger.Module; @@ -32,6 +28,11 @@ import static java.util.concurrent.TimeUnit.SECONDS; @Module public class DatabaseModule { + public static class EagerSingletons { + @Inject + @DatabaseExecutor ExecutorService executorService; + } + private final ExecutorService databaseExecutor; public DatabaseModule() { diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java index cbe2c7f19..8442edeb7 100644 --- a/briar-core/src/org/briarproject/forum/ForumModule.java +++ b/briar-core/src/org/briarproject/forum/ForumModule.java @@ -4,25 +4,17 @@ import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.data.BdfReaderFactory; -import org.briarproject.api.data.BdfWriterFactory; import org.briarproject.api.data.MetadataEncoder; import org.briarproject.api.data.MetadataParser; -import org.briarproject.api.data.ObjectReader; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.forum.ForumManager; import org.briarproject.api.forum.ForumPostFactory; import org.briarproject.api.forum.ForumSharingManager; -import org.briarproject.api.identity.Author; import org.briarproject.api.identity.AuthorFactory; -import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; -import org.briarproject.contact.ContactModule; -import org.briarproject.crypto.CryptoModule; -import org.briarproject.data.DataModule; -import org.briarproject.db.DatabaseModule; -import org.briarproject.sync.SyncModule; +import javax.inject.Inject; import javax.inject.Singleton; import dagger.Module; @@ -31,6 +23,15 @@ import dagger.Provides; @Module public class ForumModule { + public static class EagerSingletons { + @Inject + ForumListValidator forumListValidator; + @Inject + ForumPostValidator forumPostValidator; + @Inject + ForumSharingManager forumSharingManager; + } + @Provides @Singleton ForumManager provideForumManager(DatabaseComponent db, diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java index c6218f273..7b98244eb 100644 --- a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java +++ b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java @@ -9,6 +9,7 @@ import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; +import javax.inject.Inject; import javax.inject.Singleton; import org.briarproject.api.db.DatabaseComponent; @@ -17,7 +18,6 @@ import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.ShutdownManager; import org.briarproject.api.system.Clock; -import org.briarproject.event.EventModule; import dagger.Module; import dagger.Provides; @@ -25,6 +25,11 @@ import dagger.Provides; @Module public class LifecycleModule { + public static class EagerSingletons { + @Inject + @IoExecutor Executor executor; + } + private final ExecutorService ioExecutor; public LifecycleModule() { diff --git a/briar-core/src/org/briarproject/messaging/MessagingModule.java b/briar-core/src/org/briarproject/messaging/MessagingModule.java index 6f0921d82..b943a6921 100644 --- a/briar-core/src/org/briarproject/messaging/MessagingModule.java +++ b/briar-core/src/org/briarproject/messaging/MessagingModule.java @@ -2,18 +2,13 @@ package org.briarproject.messaging; import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.ContactManager; -import org.briarproject.api.data.BdfReaderFactory; -import org.briarproject.api.data.BdfWriterFactory; import org.briarproject.api.data.MetadataEncoder; import org.briarproject.api.messaging.MessagingManager; import org.briarproject.api.messaging.PrivateMessageFactory; -import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; -import org.briarproject.contact.ContactModule; -import org.briarproject.data.DataModule; -import org.briarproject.sync.SyncModule; +import javax.inject.Inject; import javax.inject.Singleton; import dagger.Module; @@ -24,13 +19,17 @@ import static org.briarproject.messaging.MessagingManagerImpl.CLIENT_ID; @Module public class MessagingModule { + public static class EagerSingletons { + @Inject MessagingManager messagingManager; + @Inject PrivateMessageValidator privateMessageValidator; + } + @Provides PrivateMessageFactory providePrivateMessageFactory( ClientHelper clientHelper) { return new PrivateMessageFactoryImpl(clientHelper); } - @Provides @Singleton PrivateMessageValidator getValidator(ValidationManager validationManager, diff --git a/briar-core/src/org/briarproject/plugins/PluginsModule.java b/briar-core/src/org/briarproject/plugins/PluginsModule.java index 6b750c214..0d523c348 100644 --- a/briar-core/src/org/briarproject/plugins/PluginsModule.java +++ b/briar-core/src/org/briarproject/plugins/PluginsModule.java @@ -1,7 +1,9 @@ package org.briarproject.plugins; +import javax.inject.Inject; import javax.inject.Singleton; +import org.briarproject.api.android.PlatformExecutor; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.LifecycleManager; @@ -9,13 +11,19 @@ import org.briarproject.api.plugins.BackoffFactory; import org.briarproject.api.plugins.ConnectionManager; import org.briarproject.api.plugins.ConnectionRegistry; import org.briarproject.api.plugins.PluginManager; +import org.briarproject.api.plugins.duplex.DuplexPluginConfig; +import org.briarproject.api.plugins.simplex.SimplexPluginConfig; +import org.briarproject.api.plugins.simplex.SimplexPluginFactory; import org.briarproject.api.sync.SyncSessionFactory; +import org.briarproject.api.system.LocationUtils; import org.briarproject.api.system.Timer; import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; import java.security.SecureRandom; +import java.util.Collection; +import java.util.Collections; import java.util.concurrent.Executor; import dagger.Module; @@ -25,6 +33,11 @@ import dagger.Provides; @Module public class PluginsModule { + public static class EagerSingletons { + @Inject + PluginManager pluginManager; + } + @Provides BackoffFactory provideBackoffFactory() { return new BackoffFactoryImpl(); @@ -62,4 +75,21 @@ public class PluginsModule { lifecycleManager.register(pluginManager); return pluginManager; } + + @Provides + SimplexPluginConfig provideSimplexPluginConfig() { + return new SimplexPluginConfig() { + public Collection getFactories() { + return Collections.emptyList(); + } + }; + } + + @Provides + public DuplexPluginConfig provideDuplexPluginConfig(@IoExecutor Executor ioExecutor, + PlatformExecutor platformExecutor, /*Application app,*/ + SecureRandom random, BackoffFactory backoffFactory, + LocationUtils locationUtils, EventBus eventBus) { + return null; + } } diff --git a/briar-core/src/org/briarproject/properties/PropertiesModule.java b/briar-core/src/org/briarproject/properties/PropertiesModule.java index e008146d2..e9f2fcf58 100644 --- a/briar-core/src/org/briarproject/properties/PropertiesModule.java +++ b/briar-core/src/org/briarproject/properties/PropertiesModule.java @@ -2,15 +2,12 @@ package org.briarproject.properties; import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.ContactManager; -import org.briarproject.api.data.BdfReaderFactory; import org.briarproject.api.data.MetadataEncoder; import org.briarproject.api.properties.TransportPropertyManager; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; -import org.briarproject.contact.ContactModule; -import org.briarproject.data.DataModule; -import org.briarproject.sync.SyncModule; +import javax.inject.Inject; import javax.inject.Singleton; import dagger.Module; @@ -21,6 +18,11 @@ import static org.briarproject.properties.TransportPropertyManagerImpl.CLIENT_ID @Module public class PropertiesModule { + public static class EagerSingletons { + @Inject TransportPropertyValidator transportPropertyValidator; + @Inject TransportPropertyManager transportPropertyManager; + } + @Provides @Singleton TransportPropertyValidator getValidator(ValidationManager validationManager, diff --git a/briar-core/src/org/briarproject/sync/SyncModule.java b/briar-core/src/org/briarproject/sync/SyncModule.java index 6c286f8af..15d13ce66 100644 --- a/briar-core/src/org/briarproject/sync/SyncModule.java +++ b/briar-core/src/org/briarproject/sync/SyncModule.java @@ -1,13 +1,9 @@ package org.briarproject.sync; import org.briarproject.api.crypto.CryptoComponent; -import org.briarproject.api.data.BdfWriterFactory; -import org.briarproject.api.data.ObjectReader; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.event.EventBus; -import org.briarproject.api.identity.Author; -import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.sync.GroupFactory; import org.briarproject.api.sync.MessageFactory; @@ -16,10 +12,6 @@ import org.briarproject.api.sync.PacketWriterFactory; import org.briarproject.api.sync.SyncSessionFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; -import org.briarproject.crypto.CryptoModule; -import org.briarproject.db.DatabaseModule; -import org.briarproject.event.EventModule; -import org.briarproject.lifecycle.LifecycleModule; import java.util.concurrent.Executor; @@ -32,6 +24,10 @@ import dagger.Provides; @Module public class SyncModule { + public static class EagerSingletons { + @Inject ValidationManager validationManager; + } + @Provides GroupFactory provideGroupFactory(CryptoComponent crypto) { return new GroupFactoryImpl(crypto); diff --git a/briar-android/src/org/briarproject/system/AndroidSystemModule.java b/briar-core/src/org/briarproject/system/SystemModule.java similarity index 61% rename from briar-android/src/org/briarproject/system/AndroidSystemModule.java rename to briar-core/src/org/briarproject/system/SystemModule.java index 2cd79468c..8a2304e2e 100644 --- a/briar-android/src/org/briarproject/system/AndroidSystemModule.java +++ b/briar-core/src/org/briarproject/system/SystemModule.java @@ -1,8 +1,5 @@ package org.briarproject.system; - -import android.app.Application; - import org.briarproject.api.system.Clock; import org.briarproject.api.system.LocationUtils; import org.briarproject.api.system.SeedProvider; @@ -12,8 +9,7 @@ import dagger.Module; import dagger.Provides; @Module -public class AndroidSystemModule { - +public class SystemModule { @Provides Clock provideClock() { return new SystemClock(); @@ -25,13 +21,12 @@ public class AndroidSystemModule { } @Provides - SeedProvider provideSeedProvider(final Application app) { - return new AndroidSeedProvider(app); + public SeedProvider provideSeedProvider() { + return null; } @Provides - LocationUtils provideLocationUtils(final Application app) { - return new AndroidLocationUtils(app); + public LocationUtils provideLocationUtils() { + return null; } - } diff --git a/briar-core/src/org/briarproject/transport/TransportModule.java b/briar-core/src/org/briarproject/transport/TransportModule.java index 5a4ae8936..d5819fbfc 100644 --- a/briar-core/src/org/briarproject/transport/TransportModule.java +++ b/briar-core/src/org/briarproject/transport/TransportModule.java @@ -7,9 +7,8 @@ import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; -import org.briarproject.event.EventModule; -import org.briarproject.lifecycle.LifecycleModule; +import javax.inject.Inject; import javax.inject.Singleton; import dagger.Module; @@ -18,6 +17,10 @@ import dagger.Provides; @Module public class TransportModule { + public static class EagerSingletons { + @Inject KeyManager keyManager; + } + @Provides StreamReaderFactory provideStreamReaderFactory( StreamDecrypterFactory streamDecrypterFactory) { From 7670bc48ea31999f99ed23f043aa72685a67231a Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Thu, 10 Mar 2016 22:46:30 +0100 Subject: [PATCH 09/13] Removed unecessary module --- .../plugins/AndroidPluginsModule.java | 49 ------------------- 1 file changed, 49 deletions(-) delete mode 100644 briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java diff --git a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java deleted file mode 100644 index 9b6f5319f..000000000 --- a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.briarproject.plugins; - -import android.app.Application; -import android.content.Context; - - -import org.briarproject.api.android.PlatformExecutor; -import org.briarproject.api.event.EventBus; -import org.briarproject.api.lifecycle.IoExecutor; -import org.briarproject.api.plugins.BackoffFactory; -import org.briarproject.api.plugins.duplex.DuplexPluginConfig; -import org.briarproject.api.plugins.duplex.DuplexPluginFactory; -import org.briarproject.api.system.LocationUtils; -import org.briarproject.plugins.droidtooth.DroidtoothPluginFactory; -import org.briarproject.plugins.tcp.AndroidLanTcpPluginFactory; -import org.briarproject.plugins.tor.TorPluginFactory; - -import java.security.SecureRandom; -import java.util.Arrays; -import java.util.Collection; -import java.util.concurrent.Executor; - -import dagger.Module; -import dagger.Provides; - -@Module -public class AndroidPluginsModule { - - @Provides - DuplexPluginConfig provideDuplexPluginConfig(@IoExecutor Executor ioExecutor, - PlatformExecutor platformExecutor, Application app, - SecureRandom random, BackoffFactory backoffFactory, - LocationUtils locationUtils, EventBus eventBus) { - Context appContext = app.getApplicationContext(); - DuplexPluginFactory bluetooth = new DroidtoothPluginFactory(ioExecutor, - platformExecutor, appContext, random, backoffFactory); - DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, appContext, - locationUtils, eventBus); - DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor, - backoffFactory, appContext); - final Collection factories = - Arrays.asList(bluetooth, tor, lan); - return new DuplexPluginConfig() { - public Collection getFactories() { - return factories; - } - }; - } -} From 4da63b38007d27f666748748ce904d319a874d46 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Sun, 13 Mar 2016 22:31:14 +0100 Subject: [PATCH 10/13] Modified the project structure, removed module extension and went instead for a non-complete core dependency graph --- briar-android/build.gradle | 3 + .../android/AndroidComponent.java | 37 ++++++- .../briarproject/android/AndroidModule.java | 72 +++++++++++- .../AndroidNotificationManagerImpl.java | 24 ++-- .../org/briarproject/android/AppModule.java | 4 +- .../android/ApplicationScope.java | 11 -- .../android/BriarApplication.java | 17 +-- .../briarproject/android/BriarService.java | 6 +- .../android/NavDrawerActivity.java | 3 +- .../android/ReferenceManagerImpl.java | 2 +- .../briarproject/android/SetupActivity.java | 2 +- .../android/SplashScreenActivity.java | 3 +- .../android/api/AndroidExecutor.java | 4 +- .../api}/AndroidNotificationManager.java | 2 +- .../android/api}/ReferenceManager.java | 2 +- .../android/contact/ConversationActivity.java | 3 +- .../android/forum/ForumActivity.java | 2 +- .../invitation/AddContactActivity.java | 2 +- .../android/panic/PanicResponderActivity.java | 5 +- .../plugins/AndroidPluginsModule.java | 61 +++++++++++ .../plugins/PluginsModuleExtension.java | 59 ++++------ .../plugins/droidtooth/DroidtoothPlugin.java | 2 +- .../droidtooth/DroidtoothPluginFactory.java | 2 +- .../system/AndroidExecutorImpl.java | 6 +- .../system/AndroidSystemModule.java | 29 +++++ .../system/PlatformModuleExtension.java | 78 ------------- .../system/SystemModuleExtension.java | 32 ------ .../src/org/briarproject/CoreComponent.java | 103 ------------------ .../org/briarproject/CoreEagerSingletons.java | 24 ++-- .../src/org/briarproject/CoreModule.java | 45 ++++++++ .../src/org/briarproject/PlatformModule.java | 36 ------ .../briarproject/plugins/PluginsModule.java | 22 +--- .../org/briarproject/system/SystemModule.java | 9 -- 33 files changed, 314 insertions(+), 398 deletions(-) delete mode 100644 briar-android/src/org/briarproject/android/ApplicationScope.java rename briar-api/src/org/briarproject/api/android/PlatformExecutor.java => briar-android/src/org/briarproject/android/api/AndroidExecutor.java (85%) rename {briar-api/src/org/briarproject/api/android => briar-android/src/org/briarproject/android/api}/AndroidNotificationManager.java (91%) rename {briar-api/src/org/briarproject/api/android => briar-android/src/org/briarproject/android/api}/ReferenceManager.java (95%) create mode 100644 briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java create mode 100644 briar-android/src/org/briarproject/system/AndroidSystemModule.java delete mode 100644 briar-android/src/org/briarproject/system/PlatformModuleExtension.java delete mode 100644 briar-android/src/org/briarproject/system/SystemModuleExtension.java delete mode 100644 briar-core/src/org/briarproject/CoreComponent.java create mode 100644 briar-core/src/org/briarproject/CoreModule.java delete mode 100644 briar-core/src/org/briarproject/PlatformModule.java diff --git a/briar-android/build.gradle b/briar-android/build.gradle index 81228e918..ac9355117 100644 --- a/briar-android/build.gradle +++ b/briar-android/build.gradle @@ -97,4 +97,7 @@ android { lintOptions { abortOnError false } +} +dependencies { + compile 'cglib:cglib-nodep:3.1' } \ No newline at end of file diff --git a/briar-android/src/org/briarproject/android/AndroidComponent.java b/briar-android/src/org/briarproject/android/AndroidComponent.java index 27f156e91..e182b9a47 100644 --- a/briar-android/src/org/briarproject/android/AndroidComponent.java +++ b/briar-android/src/org/briarproject/android/AndroidComponent.java @@ -1,6 +1,7 @@ package org.briarproject.android; -import org.briarproject.CoreComponent; +import org.briarproject.CoreEagerSingletons; +import org.briarproject.CoreModule; import org.briarproject.android.contact.ContactListFragment; import org.briarproject.android.contact.ConversationActivity; import org.briarproject.android.forum.AvailableForumsActivity; @@ -15,33 +16,59 @@ import org.briarproject.android.identity.CreateIdentityActivity; import org.briarproject.android.invitation.AddContactActivity; import org.briarproject.android.panic.PanicPreferencesActivity; import org.briarproject.android.panic.PanicResponderActivity; +import org.briarproject.plugins.AndroidPluginsModule; +import org.briarproject.system.AndroidSystemModule; + +import javax.inject.Singleton; import dagger.Component; -@ApplicationScope + +@Singleton @Component( - dependencies = {CoreComponent.class}, - modules = {AppModule.class, AndroidModule.class}) -public interface AndroidComponent { + modules = {CoreModule.class, AppModule.class, AndroidModule.class, + AndroidPluginsModule.class, AndroidSystemModule.class}) +public interface AndroidComponent extends CoreEagerSingletons { + void inject(SplashScreenActivity activity); + void inject(SetupActivity activity); + void inject(NavDrawerActivity activity); + void inject(PasswordActivity activity); + void inject(BriarService activity); + void inject(PanicResponderActivity activity); + void inject(PanicPreferencesActivity activity); + void inject(AddContactActivity activity); + void inject(ConversationActivity activity); + void inject(CreateIdentityActivity activity); + void inject(TestingActivity activity); + void inject(AvailableForumsActivity activity); + void inject(WriteForumPostActivity activity); + void inject(CreateForumActivity activity); + void inject(ShareForumActivity activity); + void inject(ReadForumPostActivity activity); + void inject(ForumActivity activity); + void inject(ContactListFragment fragment); + void inject(SettingsFragment fragment); + void inject(ForumListFragment fragment); + // Eager singleton load void inject(AndroidModule.EagerSingletons init); diff --git a/briar-android/src/org/briarproject/android/AndroidModule.java b/briar-android/src/org/briarproject/android/AndroidModule.java index 53ea73f15..d3a7d8a4d 100644 --- a/briar-android/src/org/briarproject/android/AndroidModule.java +++ b/briar-android/src/org/briarproject/android/AndroidModule.java @@ -1,11 +1,20 @@ package org.briarproject.android; -import org.briarproject.api.android.AndroidNotificationManager; -import org.briarproject.api.android.ReferenceManager; +import android.app.Application; +import android.content.Context; + +import org.briarproject.android.api.AndroidNotificationManager; +import org.briarproject.android.api.ReferenceManager; +import org.briarproject.api.crypto.SecretKey; +import org.briarproject.api.db.DatabaseConfig; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.ui.UiCallback; + +import java.io.File; import javax.inject.Inject; +import javax.inject.Singleton; import dagger.Module; import dagger.Provides; @@ -18,14 +27,69 @@ public class AndroidModule { AndroidNotificationManager androidNotificationManager; } + private final UiCallback uiCallback; + + public AndroidModule() { + // Use a dummy UI callback + uiCallback = new UiCallback() { + + public int showChoice(String[] options, String... message) { + throw new UnsupportedOperationException(); + } + + public boolean showConfirmationMessage(String... message) { + throw new UnsupportedOperationException(); + } + + public void showMessage(String... message) { + throw new UnsupportedOperationException(); + } + }; + } + @Provides - @ApplicationScope + public UiCallback provideUICallback() { + return uiCallback; + } + + @Provides + @Singleton + public DatabaseConfig provideDatabaseConfig(Application app) { + final File dir = app.getApplicationContext().getDir("db", Context.MODE_PRIVATE); + return new DatabaseConfig() { + + private volatile SecretKey key = null; + + public boolean databaseExists() { + return dir.isDirectory() && dir.listFiles().length > 0; + } + + public File getDatabaseDirectory() { + return dir; + } + + public void setEncryptionKey(SecretKey key) { + this.key = key; + } + + public SecretKey getEncryptionKey() { + return key; + } + + public long getMaxSize() { + return Long.MAX_VALUE; + } + }; + } + + @Provides + @Singleton ReferenceManager provideReferenceManager() { return new ReferenceManagerImpl(); } @Provides - @ApplicationScope + @Singleton AndroidNotificationManager provideAndroidNotificationManager( LifecycleManager lifecycleManager, EventBus eventBus, AndroidNotificationManagerImpl notificationManager) { diff --git a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java index 64ae4e90e..172c998d1 100644 --- a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java +++ b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java @@ -12,8 +12,8 @@ import android.support.v4.app.TaskStackBuilder; import org.briarproject.R; import org.briarproject.android.contact.ConversationActivity; import org.briarproject.android.forum.ForumActivity; -import org.briarproject.api.android.PlatformExecutor; -import org.briarproject.api.android.AndroidNotificationManager; +import org.briarproject.android.api.AndroidExecutor; +import org.briarproject.android.api.AndroidNotificationManager; import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.db.DbException; import org.briarproject.api.event.Event; @@ -65,7 +65,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, private final SettingsManager settingsManager; private final MessagingManager messagingManager; private final ForumManager forumManager; - private final PlatformExecutor platformExecutor; + private final AndroidExecutor androidExecutor; private final Context appContext; // The following must only be accessed on the main UI thread @@ -82,13 +82,13 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, @Inject public AndroidNotificationManagerImpl(@DatabaseExecutor Executor dbExecutor, SettingsManager settingsManager, MessagingManager messagingManager, - ForumManager forumManager, PlatformExecutor platformExecutor, + ForumManager forumManager, AndroidExecutor androidExecutor, Application app) { this.dbExecutor = dbExecutor; this.settingsManager = settingsManager; this.messagingManager = messagingManager; this.forumManager = forumManager; - this.platformExecutor = platformExecutor; + this.androidExecutor = androidExecutor; appContext = app.getApplicationContext(); } @@ -118,7 +118,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } private void clearNotifications() { - platformExecutor.execute(new Runnable() { + androidExecutor.execute(new Runnable() { public void run() { clearPrivateMessageNotification(); clearForumPostNotification(); @@ -155,7 +155,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void showPrivateMessageNotification(final GroupId g) { - platformExecutor.execute(new Runnable() { + androidExecutor.execute(new Runnable() { public void run() { Integer count = contactCounts.get(g); if (count == null) contactCounts.put(g, 1); @@ -168,7 +168,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void clearPrivateMessageNotification(final GroupId g) { - platformExecutor.execute(new Runnable() { + androidExecutor.execute(new Runnable() { public void run() { Integer count = contactCounts.remove(g); if (count == null) return; // Already cleared @@ -239,7 +239,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void showForumPostNotification(final GroupId g) { - platformExecutor.execute(new Runnable() { + androidExecutor.execute(new Runnable() { public void run() { Integer count = forumCounts.get(g); if (count == null) forumCounts.put(g, 1); @@ -252,7 +252,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void clearForumPostNotification(final GroupId g) { - platformExecutor.execute(new Runnable() { + androidExecutor.execute(new Runnable() { public void run() { Integer count = forumCounts.remove(g); if (count == null) return; // Already cleared @@ -311,7 +311,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void blockNotification(final GroupId g) { - platformExecutor.execute(new Runnable() { + androidExecutor.execute(new Runnable() { public void run() { visibleGroup = g; } @@ -319,7 +319,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } public void unblockNotification(final GroupId g) { - platformExecutor.execute(new Runnable() { + androidExecutor.execute(new Runnable() { public void run() { if (g.equals(visibleGroup)) visibleGroup = null; } diff --git a/briar-android/src/org/briarproject/android/AppModule.java b/briar-android/src/org/briarproject/android/AppModule.java index b48d752e3..53631803d 100644 --- a/briar-android/src/org/briarproject/android/AppModule.java +++ b/briar-android/src/org/briarproject/android/AppModule.java @@ -2,6 +2,8 @@ package org.briarproject.android; import android.app.Application; +import javax.inject.Singleton; + import dagger.Module; import dagger.Provides; @@ -15,7 +17,7 @@ public class AppModule { } @Provides - @ApplicationScope + @Singleton Application providesApplication() { return application; } diff --git a/briar-android/src/org/briarproject/android/ApplicationScope.java b/briar-android/src/org/briarproject/android/ApplicationScope.java deleted file mode 100644 index ad1fb2a4a..000000000 --- a/briar-android/src/org/briarproject/android/ApplicationScope.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.briarproject.android; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -import javax.inject.Scope; - -@Scope -@Retention(RetentionPolicy.RUNTIME) -public @interface ApplicationScope { -} diff --git a/briar-android/src/org/briarproject/android/BriarApplication.java b/briar-android/src/org/briarproject/android/BriarApplication.java index 6a01e57fb..a4a34720d 100644 --- a/briar-android/src/org/briarproject/android/BriarApplication.java +++ b/briar-android/src/org/briarproject/android/BriarApplication.java @@ -6,12 +6,7 @@ import java.util.logging.Logger; import android.app.Application; import android.content.Context; -import org.briarproject.CoreComponent; -import org.briarproject.CoreEagerSingletons; -import org.briarproject.DaggerCoreComponent; -import org.briarproject.plugins.PluginsModuleExtension; -import org.briarproject.system.PlatformModuleExtension; -import org.briarproject.system.SystemModuleExtension; +import org.briarproject.CoreModule; public class BriarApplication extends Application { @@ -30,20 +25,14 @@ public class BriarApplication extends Application { CrashHandler newHandler = new CrashHandler(ctx, oldHandler); Thread.setDefaultUncaughtExceptionHandler(newHandler); - CoreComponent coreComponent = DaggerCoreComponent.builder() - .systemModule(new SystemModuleExtension(this)) - .platformModule(new PlatformModuleExtension(this)) - .pluginsModule(new PluginsModuleExtension(this)) - .build(); - applicationComponent = DaggerAndroidComponent.builder() .appModule(new AppModule(this)) - .coreComponent(coreComponent) + .androidModule(new AndroidModule()) .build(); // We need to load the eager singletons directly after making the // dependency graphs - CoreEagerSingletons.initEagerSingletons(coreComponent); + CoreModule.initEagerSingletons(applicationComponent); AndroidEagerSingletons.initEagerSingletons(applicationComponent); } diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java index 2a2bd6522..06a09cce1 100644 --- a/briar-android/src/org/briarproject/android/BriarService.java +++ b/briar-android/src/org/briarproject/android/BriarService.java @@ -12,7 +12,7 @@ import android.os.IBinder; import android.support.v4.app.NotificationCompat; import org.briarproject.R; -import org.briarproject.api.android.PlatformExecutor; +import org.briarproject.android.api.AndroidExecutor; import org.briarproject.api.db.DatabaseConfig; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.LifecycleManager.StartResult; @@ -48,7 +48,7 @@ public class BriarService extends Service { // Fields that are accessed from background threads must be volatile @Inject protected volatile LifecycleManager lifecycleManager; - @Inject protected volatile PlatformExecutor platformExecutor; + @Inject protected volatile AndroidExecutor androidExecutor; private volatile boolean started = false; @Override @@ -106,7 +106,7 @@ public class BriarService extends Service { } private void showStartupFailureNotification(final StartResult result) { - platformExecutor.execute(new Runnable() { + androidExecutor.execute(new Runnable() { public void run() { NotificationCompat.Builder b = new NotificationCompat.Builder(BriarService.this); diff --git a/briar-android/src/org/briarproject/android/NavDrawerActivity.java b/briar-android/src/org/briarproject/android/NavDrawerActivity.java index 8342c5837..d3d45e61e 100644 --- a/briar-android/src/org/briarproject/android/NavDrawerActivity.java +++ b/briar-android/src/org/briarproject/android/NavDrawerActivity.java @@ -8,7 +8,6 @@ import android.os.Bundle; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; @@ -25,7 +24,7 @@ import org.briarproject.android.forum.ForumListFragment; import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.util.CustomAnimations; import org.briarproject.api.TransportId; -import org.briarproject.api.android.ReferenceManager; +import org.briarproject.android.api.ReferenceManager; import org.briarproject.api.db.DbException; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; diff --git a/briar-android/src/org/briarproject/android/ReferenceManagerImpl.java b/briar-android/src/org/briarproject/android/ReferenceManagerImpl.java index 7b1b96c2b..d5959a622 100644 --- a/briar-android/src/org/briarproject/android/ReferenceManagerImpl.java +++ b/briar-android/src/org/briarproject/android/ReferenceManagerImpl.java @@ -8,7 +8,7 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Logger; -import org.briarproject.api.android.ReferenceManager; +import org.briarproject.android.api.ReferenceManager; class ReferenceManagerImpl implements ReferenceManager { diff --git a/briar-android/src/org/briarproject/android/SetupActivity.java b/briar-android/src/org/briarproject/android/SetupActivity.java index 4aba12d05..6caf20e5a 100644 --- a/briar-android/src/org/briarproject/android/SetupActivity.java +++ b/briar-android/src/org/briarproject/android/SetupActivity.java @@ -17,7 +17,7 @@ import android.widget.TextView.OnEditorActionListener; import org.briarproject.R; import org.briarproject.android.util.AndroidUtils; import org.briarproject.android.util.StrengthMeter; -import org.briarproject.api.android.ReferenceManager; +import org.briarproject.android.api.ReferenceManager; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.crypto.KeyPair; diff --git a/briar-android/src/org/briarproject/android/SplashScreenActivity.java b/briar-android/src/org/briarproject/android/SplashScreenActivity.java index acc0652af..b79e605e1 100644 --- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java +++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java @@ -8,11 +8,11 @@ import android.os.StrictMode; import android.os.StrictMode.ThreadPolicy; import android.os.StrictMode.VmPolicy; import android.support.v7.preference.PreferenceManager; -import android.util.Log; import android.widget.ImageView; import android.widget.LinearLayout; import org.briarproject.R; +import org.briarproject.android.util.AndroidUtils; import org.briarproject.android.util.LayoutUtils; import org.briarproject.api.db.DatabaseConfig; import org.briarproject.util.FileUtils; @@ -91,6 +91,7 @@ public class SplashScreenActivity extends BaseActivity { startActivity(new Intent(this, NavDrawerActivity.class)); } else { clearSharedPrefs(); + AndroidUtils.deleteAppData(this); FileUtils.deleteFileOrDir( dbConfig.getDatabaseDirectory()); startActivity(new Intent(this, SetupActivity.class)); diff --git a/briar-api/src/org/briarproject/api/android/PlatformExecutor.java b/briar-android/src/org/briarproject/android/api/AndroidExecutor.java similarity index 85% rename from briar-api/src/org/briarproject/api/android/PlatformExecutor.java rename to briar-android/src/org/briarproject/android/api/AndroidExecutor.java index 4cd309374..5ed8ef0f8 100644 --- a/briar-api/src/org/briarproject/api/android/PlatformExecutor.java +++ b/briar-android/src/org/briarproject/android/api/AndroidExecutor.java @@ -1,4 +1,4 @@ -package org.briarproject.api.android; +package org.briarproject.android.api; import java.util.concurrent.Callable; import java.util.concurrent.Future; @@ -7,7 +7,7 @@ import java.util.concurrent.Future; * Enables background threads to make Android API calls that must be made from * a thread with a message queue. */ -public interface PlatformExecutor { +public interface AndroidExecutor { /** * Runs the given task on the main UI thread and returns a Future for diff --git a/briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java b/briar-android/src/org/briarproject/android/api/AndroidNotificationManager.java similarity index 91% rename from briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java rename to briar-android/src/org/briarproject/android/api/AndroidNotificationManager.java index 3aad189dc..33177e1b8 100644 --- a/briar-api/src/org/briarproject/api/android/AndroidNotificationManager.java +++ b/briar-android/src/org/briarproject/android/api/AndroidNotificationManager.java @@ -1,4 +1,4 @@ -package org.briarproject.api.android; +package org.briarproject.android.api; import org.briarproject.api.sync.GroupId; diff --git a/briar-api/src/org/briarproject/api/android/ReferenceManager.java b/briar-android/src/org/briarproject/android/api/ReferenceManager.java similarity index 95% rename from briar-api/src/org/briarproject/api/android/ReferenceManager.java rename to briar-android/src/org/briarproject/android/api/ReferenceManager.java index 2366d9e1c..8f1cd93b0 100644 --- a/briar-api/src/org/briarproject/api/android/ReferenceManager.java +++ b/briar-android/src/org/briarproject/android/api/ReferenceManager.java @@ -1,4 +1,4 @@ -package org.briarproject.api.android; +package org.briarproject.android.api; /** * Manages mappings between object references and serialisable handles. This diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index 4555d8c9d..45ebe6eab 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -21,11 +21,10 @@ import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; import org.briarproject.android.util.BriarRecyclerView; import org.briarproject.api.FormatException; -import org.briarproject.api.android.AndroidNotificationManager; +import org.briarproject.android.api.AndroidNotificationManager; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager; -import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.db.DbException; import org.briarproject.api.db.NoSuchContactException; diff --git a/briar-android/src/org/briarproject/android/forum/ForumActivity.java b/briar-android/src/org/briarproject/android/forum/ForumActivity.java index 96add7ce4..6b6fcea04 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java +++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java @@ -18,7 +18,7 @@ import org.briarproject.android.BriarActivity; import org.briarproject.android.util.ElasticHorizontalSpace; import org.briarproject.android.util.HorizontalBorder; import org.briarproject.android.util.ListLoadingProgressBar; -import org.briarproject.api.android.AndroidNotificationManager; +import org.briarproject.android.api.AndroidNotificationManager; import org.briarproject.api.db.DbException; import org.briarproject.api.db.NoSuchGroupException; import org.briarproject.api.db.NoSuchMessageException; diff --git a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java index 39f2b578e..1d8b12fe0 100644 --- a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java +++ b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java @@ -7,7 +7,7 @@ import android.widget.Toast; import org.briarproject.R; import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; -import org.briarproject.api.android.ReferenceManager; +import org.briarproject.android.api.ReferenceManager; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.identity.AuthorId; diff --git a/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java index 5e71c113f..29f271f0e 100644 --- a/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java +++ b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java @@ -9,6 +9,7 @@ import android.support.v7.preference.PreferenceManager; import org.briarproject.android.AndroidComponent; import org.briarproject.android.BriarActivity; +import org.briarproject.android.util.AndroidUtils; import org.briarproject.api.db.DatabaseConfig; import org.briarproject.util.FileUtils; import org.iilab.IilabEngineeringRSA2048Pin; @@ -111,9 +112,7 @@ public class PanicResponderActivity extends BriarActivity { public void run() { clearSharedPrefs(); // TODO somehow delete/shred the database more thoroughly - FileUtils - .deleteFileOrDir( - databaseConfig.getDatabaseDirectory()); + AndroidUtils.deleteAppData(PanicResponderActivity.this); PanicResponder.deleteAllAppData(PanicResponderActivity.this); // nothing left to do after everything is deleted, diff --git a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java new file mode 100644 index 000000000..7718122f0 --- /dev/null +++ b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java @@ -0,0 +1,61 @@ +package org.briarproject.plugins; + +import android.app.Application; +import android.content.Context; + +import org.briarproject.android.api.AndroidExecutor; +import org.briarproject.api.event.EventBus; +import org.briarproject.api.lifecycle.IoExecutor; +import org.briarproject.api.plugins.BackoffFactory; +import org.briarproject.api.plugins.duplex.DuplexPluginConfig; +import org.briarproject.api.plugins.duplex.DuplexPluginFactory; +import org.briarproject.api.plugins.simplex.SimplexPluginConfig; +import org.briarproject.api.plugins.simplex.SimplexPluginFactory; +import org.briarproject.api.system.LocationUtils; +import org.briarproject.plugins.droidtooth.DroidtoothPluginFactory; +import org.briarproject.plugins.tcp.AndroidLanTcpPluginFactory; +import org.briarproject.plugins.tor.TorPluginFactory; + +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.Executor; + +import dagger.Module; +import dagger.Provides; + +@Module +public class AndroidPluginsModule { + + @Provides + SimplexPluginConfig provideSimplexPluginConfig() { + return new SimplexPluginConfig() { + public Collection getFactories() { + return Collections.emptyList(); + } + }; + } + + @Provides + public DuplexPluginConfig provideDuplexPluginConfig( + @IoExecutor Executor ioExecutor, AndroidExecutor androidExecutor, + SecureRandom random, BackoffFactory backoffFactory, Application app, + LocationUtils locationUtils, EventBus eventBus) { + Context appContext = app.getApplicationContext(); + DuplexPluginFactory bluetooth = new DroidtoothPluginFactory(ioExecutor, + androidExecutor, appContext, random, backoffFactory); + DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, appContext, + locationUtils, eventBus); + DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor, + backoffFactory, appContext); + final Collection factories = + Arrays.asList(bluetooth, tor, lan); + return new DuplexPluginConfig() { + public Collection getFactories() { + return factories; + } + }; + } + +} diff --git a/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java b/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java index b2b408f8d..14a55180c 100644 --- a/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java +++ b/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java @@ -1,50 +1,33 @@ package org.briarproject.plugins; -import android.app.Application; -import android.content.Context; - -import org.briarproject.api.android.PlatformExecutor; -import org.briarproject.api.event.EventBus; -import org.briarproject.api.lifecycle.IoExecutor; -import org.briarproject.api.plugins.BackoffFactory; -import org.briarproject.api.plugins.duplex.DuplexPluginConfig; -import org.briarproject.api.plugins.duplex.DuplexPluginFactory; -import org.briarproject.api.system.LocationUtils; -import org.briarproject.plugins.droidtooth.DroidtoothPluginFactory; -import org.briarproject.plugins.tcp.AndroidLanTcpPluginFactory; -import org.briarproject.plugins.tor.TorPluginFactory; - -import java.security.SecureRandom; -import java.util.Arrays; -import java.util.Collection; -import java.util.concurrent.Executor; - public class PluginsModuleExtension extends PluginsModule { - private final Application app; +// @Inject @Named("AndroidDuplexPluginConfig") +// DuplexPluginConfig duplexPluginConfig; + + public PluginsModuleExtension() { - public PluginsModuleExtension(Application app) { - this.app = app; } +// @Override +// SimplexPluginConfig provideSimplexPluginConfig() { +// return new SimplexPluginConfig() { +// public Collection getFactories() { +// return Collections.emptyList(); +// } +// }; +// } + +/* @Override public DuplexPluginConfig provideDuplexPluginConfig( - @IoExecutor Executor ioExecutor, PlatformExecutor platformExecutor, + @IoExecutor Executor ioExecutor, AndroidExecutor androidExecutor, SecureRandom random, BackoffFactory backoffFactory, LocationUtils locationUtils, EventBus eventBus) { - Context appContext = app.getApplicationContext(); - DuplexPluginFactory bluetooth = new DroidtoothPluginFactory(ioExecutor, - platformExecutor, appContext, random, backoffFactory); - DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, appContext, - locationUtils, eventBus); - DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor, - backoffFactory, appContext); - final Collection factories = - Arrays.asList(bluetooth, tor, lan); - return new DuplexPluginConfig() { - public Collection getFactories() { - return factories; - } - }; - } +// return duplexPluginConfig; +// @Inject @Named("AndroidDuplexPluginConfig") +// DuplexPluginConfig andoridDuplexPlugin; +// return andoridDuplexPlugin; +// } +*/ } diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java index 325a49d74..2bc7dbe70 100644 --- a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java +++ b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java @@ -11,7 +11,7 @@ import android.content.IntentFilter; import org.briarproject.android.util.AndroidUtils; import org.briarproject.api.TransportId; -import org.briarproject.api.android.AndroidExecutor; +import org.briarproject.android.api.AndroidExecutor; import org.briarproject.api.contact.ContactId; import org.briarproject.api.crypto.PseudoRandom; import org.briarproject.api.plugins.Backoff; diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPluginFactory.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPluginFactory.java index db89929a2..229aba227 100644 --- a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPluginFactory.java +++ b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPluginFactory.java @@ -3,7 +3,7 @@ package org.briarproject.plugins.droidtooth; import android.content.Context; import org.briarproject.api.TransportId; -import org.briarproject.api.android.AndroidExecutor; +import org.briarproject.android.api.AndroidExecutor; import org.briarproject.api.plugins.Backoff; import org.briarproject.api.plugins.BackoffFactory; import org.briarproject.api.plugins.duplex.DuplexPlugin; diff --git a/briar-android/src/org/briarproject/system/AndroidExecutorImpl.java b/briar-android/src/org/briarproject/system/AndroidExecutorImpl.java index b119fb8c7..0b9674c25 100644 --- a/briar-android/src/org/briarproject/system/AndroidExecutorImpl.java +++ b/briar-android/src/org/briarproject/system/AndroidExecutorImpl.java @@ -6,15 +6,13 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; -import org.briarproject.api.android.PlatformExecutor; +import org.briarproject.android.api.AndroidExecutor; import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; -import javax.inject.Inject; - -class AndroidExecutorImpl implements PlatformExecutor { +class AndroidExecutorImpl implements AndroidExecutor { private final Handler handler; diff --git a/briar-android/src/org/briarproject/system/AndroidSystemModule.java b/briar-android/src/org/briarproject/system/AndroidSystemModule.java new file mode 100644 index 000000000..74e39e06a --- /dev/null +++ b/briar-android/src/org/briarproject/system/AndroidSystemModule.java @@ -0,0 +1,29 @@ +package org.briarproject.system; + +import android.app.Application; + +import org.briarproject.android.api.AndroidExecutor; +import org.briarproject.api.system.LocationUtils; +import org.briarproject.api.system.SeedProvider; + +import dagger.Module; +import dagger.Provides; + +@Module +public class AndroidSystemModule { + + @Provides + public SeedProvider provideSeedProvider(Application app) { + return new AndroidSeedProvider(app); + } + + @Provides + public LocationUtils provideLocationUtils(Application app) { + return new AndroidLocationUtils(app); + } + + @Provides + public AndroidExecutor providePlatformExecutor(Application app) { + return new AndroidExecutorImpl(app); + } +} diff --git a/briar-android/src/org/briarproject/system/PlatformModuleExtension.java b/briar-android/src/org/briarproject/system/PlatformModuleExtension.java deleted file mode 100644 index dc2ae6a4a..000000000 --- a/briar-android/src/org/briarproject/system/PlatformModuleExtension.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.briarproject.system; - -import android.app.Application; -import android.content.Context; - -import org.briarproject.PlatformModule; -import org.briarproject.android.ApplicationScope; -import org.briarproject.api.android.PlatformExecutor; -import org.briarproject.api.crypto.SecretKey; -import org.briarproject.api.db.DatabaseConfig; -import org.briarproject.api.ui.UiCallback; - -import java.io.File; - -public class PlatformModuleExtension extends PlatformModule { - - private final UiCallback uiCallback; - private final Application app; - - public PlatformModuleExtension(Application app) { - this.app = app; - // Use a dummy UI callback - uiCallback = new UiCallback() { - - public int showChoice(String[] options, String... message) { - throw new UnsupportedOperationException(); - } - - public boolean showConfirmationMessage(String... message) { - throw new UnsupportedOperationException(); - } - - public void showMessage(String... message) { - throw new UnsupportedOperationException(); - } - }; - } - - @Override - public UiCallback provideUICallback() { - return uiCallback; - } - - @Override - @ApplicationScope - public DatabaseConfig provideDatabaseConfig() { - final File dir = app.getApplicationContext().getDir("db", Context.MODE_PRIVATE); - return new DatabaseConfig() { - - private volatile SecretKey key = null; - - public boolean databaseExists() { - return dir.isDirectory() && dir.listFiles().length > 0; - } - - public File getDatabaseDirectory() { - return dir; - } - - public void setEncryptionKey(SecretKey key) { - this.key = key; - } - - public SecretKey getEncryptionKey() { - return key; - } - - public long getMaxSize() { - return Long.MAX_VALUE; - } - }; - } - - @Override - public PlatformExecutor providePlatformExecutor() { - return new AndroidExecutorImpl(app); - } -} diff --git a/briar-android/src/org/briarproject/system/SystemModuleExtension.java b/briar-android/src/org/briarproject/system/SystemModuleExtension.java deleted file mode 100644 index 72ea338b4..000000000 --- a/briar-android/src/org/briarproject/system/SystemModuleExtension.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.briarproject.system; - - -import android.app.Application; - -import org.briarproject.api.system.Clock; -import org.briarproject.api.system.LocationUtils; -import org.briarproject.api.system.SeedProvider; -import org.briarproject.api.system.Timer; - -import dagger.Module; -import dagger.Provides; - -public class SystemModuleExtension extends SystemModule { - - private final Application app; - - public SystemModuleExtension(final Application app) { - this.app = app; - } - - @Override - public SeedProvider provideSeedProvider() { - return new AndroidSeedProvider(app); - } - - @Override - public LocationUtils provideLocationUtils() { - return new AndroidLocationUtils(app); - } - -} diff --git a/briar-core/src/org/briarproject/CoreComponent.java b/briar-core/src/org/briarproject/CoreComponent.java deleted file mode 100644 index 9f7c41df0..000000000 --- a/briar-core/src/org/briarproject/CoreComponent.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.briarproject; - -import org.briarproject.api.android.PlatformExecutor; -import org.briarproject.api.android.ReferenceManager; -import org.briarproject.api.contact.ContactManager; -import org.briarproject.api.crypto.CryptoComponent; -import org.briarproject.api.crypto.CryptoExecutor; -import org.briarproject.api.crypto.PasswordStrengthEstimator; -import org.briarproject.api.db.DatabaseConfig; -import org.briarproject.api.db.DatabaseExecutor; -import org.briarproject.api.event.EventBus; -import org.briarproject.api.forum.ForumManager; -import org.briarproject.api.forum.ForumPostFactory; -import org.briarproject.api.forum.ForumSharingManager; -import org.briarproject.api.identity.AuthorFactory; -import org.briarproject.api.identity.IdentityManager; -import org.briarproject.api.invitation.InvitationTaskFactory; -import org.briarproject.api.lifecycle.IoExecutor; -import org.briarproject.api.lifecycle.LifecycleManager; -import org.briarproject.api.messaging.MessagingManager; -import org.briarproject.api.messaging.PrivateMessageFactory; -import org.briarproject.api.plugins.ConnectionRegistry; -import org.briarproject.api.plugins.PluginManager; -import org.briarproject.api.properties.TransportPropertyManager; -import org.briarproject.api.settings.SettingsManager; -import org.briarproject.api.sync.ValidationManager; -import org.briarproject.api.transport.KeyManager; -import org.briarproject.clients.ClientsModule; -import org.briarproject.contact.ContactModule; -import org.briarproject.crypto.CryptoModule; -import org.briarproject.data.DataModule; -import org.briarproject.db.DatabaseModule; -import org.briarproject.event.EventModule; -import org.briarproject.forum.ForumModule; -import org.briarproject.identity.IdentityModule; -import org.briarproject.invitation.InvitationModule; -import org.briarproject.lifecycle.LifecycleModule; -import org.briarproject.messaging.MessagingModule; -import org.briarproject.messaging.PrivateMessageValidator; -import org.briarproject.plugins.PluginsModule; -import org.briarproject.properties.PropertiesModule; -import org.briarproject.properties.TransportPropertyValidator; -import org.briarproject.reliability.ReliabilityModule; -import org.briarproject.settings.SettingsModule; -import org.briarproject.sync.SyncModule; -import org.briarproject.system.SystemModule; -import org.briarproject.transport.TransportModule; - -import java.util.concurrent.Executor; - -import javax.inject.Singleton; - -import dagger.Component; - -@Singleton -@Component(modules = {DatabaseModule.class, - CryptoModule.class, LifecycleModule.class, PlatformModule.class, - ReliabilityModule.class, MessagingModule.class, - InvitationModule.class, ForumModule.class, IdentityModule.class, - EventModule.class, DataModule.class, ContactModule.class, - PropertiesModule.class, TransportModule.class, SyncModule.class, - SettingsModule.class, ClientsModule.class, SystemModule.class, - PluginsModule.class}) -public interface CoreComponent { - @IoExecutor - Executor ioExecutor(); - ContactManager contactManager(); - @CryptoExecutor Executor cryptoExecutor(); - DatabaseConfig databaseConfig(); - PasswordStrengthEstimator passwordStrengthEstimator(); - CryptoComponent cryptoComponent(); - @DatabaseExecutor Executor dbExecutor(); - LifecycleManager lifecycleManager(); - AuthorFactory authFactory(); - EventBus eventBus(); - KeyManager keyManager(); - ValidationManager validationManager(); - ForumManager forumManager(); - IdentityManager identityManager(); - PluginManager pluginManager(); - SettingsManager settingsManater(); - InvitationTaskFactory invitationTaskFactory(); - MessagingManager messagingManager(); - TransportPropertyManager transportPropertyManager(); - ConnectionRegistry connectionRegistry(); - ForumSharingManager forumSharingManager(); - PrivateMessageFactory privateMessageFactory(); - ForumPostFactory forumPostFactory(); - PrivateMessageValidator privateMessageValidator(); - TransportPropertyValidator transportPropertyValidator(); - PlatformExecutor platformExecutor(); - // Eager singletons - void inject(ContactModule.EagerSingletons init); - void inject(CryptoModule.EagerSingletons init); - void inject(DatabaseModule.EagerSingletons init); - void inject(ForumModule.EagerSingletons init); - void inject(LifecycleModule.EagerSingletons init); - void inject(MessagingModule.EagerSingletons init); - void inject(PluginsModule.EagerSingletons init); - void inject(PropertiesModule.EagerSingletons init); - void inject(SyncModule.EagerSingletons init); - void inject(TransportModule.EagerSingletons init); -} diff --git a/briar-core/src/org/briarproject/CoreEagerSingletons.java b/briar-core/src/org/briarproject/CoreEagerSingletons.java index 8637f7106..00d46b1da 100644 --- a/briar-core/src/org/briarproject/CoreEagerSingletons.java +++ b/briar-core/src/org/briarproject/CoreEagerSingletons.java @@ -11,18 +11,16 @@ import org.briarproject.properties.PropertiesModule; import org.briarproject.sync.SyncModule; import org.briarproject.transport.TransportModule; -public class CoreEagerSingletons { +public interface CoreEagerSingletons { + void inject(ContactModule.EagerSingletons init); + void inject(CryptoModule.EagerSingletons init); + void inject(DatabaseModule.EagerSingletons init); + void inject(ForumModule.EagerSingletons init); + void inject(LifecycleModule.EagerSingletons init); + void inject(MessagingModule.EagerSingletons init); + void inject(PluginsModule.EagerSingletons init); + void inject(PropertiesModule.EagerSingletons init); + void inject(SyncModule.EagerSingletons init); + void inject(TransportModule.EagerSingletons init); - public static void initEagerSingletons(CoreComponent c) { - c.inject(new ContactModule.EagerSingletons()); - c.inject(new CryptoModule.EagerSingletons()); - c.inject(new DatabaseModule.EagerSingletons()); - c.inject(new ForumModule.EagerSingletons()); - c.inject(new LifecycleModule.EagerSingletons()); - c.inject(new MessagingModule.EagerSingletons()); - c.inject(new PluginsModule.EagerSingletons()); - c.inject(new PropertiesModule.EagerSingletons()); - c.inject(new SyncModule.EagerSingletons()); - c.inject(new TransportModule.EagerSingletons()); - } } diff --git a/briar-core/src/org/briarproject/CoreModule.java b/briar-core/src/org/briarproject/CoreModule.java new file mode 100644 index 000000000..11d6c87b0 --- /dev/null +++ b/briar-core/src/org/briarproject/CoreModule.java @@ -0,0 +1,45 @@ +package org.briarproject; + +import org.briarproject.clients.ClientsModule; +import org.briarproject.contact.ContactModule; +import org.briarproject.crypto.CryptoModule; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.event.EventModule; +import org.briarproject.forum.ForumModule; +import org.briarproject.identity.IdentityModule; +import org.briarproject.invitation.InvitationModule; +import org.briarproject.lifecycle.LifecycleModule; +import org.briarproject.messaging.MessagingModule; +import org.briarproject.plugins.PluginsModule; +import org.briarproject.properties.PropertiesModule; +import org.briarproject.reliability.ReliabilityModule; +import org.briarproject.settings.SettingsModule; +import org.briarproject.sync.SyncModule; +import org.briarproject.system.SystemModule; +import org.briarproject.transport.TransportModule; + +import dagger.Module; + +@Module(includes = {DatabaseModule.class, + CryptoModule.class, LifecycleModule.class, ReliabilityModule.class, + MessagingModule.class, InvitationModule.class, ForumModule.class, + IdentityModule.class, EventModule.class, DataModule.class, + ContactModule.class, PropertiesModule.class, TransportModule.class, + SyncModule.class, SettingsModule.class, ClientsModule.class, + SystemModule.class, PluginsModule.class}) +public class CoreModule { + + public static void initEagerSingletons(CoreEagerSingletons c) { + c.inject(new ContactModule.EagerSingletons()); + c.inject(new CryptoModule.EagerSingletons()); + c.inject(new DatabaseModule.EagerSingletons()); + c.inject(new ForumModule.EagerSingletons()); + c.inject(new LifecycleModule.EagerSingletons()); + c.inject(new MessagingModule.EagerSingletons()); + c.inject(new PluginsModule.EagerSingletons()); + c.inject(new PropertiesModule.EagerSingletons()); + c.inject(new SyncModule.EagerSingletons()); + c.inject(new TransportModule.EagerSingletons()); + } +} diff --git a/briar-core/src/org/briarproject/PlatformModule.java b/briar-core/src/org/briarproject/PlatformModule.java deleted file mode 100644 index c4242048a..000000000 --- a/briar-core/src/org/briarproject/PlatformModule.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.briarproject; - -import org.briarproject.api.android.PlatformExecutor; -import org.briarproject.api.db.DatabaseConfig; -import org.briarproject.api.ui.UiCallback; - -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; - -/** - * This class contains methods that MUST(!) be overridden in platform specific - * modules that use the core. - */ -@Module -public class PlatformModule { - - @Provides - @Singleton - public DatabaseConfig provideDatabaseConfig() { - return null; - } - - @Provides - public UiCallback provideUICallback() { - return null; - } - - - @Provides - public PlatformExecutor providePlatformExecutor() { - return null; - } - -} diff --git a/briar-core/src/org/briarproject/plugins/PluginsModule.java b/briar-core/src/org/briarproject/plugins/PluginsModule.java index 0d523c348..afdb970df 100644 --- a/briar-core/src/org/briarproject/plugins/PluginsModule.java +++ b/briar-core/src/org/briarproject/plugins/PluginsModule.java @@ -3,7 +3,6 @@ package org.briarproject.plugins; import javax.inject.Inject; import javax.inject.Singleton; -import org.briarproject.api.android.PlatformExecutor; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.LifecycleManager; @@ -11,19 +10,13 @@ import org.briarproject.api.plugins.BackoffFactory; import org.briarproject.api.plugins.ConnectionManager; import org.briarproject.api.plugins.ConnectionRegistry; import org.briarproject.api.plugins.PluginManager; -import org.briarproject.api.plugins.duplex.DuplexPluginConfig; -import org.briarproject.api.plugins.simplex.SimplexPluginConfig; -import org.briarproject.api.plugins.simplex.SimplexPluginFactory; import org.briarproject.api.sync.SyncSessionFactory; -import org.briarproject.api.system.LocationUtils; import org.briarproject.api.system.Timer; import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; import java.security.SecureRandom; -import java.util.Collection; -import java.util.Collections; import java.util.concurrent.Executor; import dagger.Module; @@ -68,6 +61,7 @@ public class PluginsModule { return new ConnectionRegistryImpl(eventBus); } + @Provides @Singleton PluginManager getPluginManager(LifecycleManager lifecycleManager, @@ -75,21 +69,15 @@ public class PluginsModule { lifecycleManager.register(pluginManager); return pluginManager; } - +/* @Provides SimplexPluginConfig provideSimplexPluginConfig() { - return new SimplexPluginConfig() { - public Collection getFactories() { - return Collections.emptyList(); - } - }; + return null; } @Provides - public DuplexPluginConfig provideDuplexPluginConfig(@IoExecutor Executor ioExecutor, - PlatformExecutor platformExecutor, /*Application app,*/ - SecureRandom random, BackoffFactory backoffFactory, - LocationUtils locationUtils, EventBus eventBus) { + public DuplexPluginConfig provideDuplexPluginConfig() { return null; } + */ } diff --git a/briar-core/src/org/briarproject/system/SystemModule.java b/briar-core/src/org/briarproject/system/SystemModule.java index 8a2304e2e..eb2a0d88d 100644 --- a/briar-core/src/org/briarproject/system/SystemModule.java +++ b/briar-core/src/org/briarproject/system/SystemModule.java @@ -20,13 +20,4 @@ public class SystemModule { return new SystemTimer(); } - @Provides - public SeedProvider provideSeedProvider() { - return null; - } - - @Provides - public LocationUtils provideLocationUtils() { - return null; - } } From 686729b045727ed0b50573b476d73ae0ab7d9a2f Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Sun, 13 Mar 2016 23:01:58 +0100 Subject: [PATCH 11/13] refactor with master and fixed files that were accidentally clobbered --- .../briarproject/forum/ForumManagerImpl.java | 149 +++++------------- .../org/briarproject/forum/ForumModule.java | 6 +- .../messaging/MessagingManagerImpl.java | 126 ++++----------- .../TransportPropertyManagerImpl.java | 143 ++++++----------- 4 files changed, 123 insertions(+), 301 deletions(-) diff --git a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumManagerImpl.java index 534369d2d..d2b2d872e 100644 --- a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java +++ b/briar-core/src/org/briarproject/forum/ForumManagerImpl.java @@ -1,15 +1,12 @@ package org.briarproject.forum; import org.briarproject.api.FormatException; +import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.Contact; import org.briarproject.api.data.BdfDictionary; -import org.briarproject.api.data.BdfReader; -import org.briarproject.api.data.BdfReaderFactory; -import org.briarproject.api.data.MetadataEncoder; -import org.briarproject.api.data.MetadataParser; +import org.briarproject.api.data.BdfList; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; -import org.briarproject.api.db.Metadata; import org.briarproject.api.db.Transaction; import org.briarproject.api.forum.Forum; import org.briarproject.api.forum.ForumManager; @@ -24,8 +21,6 @@ import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; import org.briarproject.util.StringUtils; -import java.io.ByteArrayInputStream; -import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -34,18 +29,12 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.logging.Logger; import javax.inject.Inject; -import static java.util.logging.Level.WARNING; -import static org.briarproject.api.forum.ForumConstants.FORUM_SALT_LENGTH; -import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH; -import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_POST_BODY_LENGTH; import static org.briarproject.api.identity.Author.Status.ANONYMOUS; import static org.briarproject.api.identity.Author.Status.UNKNOWN; import static org.briarproject.api.identity.Author.Status.VERIFIED; -import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; class ForumManagerImpl implements ForumManager { @@ -53,21 +42,13 @@ class ForumManagerImpl implements ForumManager { "859a7be50dca035b64bd6902fb797097" + "795af837abbf8c16d750b3c2ccc186ea")); - private static final Logger LOG = - Logger.getLogger(ForumManagerImpl.class.getName()); - private final DatabaseComponent db; - private final BdfReaderFactory bdfReaderFactory; - private final MetadataEncoder metadataEncoder; - private final MetadataParser metadataParser; + private final ClientHelper clientHelper; @Inject - ForumManagerImpl(DatabaseComponent db, BdfReaderFactory bdfReaderFactory, - MetadataEncoder metadataEncoder, MetadataParser metadataParser) { + ForumManagerImpl(DatabaseComponent db, ClientHelper clientHelper) { this.db = db; - this.bdfReaderFactory = bdfReaderFactory; - this.metadataEncoder = metadataEncoder; - this.metadataParser = metadataParser; + this.clientHelper = clientHelper; } @Override @@ -78,29 +59,21 @@ class ForumManagerImpl implements ForumManager { @Override public void addLocalPost(ForumPost p) throws DbException { try { - BdfDictionary d = new BdfDictionary(); - d.put("timestamp", p.getMessage().getTimestamp()); - if (p.getParent() != null) - d.put("parent", p.getParent().getBytes()); + BdfDictionary meta = new BdfDictionary(); + meta.put("timestamp", p.getMessage().getTimestamp()); + if (p.getParent() != null) meta.put("parent", p.getParent()); if (p.getAuthor() != null) { Author a = p.getAuthor(); - BdfDictionary d1 = new BdfDictionary(); - d1.put("id", a.getId().getBytes()); - d1.put("name", a.getName()); - d1.put("publicKey", a.getPublicKey()); - d.put("author", d1); - } - d.put("contentType", p.getContentType()); - d.put("local", true); - d.put("read", true); - Metadata meta = metadataEncoder.encode(d); - Transaction txn = db.startTransaction(); - try { - db.addLocalMessage(txn, p.getMessage(), CLIENT_ID, meta, true); - txn.setComplete(); - } finally { - db.endTransaction(txn); + BdfDictionary authorMeta = new BdfDictionary(); + authorMeta.put("id", a.getId()); + authorMeta.put("name", a.getName()); + authorMeta.put("publicKey", a.getPublicKey()); + meta.put("author", authorMeta); } + meta.put("contentType", p.getContentType()); + meta.put("local", true); + meta.put("read", true); + clientHelper.addLocalMessage(p.getMessage(), CLIENT_ID, meta, true); } catch (FormatException e) { throw new RuntimeException(e); } @@ -145,34 +118,11 @@ class ForumManagerImpl implements ForumManager { @Override public byte[] getPostBody(MessageId m) throws DbException { try { - byte[] raw; - Transaction txn = db.startTransaction(); - try { - raw = db.getRawMessage(txn, m); - txn.setComplete(); - } finally { - db.endTransaction(txn); - } - ByteArrayInputStream in = new ByteArrayInputStream(raw, - MESSAGE_HEADER_LENGTH, raw.length - MESSAGE_HEADER_LENGTH); - BdfReader r = bdfReaderFactory.createReader(in); - r.readListStart(); - if (r.hasRaw()) r.skipRaw(); // Parent ID - else r.skipNull(); // No parent - if (r.hasList()) r.skipList(); // Author - else r.skipNull(); // No author - r.skipString(); // Content type - byte[] postBody = r.readRaw(MAX_FORUM_POST_BODY_LENGTH); - if (r.hasRaw()) r.skipRaw(); // Signature - else r.skipNull(); - r.readListEnd(); - if (!r.eof()) throw new FormatException(); - return postBody; + // Parent ID, author, content type, forum post body, signature + BdfList message = clientHelper.getMessageAsList(m); + return message.getRaw(3); } catch (FormatException e) { throw new DbException(e); - } catch (IOException e) { - // Shouldn't happen with ByteArrayInputStream - throw new RuntimeException(e); } } @@ -181,7 +131,7 @@ class ForumManagerImpl implements ForumManager { throws DbException { Set localAuthorIds = new HashSet(); Set contactAuthorIds = new HashSet(); - Map metadata; + Map metadata; Transaction txn = db.startTransaction(); try { // Load the IDs of the user's identities @@ -191,20 +141,22 @@ class ForumManagerImpl implements ForumManager { for (Contact c : db.getContacts(txn)) contactAuthorIds.add(c.getAuthor().getId()); // Load the metadata - metadata = db.getMessageMetadata(txn, g); + metadata = clientHelper.getMessageMetadataAsDictionary(txn, g); txn.setComplete(); + } catch (FormatException e) { + throw new DbException(e); } finally { db.endTransaction(txn); } // Parse the metadata Collection headers = new ArrayList(); - for (Entry e : metadata.entrySet()) { + for (Entry entry : metadata.entrySet()) { try { - BdfDictionary d = metadataParser.parse(e.getValue()); - long timestamp = d.getLong("timestamp"); + BdfDictionary meta = entry.getValue(); + long timestamp = meta.getLong("timestamp"); Author author = null; Author.Status authorStatus = ANONYMOUS; - BdfDictionary d1 = d.getDictionary("author", null); + BdfDictionary d1 = meta.getDictionary("author", null); if (d1 != null) { AuthorId authorId = new AuthorId(d1.getRaw("id")); String name = d1.getString("name"); @@ -216,13 +168,12 @@ class ForumManagerImpl implements ForumManager { authorStatus = VERIFIED; else authorStatus = UNKNOWN; } - String contentType = d.getString("contentType"); - boolean read = d.getBoolean("read"); - headers.add(new ForumPostHeader(e.getKey(), timestamp, author, - authorStatus, contentType, read)); - } catch (FormatException ex) { - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, ex.toString(), ex); + String contentType = meta.getString("contentType"); + boolean read = meta.getBoolean("read"); + headers.add(new ForumPostHeader(entry.getKey(), timestamp, + author, authorStatus, contentType, read)); + } catch (FormatException e) { + throw new DbException(e); } } return headers; @@ -231,36 +182,18 @@ class ForumManagerImpl implements ForumManager { @Override public void setReadFlag(MessageId m, boolean read) throws DbException { try { - BdfDictionary d = new BdfDictionary(); - d.put("read", read); - Metadata meta = metadataEncoder.encode(d); - Transaction txn = db.startTransaction(); - try { - db.mergeMessageMetadata(txn, m, meta); - txn.setComplete(); - } finally { - db.endTransaction(txn); - } + BdfDictionary meta = new BdfDictionary(); + meta.put("read", read); + clientHelper.mergeMessageMetadata(m, meta); } catch (FormatException e) { throw new RuntimeException(e); } } private Forum parseForum(Group g) throws FormatException { - ByteArrayInputStream in = new ByteArrayInputStream(g.getDescriptor()); - BdfReader r = bdfReaderFactory.createReader(in); - try { - r.readListStart(); - String name = r.readString(MAX_FORUM_NAME_LENGTH); - byte[] salt = r.readRaw(FORUM_SALT_LENGTH); - r.readListEnd(); - if (!r.eof()) throw new FormatException(); - return new Forum(g, name, salt); - } catch (FormatException e) { - throw e; - } catch (IOException e) { - // Shouldn't happen with ByteArrayInputStream - throw new RuntimeException(e); - } + byte[] descriptor = g.getDescriptor(); + // Name, salt + BdfList forum = clientHelper.toList(descriptor, 0, descriptor.length); + return new Forum(g, forum.getString(0), forum.getRaw(1)); } } diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java index 8442edeb7..4a51872e7 100644 --- a/briar-core/src/org/briarproject/forum/ForumModule.java +++ b/briar-core/src/org/briarproject/forum/ForumModule.java @@ -35,10 +35,8 @@ public class ForumModule { @Provides @Singleton ForumManager provideForumManager(DatabaseComponent db, - ContactManager contactManager, BdfReaderFactory bdfReaderFactory, - MetadataEncoder metadataEncoder, MetadataParser metadataParser) { - return new ForumManagerImpl(db, bdfReaderFactory, metadataEncoder, - metadataParser); + ClientHelper clientHelper) { + return new ForumManagerImpl(db, clientHelper); } @Provides diff --git a/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java b/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java index 657126053..c1a0eb797 100644 --- a/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java +++ b/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java @@ -1,19 +1,16 @@ package org.briarproject.messaging; import org.briarproject.api.FormatException; +import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.PrivateGroupFactory; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager.AddContactHook; import org.briarproject.api.contact.ContactManager.RemoveContactHook; import org.briarproject.api.data.BdfDictionary; -import org.briarproject.api.data.BdfReader; -import org.briarproject.api.data.BdfReaderFactory; -import org.briarproject.api.data.MetadataEncoder; -import org.briarproject.api.data.MetadataParser; +import org.briarproject.api.data.BdfList; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; -import org.briarproject.api.db.Metadata; import org.briarproject.api.db.Transaction; import org.briarproject.api.messaging.MessagingManager; import org.briarproject.api.messaging.PrivateMessage; @@ -25,19 +22,12 @@ import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageStatus; import org.briarproject.util.StringUtils; -import java.io.ByteArrayInputStream; -import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Map; -import java.util.logging.Logger; import javax.inject.Inject; -import static java.util.logging.Level.WARNING; -import static org.briarproject.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_BODY_LENGTH; -import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; - class MessagingManagerImpl implements MessagingManager, AddContactHook, RemoveContactHook { @@ -45,25 +35,16 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, "6bcdc006c0910b0f44e40644c3b31f1a" + "8bf9a6d6021d40d219c86b731b903070")); - private static final Logger LOG = - Logger.getLogger(MessagingManagerImpl.class.getName()); - private final DatabaseComponent db; + private final ClientHelper clientHelper; private final PrivateGroupFactory privateGroupFactory; - private final BdfReaderFactory bdfReaderFactory; - private final MetadataEncoder metadataEncoder; - private final MetadataParser metadataParser; @Inject - MessagingManagerImpl(DatabaseComponent db, - PrivateGroupFactory privateGroupFactory, - BdfReaderFactory bdfReaderFactory, MetadataEncoder metadataEncoder, - MetadataParser metadataParser) { + MessagingManagerImpl(DatabaseComponent db, ClientHelper clientHelper, + PrivateGroupFactory privateGroupFactory) { this.db = db; + this.clientHelper = clientHelper; this.privateGroupFactory = privateGroupFactory; - this.bdfReaderFactory = bdfReaderFactory; - this.metadataEncoder = metadataEncoder; - this.metadataParser = metadataParser; } @Override @@ -77,7 +58,7 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, // Attach the contact ID to the group BdfDictionary d = new BdfDictionary(); d.put("contactId", c.getId().getInt()); - db.mergeGroupMetadata(txn, g.getId(), metadataEncoder.encode(d)); + clientHelper.mergeGroupMetadata(txn, g.getId(), d); } catch (FormatException e) { throw new RuntimeException(e); } @@ -100,21 +81,13 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, @Override public void addLocalMessage(PrivateMessage m) throws DbException { try { - BdfDictionary d = new BdfDictionary(); - d.put("timestamp", m.getMessage().getTimestamp()); - if (m.getParent() != null) - d.put("parent", m.getParent().getBytes()); - d.put("contentType", m.getContentType()); - d.put("local", true); - d.put("read", true); - Metadata meta = metadataEncoder.encode(d); - Transaction txn = db.startTransaction(); - try { - db.addLocalMessage(txn, m.getMessage(), CLIENT_ID, meta, true); - txn.setComplete(); - } finally { - db.endTransaction(txn); - } + BdfDictionary meta = new BdfDictionary(); + meta.put("timestamp", m.getMessage().getTimestamp()); + if (m.getParent() != null) meta.put("parent", m.getParent()); + meta.put("contentType", m.getContentType()); + meta.put("local", true); + meta.put("read", true); + clientHelper.addLocalMessage(m.getMessage(), CLIENT_ID, meta, true); } catch (FormatException e) { throw new RuntimeException(e); } @@ -123,16 +96,8 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, @Override public ContactId getContactId(GroupId g) throws DbException { try { - Metadata meta; - Transaction txn = db.startTransaction(); - try { - meta = db.getGroupMetadata(txn, g); - txn.setComplete(); - } finally { - db.endTransaction(txn); - } - BdfDictionary d = metadataParser.parse(meta); - return new ContactId(d.getLong("contactId").intValue()); + BdfDictionary meta = clientHelper.getGroupMetadataAsDictionary(g); + return new ContactId(meta.getLong("contactId").intValue()); } catch (FormatException e) { throw new DbException(e); } @@ -154,14 +119,16 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, @Override public Collection getMessageHeaders(ContactId c) throws DbException { - Map metadata; + Map metadata; Collection statuses; Transaction txn = db.startTransaction(); try { GroupId g = getContactGroup(db.getContact(txn, c)).getId(); - metadata = db.getMessageMetadata(txn, g); + metadata = clientHelper.getMessageMetadataAsDictionary(txn, g); statuses = db.getMessageStatus(txn, c, g); txn.setComplete(); + } catch (FormatException e) { + throw new DbException(e); } finally { db.endTransaction(txn); } @@ -169,18 +136,17 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, new ArrayList(); for (MessageStatus s : statuses) { MessageId id = s.getMessageId(); - Metadata m = metadata.get(id); - if (m == null) continue; + BdfDictionary meta = metadata.get(id); + if (meta == null) continue; try { - BdfDictionary d = metadataParser.parse(m); - long timestamp = d.getLong("timestamp"); - String contentType = d.getString("contentType"); - boolean local = d.getBoolean("local"); - boolean read = d.getBoolean("read"); + long timestamp = meta.getLong("timestamp"); + String contentType = meta.getString("contentType"); + boolean local = meta.getBoolean("local"); + boolean read = meta.getBoolean("read"); headers.add(new PrivateMessageHeader(id, timestamp, contentType, local, read, s.isSent(), s.isSeen())); } catch (FormatException e) { - if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); + throw new DbException(e); } } return headers; @@ -188,47 +154,21 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook, @Override public byte[] getMessageBody(MessageId m) throws DbException { - byte[] raw; - Transaction txn = db.startTransaction(); try { - raw = db.getRawMessage(txn, m); - txn.setComplete(); - } finally { - db.endTransaction(txn); - } - ByteArrayInputStream in = new ByteArrayInputStream(raw, - MESSAGE_HEADER_LENGTH, raw.length - MESSAGE_HEADER_LENGTH); - BdfReader r = bdfReaderFactory.createReader(in); - try { - r.readListStart(); - if (r.hasRaw()) r.skipRaw(); // Parent ID - else r.skipNull(); // No parent - r.skipString(); // Content type - byte[] messageBody = r.readRaw(MAX_PRIVATE_MESSAGE_BODY_LENGTH); - r.readListEnd(); - if (!r.eof()) throw new FormatException(); - return messageBody; + // Parent ID, content type, private message body + BdfList message = clientHelper.getMessageAsList(m); + return message.getRaw(2); } catch (FormatException e) { throw new DbException(e); - } catch (IOException e) { - // Shouldn't happen with ByteArrayInputStream - throw new RuntimeException(e); } } @Override public void setReadFlag(MessageId m, boolean read) throws DbException { try { - BdfDictionary d = new BdfDictionary(); - d.put("read", read); - Metadata meta = metadataEncoder.encode(d); - Transaction txn = db.startTransaction(); - try { - db.mergeMessageMetadata(txn, m, meta); - txn.setComplete(); - } finally { - db.endTransaction(txn); - } + BdfDictionary meta = new BdfDictionary(); + meta.put("read", read); + clientHelper.mergeMessageMetadata(m, meta); } catch (FormatException e) { throw new RuntimeException(e); } diff --git a/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java b/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java index 6bf9b5281..2c9016652 100644 --- a/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java +++ b/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java @@ -3,21 +3,16 @@ package org.briarproject.properties; import org.briarproject.api.DeviceId; import org.briarproject.api.FormatException; import org.briarproject.api.TransportId; +import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.PrivateGroupFactory; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager.AddContactHook; import org.briarproject.api.contact.ContactManager.RemoveContactHook; import org.briarproject.api.data.BdfDictionary; -import org.briarproject.api.data.BdfReader; -import org.briarproject.api.data.BdfReaderFactory; -import org.briarproject.api.data.BdfWriter; -import org.briarproject.api.data.BdfWriterFactory; -import org.briarproject.api.data.MetadataEncoder; -import org.briarproject.api.data.MetadataParser; +import org.briarproject.api.data.BdfList; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; -import org.briarproject.api.db.Metadata; import org.briarproject.api.db.NoSuchGroupException; import org.briarproject.api.db.Transaction; import org.briarproject.api.properties.TransportProperties; @@ -27,14 +22,10 @@ import org.briarproject.api.sync.Group; import org.briarproject.api.sync.GroupFactory; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.Message; -import org.briarproject.api.sync.MessageFactory; import org.briarproject.api.sync.MessageId; import org.briarproject.api.system.Clock; import org.briarproject.util.StringUtils; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -42,9 +33,6 @@ import java.util.Map.Entry; import javax.inject.Inject; -import static org.briarproject.api.properties.TransportPropertyConstants.MAX_PROPERTY_LENGTH; -import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; - class TransportPropertyManagerImpl implements TransportPropertyManager, AddContactHook, RemoveContactHook { @@ -55,28 +43,18 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, private static final byte[] LOCAL_GROUP_DESCRIPTOR = new byte[0]; private final DatabaseComponent db; + private final ClientHelper clientHelper; private final PrivateGroupFactory privateGroupFactory; - private final MessageFactory messageFactory; - private final BdfReaderFactory bdfReaderFactory; - private final BdfWriterFactory bdfWriterFactory; - private final MetadataEncoder metadataEncoder; - private final MetadataParser metadataParser; private final Clock clock; private final Group localGroup; @Inject TransportPropertyManagerImpl(DatabaseComponent db, - GroupFactory groupFactory, PrivateGroupFactory privateGroupFactory, - MessageFactory messageFactory, BdfReaderFactory bdfReaderFactory, - BdfWriterFactory bdfWriterFactory, MetadataEncoder metadataEncoder, - MetadataParser metadataParser, Clock clock) { + ClientHelper clientHelper, GroupFactory groupFactory, + PrivateGroupFactory privateGroupFactory, Clock clock) { this.db = db; + this.clientHelper = clientHelper; this.privateGroupFactory = privateGroupFactory; - this.messageFactory = messageFactory; - this.bdfReaderFactory = bdfReaderFactory; - this.bdfWriterFactory = bdfWriterFactory; - this.metadataEncoder = metadataEncoder; - this.metadataParser = metadataParser; this.clock = clock; localGroup = groupFactory.createGroup(CLIENT_ID, LOCAL_GROUP_DESCRIPTOR); @@ -145,8 +123,9 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, true); if (latest != null) { // Retrieve and parse the latest local properties - byte[] raw = db.getRawMessage(txn, latest.messageId); - p = parseProperties(raw); + BdfList message = clientHelper.getMessageAsList(txn, + latest.messageId); + p = parseProperties(message); } txn.setComplete(); } finally { @@ -175,8 +154,9 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, LatestUpdate latest = findLatest(txn, g.getId(), t, false); if (latest != null) { // Retrieve and parse the latest remote properties - byte[] raw = db.getRawMessage(txn, latest.messageId); - remote.put(c.getId(), parseProperties(raw)); + BdfList message = clientHelper.getMessageAsList(txn, + latest.messageId); + remote.put(c.getId(), parseProperties(message)); } } txn.setComplete(); @@ -206,8 +186,9 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, merged = p; changed = true; } else { - byte[] raw = db.getRawMessage(txn, latest.messageId); - TransportProperties old = parseProperties(raw); + BdfList message = clientHelper.getMessageAsList(txn, + latest.messageId); + TransportProperties old = parseProperties(message); merged = new TransportProperties(old); merged.putAll(p); changed = !merged.equals(old); @@ -250,8 +231,9 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, localGroup.getId(), true); // Retrieve and parse the latest local properties for (Entry e : latest.entrySet()) { - byte[] raw = db.getRawMessage(txn, e.getValue().messageId); - local.put(e.getKey(), parseProperties(raw)); + BdfList message = clientHelper.getMessageAsList(txn, + e.getValue().messageId); + local.put(e.getKey(), parseProperties(message)); } return local; } catch (NoSuchGroupException e) { @@ -266,48 +248,35 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, TransportId t, TransportProperties p, long version, boolean local, boolean shared) throws DbException { try { - byte[] body = encodeProperties(dev, t, p, version); + BdfList body = encodeProperties(dev, t, p, version); long now = clock.currentTimeMillis(); - Message m = messageFactory.createMessage(g, now, body); - BdfDictionary d = new BdfDictionary(); - d.put("transportId", t.getString()); - d.put("version", version); - d.put("local", local); - Metadata meta = metadataEncoder.encode(d); - db.addLocalMessage(txn, m, CLIENT_ID, meta, shared); + Message m = clientHelper.createMessage(g, now, body); + BdfDictionary meta = new BdfDictionary(); + meta.put("transportId", t.getString()); + meta.put("version", version); + meta.put("local", local); + clientHelper.addLocalMessage(txn, m, CLIENT_ID, meta, shared); } catch (FormatException e) { throw new RuntimeException(e); } } - private byte[] encodeProperties(DeviceId dev, TransportId t, + private BdfList encodeProperties(DeviceId dev, TransportId t, TransportProperties p, long version) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - BdfWriter w = bdfWriterFactory.createWriter(out); - try { - w.writeListStart(); - w.writeRaw(dev.getBytes()); - w.writeString(t.getString()); - w.writeLong(version); - w.writeDictionary(p); - w.writeListEnd(); - } catch (IOException e) { - // Shouldn't happen with ByteArrayOutputStream - throw new RuntimeException(e); - } - return out.toByteArray(); + return BdfList.of(dev, t.getString(), version, p); } private Map findLatest(Transaction txn, GroupId g, boolean local) throws DbException, FormatException { Map latestUpdates = new HashMap(); - Map metadata = db.getMessageMetadata(txn, g); - for (Entry e : metadata.entrySet()) { - BdfDictionary d = metadataParser.parse(e.getValue()); - if (d.getBoolean("local") == local) { - TransportId t = new TransportId(d.getString("transportId")); - long version = d.getLong("version"); + Map metadata = + clientHelper.getMessageMetadataAsDictionary(txn, g); + for (Entry e : metadata.entrySet()) { + BdfDictionary meta = e.getValue(); + if (meta.getBoolean("local") == local) { + TransportId t = new TransportId(meta.getString("transportId")); + long version = meta.getLong("version"); LatestUpdate latest = latestUpdates.get(t); if (latest == null || version > latest.version) latestUpdates.put(t, new LatestUpdate(e.getKey(), version)); @@ -319,12 +288,13 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, private LatestUpdate findLatest(Transaction txn, GroupId g, TransportId t, boolean local) throws DbException, FormatException { LatestUpdate latest = null; - Map metadata = db.getMessageMetadata(txn, g); - for (Entry e : metadata.entrySet()) { - BdfDictionary d = metadataParser.parse(e.getValue()); - if (d.getString("transportId").equals(t.getString()) - && d.getBoolean("local") == local) { - long version = d.getLong("version"); + Map metadata = + clientHelper.getMessageMetadataAsDictionary(txn, g); + for (Entry e : metadata.entrySet()) { + BdfDictionary meta = e.getValue(); + if (meta.getString("transportId").equals(t.getString()) + && meta.getBoolean("local") == local) { + long version = meta.getLong("version"); if (latest == null || version > latest.version) latest = new LatestUpdate(e.getKey(), version); } @@ -332,33 +302,14 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, return latest; } - private TransportProperties parseProperties(byte[] raw) + private TransportProperties parseProperties(BdfList message) throws FormatException { + // Device ID, transport ID, version, properties + BdfDictionary dictionary = message.getDictionary(3); TransportProperties p = new TransportProperties(); - ByteArrayInputStream in = new ByteArrayInputStream(raw, - MESSAGE_HEADER_LENGTH, raw.length - MESSAGE_HEADER_LENGTH); - BdfReader r = bdfReaderFactory.createReader(in); - try { - r.readListStart(); - r.skipRaw(); // Device ID - r.skipString(); // Transport ID - r.skipLong(); // Version - r.readDictionaryStart(); - while (!r.hasDictionaryEnd()) { - String key = r.readString(MAX_PROPERTY_LENGTH); - String value = r.readString(MAX_PROPERTY_LENGTH); - p.put(key, value); - } - r.readDictionaryEnd(); - r.readListEnd(); - if (!r.eof()) throw new FormatException(); - return p; - } catch (FormatException e) { - throw e; - } catch (IOException e) { - // Shouldn't happen with ByteArrayInputStream - throw new RuntimeException(e); - } + for (String key : dictionary.keySet()) + p.put(key, dictionary.getString(key)); + return p; } private static class LatestUpdate { From 85c66417b5f810af739b5f8df2badfe63e5cf858 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Sun, 13 Mar 2016 23:23:45 +0100 Subject: [PATCH 12/13] branch cleanup --- briar-android/build.gradle | 3 -- .../android/SplashScreenActivity.java | 2 -- .../plugins/PluginsModuleExtension.java | 33 ------------------- .../messaging/PrivateMessageValidator.java | 2 +- .../briarproject/plugins/PluginsModule.java | 10 ------ 5 files changed, 1 insertion(+), 49 deletions(-) delete mode 100644 briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java diff --git a/briar-android/build.gradle b/briar-android/build.gradle index ac9355117..81228e918 100644 --- a/briar-android/build.gradle +++ b/briar-android/build.gradle @@ -97,7 +97,4 @@ android { lintOptions { abortOnError false } -} -dependencies { - compile 'cglib:cglib-nodep:3.1' } \ No newline at end of file diff --git a/briar-android/src/org/briarproject/android/SplashScreenActivity.java b/briar-android/src/org/briarproject/android/SplashScreenActivity.java index b79e605e1..17fabc68c 100644 --- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java +++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java @@ -92,8 +92,6 @@ public class SplashScreenActivity extends BaseActivity { } else { clearSharedPrefs(); AndroidUtils.deleteAppData(this); - FileUtils.deleteFileOrDir( - dbConfig.getDatabaseDirectory()); startActivity(new Intent(this, SetupActivity.class)); } } diff --git a/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java b/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java deleted file mode 100644 index 14a55180c..000000000 --- a/briar-android/src/org/briarproject/plugins/PluginsModuleExtension.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.briarproject.plugins; - -public class PluginsModuleExtension extends PluginsModule { - -// @Inject @Named("AndroidDuplexPluginConfig") -// DuplexPluginConfig duplexPluginConfig; - - public PluginsModuleExtension() { - - } - -// @Override -// SimplexPluginConfig provideSimplexPluginConfig() { -// return new SimplexPluginConfig() { -// public Collection getFactories() { -// return Collections.emptyList(); -// } -// }; -// } - -/* - @Override - public DuplexPluginConfig provideDuplexPluginConfig( - @IoExecutor Executor ioExecutor, AndroidExecutor androidExecutor, - SecureRandom random, BackoffFactory backoffFactory, - LocationUtils locationUtils, EventBus eventBus) { -// return duplexPluginConfig; -// @Inject @Named("AndroidDuplexPluginConfig") -// DuplexPluginConfig andoridDuplexPlugin; -// return andoridDuplexPlugin; -// } -*/ -} diff --git a/briar-core/src/org/briarproject/messaging/PrivateMessageValidator.java b/briar-core/src/org/briarproject/messaging/PrivateMessageValidator.java index ad1fcb81b..550da3f9c 100644 --- a/briar-core/src/org/briarproject/messaging/PrivateMessageValidator.java +++ b/briar-core/src/org/briarproject/messaging/PrivateMessageValidator.java @@ -14,7 +14,7 @@ import org.briarproject.clients.BdfMessageValidator; import static org.briarproject.api.messaging.MessagingConstants.MAX_CONTENT_TYPE_LENGTH; import static org.briarproject.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_BODY_LENGTH; -public class PrivateMessageValidator extends BdfMessageValidator { +class PrivateMessageValidator extends BdfMessageValidator { PrivateMessageValidator(ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock) { diff --git a/briar-core/src/org/briarproject/plugins/PluginsModule.java b/briar-core/src/org/briarproject/plugins/PluginsModule.java index afdb970df..6f3357b8b 100644 --- a/briar-core/src/org/briarproject/plugins/PluginsModule.java +++ b/briar-core/src/org/briarproject/plugins/PluginsModule.java @@ -69,15 +69,5 @@ public class PluginsModule { lifecycleManager.register(pluginManager); return pluginManager; } -/* - @Provides - SimplexPluginConfig provideSimplexPluginConfig() { - return null; - } - @Provides - public DuplexPluginConfig provideDuplexPluginConfig() { - return null; - } - */ } From 11bfa212cc63ba1d288ee26a1a77015a14fc81c3 Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson Date: Mon, 14 Mar 2016 20:54:59 +0100 Subject: [PATCH 13/13] minor tweaks --- briar-android-tests/build.gradle | 2 +- .../briarproject/android/SplashScreenActivity.java | 14 ++++++-------- .../src/org/briarproject/data/DataModule.java | 2 +- .../src/org/briarproject/TestLifecycleModule.java | 3 +++ 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/briar-android-tests/build.gradle b/briar-android-tests/build.gradle index 5fb287884..8c329bb6e 100644 --- a/briar-android-tests/build.gradle +++ b/briar-android-tests/build.gradle @@ -13,7 +13,7 @@ android { buildToolsVersion "23.0.2" defaultConfig { - minSdkVersion 10 + minSdkVersion 9 targetSdkVersion 22 versionCode 1 versionName "1.0" diff --git a/briar-android/src/org/briarproject/android/SplashScreenActivity.java b/briar-android/src/org/briarproject/android/SplashScreenActivity.java index 17fabc68c..45944439a 100644 --- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java +++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java @@ -86,14 +86,12 @@ public class SplashScreenActivity extends BaseActivity { } else { String hex = getEncryptedDatabaseKey(); - if (dbConfig != null) { - if (hex != null && dbConfig.databaseExists()) { - startActivity(new Intent(this, NavDrawerActivity.class)); - } else { - clearSharedPrefs(); - AndroidUtils.deleteAppData(this); - startActivity(new Intent(this, SetupActivity.class)); - } + if (hex != null && dbConfig.databaseExists()) { + startActivity(new Intent(this, NavDrawerActivity.class)); + } else { + clearSharedPrefs(); + AndroidUtils.deleteAppData(this); + startActivity(new Intent(this, SetupActivity.class)); } } } diff --git a/briar-core/src/org/briarproject/data/DataModule.java b/briar-core/src/org/briarproject/data/DataModule.java index 8a8286511..b83293104 100644 --- a/briar-core/src/org/briarproject/data/DataModule.java +++ b/briar-core/src/org/briarproject/data/DataModule.java @@ -28,7 +28,7 @@ public class DataModule { } @Provides - MetadataEncoder provideMetaDataEncoider(BdfWriterFactory bdfWriterFactory) { + MetadataEncoder provideMetaDataEncoder(BdfWriterFactory bdfWriterFactory) { return new MetadataEncoderImpl(bdfWriterFactory); } diff --git a/briar-tests/src/org/briarproject/TestLifecycleModule.java b/briar-tests/src/org/briarproject/TestLifecycleModule.java index 6022af177..fbf07ca0d 100644 --- a/briar-tests/src/org/briarproject/TestLifecycleModule.java +++ b/briar-tests/src/org/briarproject/TestLifecycleModule.java @@ -9,6 +9,8 @@ import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import javax.inject.Singleton; + import dagger.Module; import dagger.Provides; @@ -72,6 +74,7 @@ public class TestLifecycleModule { @Provides @IoExecutor + @Singleton Executor provideExecutor() { return Executors.newCachedThreadPool(); }