diff --git a/briar-android-tests/.gitignore b/briar-android-tests/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..216c35063ecddba09d050a3e6d558df0f1190226 --- /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 0000000000000000000000000000000000000000..8c329bb6e3aabecbcacd215980d3075e440033e7 --- /dev/null +++ b/briar-android-tests/build.gradle @@ -0,0 +1,49 @@ +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 9 + targetSdkVersion 22 + 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' + 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-tests/proguard-rules.pro b/briar-android-tests/proguard-rules.pro new file mode 100644 index 0000000000000000000000000000000000000000..2106d3d2c9baa446f784ed6fb1f247ecbc4e74a4 --- /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 0000000000000000000000000000000000000000..9d2a221d175ab80fb033138b7a11aec14c583f40 --- /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; + +/** + * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a> + */ +public class ApplicationTest extends ApplicationTestCase<Application> { + 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 0000000000000000000000000000000000000000..a152a552bc0e57036f8e675c23b6141d7f672329 --- /dev/null +++ b/briar-android-tests/src/main/AndroidManifest.xml @@ -0,0 +1,12 @@ +<manifest package="org.briarproject" + xmlns:android="http://schemas.android.com/apk/res/android"> + + <application + android:allowBackup="true" + android:label="@string/app_name" + android:supportsRtl="true" + > + + </application> + +</manifest> 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 0000000000000000000000000000000000000000..71b096466ae082079106a62465094f96721b51df --- /dev/null +++ b/briar-android-tests/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">briar-android-tests</string> +</resources> 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 e8c939d4cfe0811c6e71f3af8945e08dd8d52eed..cc36c199dd9b6f47aaf1e355cfae81a3821b1300 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,14 +21,15 @@ 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 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; +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; @@ -37,48 +37,43 @@ 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; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +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<MessageId> 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 0000000000000000000000000000000000000000..59f58e0cc18f57f99c1bbbe9128c9a2d032a0912 --- /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 0000000000000000000000000000000000000000..6e8b2c7829fbe03fc476dc443a7a77b97a05838b --- /dev/null +++ b/briar-android-tests/src/test/java/org/briarproject/sync/ConstantsComponent.java @@ -0,0 +1,29 @@ +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; +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, ClientsModule.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 bac9995415b5ed08f8bd12077c45340b20632a1d..426a38945f0e4df713a6b2e8e29e6e30ae146412 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 0000000000000000000000000000000000000000..1d0a7d70f348b403f8c5712a265385ae706a3483 --- /dev/null +++ b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingComponent.java @@ -0,0 +1,52 @@ +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.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 javax.inject.Singleton; + +import dagger.Component; + +@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, ClientsModule.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 74% rename from briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java rename to briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java index 0c95d8b3b694811bc56f6acb211ae25b80174305..9ad9df0f2832ef25573aacb2b6e3c5158b9a3ed4 100644 --- a/briar-tests/src/org/briarproject/sync/SimplexMessagingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/sync/SimplexMessagingIntegrationTest.java @@ -1,12 +1,8 @@ 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; @@ -36,33 +32,23 @@ 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.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,15 @@ 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 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,22 +80,19 @@ 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); + 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.getInstance(PrivateMessageFactory.class); + alice.getPrivateMessageFactory(); PacketWriterFactory packetWriterFactory = - alice.getInstance(PacketWriterFactory.class); - EventBus eventBus = alice.getInstance(EventBus.class); + alice.getPacketWriterFactory(); + EventBus eventBus = alice.getEventBus(); StreamWriterFactory streamWriterFactory = - alice.getInstance(StreamWriterFactory.class); + alice.getStreamWriterFactory(); // Start the lifecycle manager lifecycleManager.startServices(); @@ -172,20 +148,16 @@ 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(); @@ -210,7 +182,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { // 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/AndroidManifest.xml b/briar-android/AndroidManifest.xml index 92340fd50e1fe3843409520923ecdcc18900d0f3..cab5c80b94ca3db32355596785e7ee1a249a4138 100644 --- a/briar-android/AndroidManifest.xml +++ b/briar-android/AndroidManifest.xml @@ -67,6 +67,7 @@ </activity> <activity android:name=".android.SplashScreenActivity" + android:theme="@style/BriarThemeNoActionBar.Default" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> diff --git a/briar-android/build.gradle b/briar-android/build.gradle index fd7393e4b80f0153a6f53e56f76fa391e0f7420c..81228e91863e36d784813798f1c84c57615a3254 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,11 @@ 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' } dependencyVerification { @@ -42,9 +44,9 @@ 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', + 'com.android.support:support-annotations:f347a35b9748a4103b39a6714a77e2100f488d623fd6268e259c177b200e9d82' ] } @@ -95,4 +97,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 1ee57c568558e2457f509c7dd9ca21feb916e3c8..48d785a430ba139f85a88a0a71396a4b5b5671fc 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/res/values/roboguice.xml b/briar-android/res/values/roboguice.xml deleted file mode 100644 index 60265f1c219178cfa4cab1e9b272a8775ac9a0bb..0000000000000000000000000000000000000000 --- a/briar-android/res/values/roboguice.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string-array name="roboguice_modules"> - <item>org.briarproject.android.AndroidModule</item> - <item>org.briarproject.clients.ClientsModule</item> - <item>org.briarproject.contact.ContactModule</item> - <item>org.briarproject.crypto.CryptoModule</item> - <item>org.briarproject.data.DataModule</item> - <item>org.briarproject.db.DatabaseModule</item> - <item>org.briarproject.event.EventModule</item> - <item>org.briarproject.forum.ForumModule</item> - <item>org.briarproject.identity.IdentityModule</item> - <item>org.briarproject.invitation.InvitationModule</item> - <item>org.briarproject.lifecycle.LifecycleModule</item> - <item>org.briarproject.messaging.MessagingModule</item> - <item>org.briarproject.plugins.AndroidPluginsModule</item> - <item>org.briarproject.properties.PropertiesModule</item> - <item>org.briarproject.sync.SyncModule</item> - <item>org.briarproject.system.AndroidSystemModule</item> - <item>org.briarproject.transport.TransportModule</item> - <item>org.briarproject.settings.SettingsModule</item> - </string-array> -</resources> diff --git a/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java b/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java index fa5c1c35a7c4bd9b7415035699089dc348f391e3..49e9a3cc814e7939238ef26710480aa3e8fae7bb 100644 --- a/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java +++ b/briar-android/src/im/delight/android/identicons/AsymmetricIdenticon.java @@ -23,11 +23,8 @@ import org.briarproject.api.crypto.CryptoComponent; import javax.inject.Inject; -import roboguice.RoboGuice; - public class AsymmetricIdenticon extends IdenticonView { - @Inject private CryptoComponent mCrypto; private IdenticonBase mDelegate; public AsymmetricIdenticon(Context context) { @@ -51,12 +48,7 @@ public class AsymmetricIdenticon extends IdenticonView { } private void initDelegate() { - RoboGuice.injectMembers(getContext(), this); 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 71998de61ea891a539a26115afa606ecfae35dcb..7b45675bee346d11d4ed228cb2a38d5b96d4d07c 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 8034a6a1dae305f93f64956dd07fe1c79bb2df3a..8d805cab9bf8fd39433ec13c1407fed392c8b91c 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 f3902708153709947096b173afeeae80e2aca2c8..cb5dcc5bc729739ffa30e56bc7a28ae59fa38c07 100644 --- a/briar-android/src/im/delight/android/identicons/SymmetricIdenticon.java +++ b/briar-android/src/im/delight/android/identicons/SymmetricIdenticon.java @@ -23,13 +23,10 @@ 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; + private IdenticonBase mDelegate; public SymmetricIdenticon(Context context) { @@ -48,12 +45,7 @@ public class SymmetricIdenticon extends IdenticonView { } private void initDelegate() { - RoboGuice.injectMembers(getContext(), this); mDelegate = new IdenticonBase() { - @Override - protected CryptoComponent getCrypto() { - return mCrypto; - } @Override protected int getRowCount() { 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 0000000000000000000000000000000000000000..e182b9a47f8abcdeab4777a508ebc91e8695c9eb --- /dev/null +++ b/briar-android/src/org/briarproject/android/AndroidComponent.java @@ -0,0 +1,75 @@ +package org.briarproject.android; + +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; +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.plugins.AndroidPluginsModule; +import org.briarproject.system.AndroidSystemModule; + +import javax.inject.Singleton; + +import dagger.Component; + +@Singleton +@Component( + 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/AndroidEagerSingletons.java b/briar-android/src/org/briarproject/android/AndroidEagerSingletons.java new file mode 100644 index 0000000000000000000000000000000000000000..b14a785933480e26bb38de7cc3940a595b358249 --- /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 1a46ec730a211872a2e4e4064c1e8b00c0933f7d..d3a7d8a4d53d10897cf3b2b61c64c948e71f6318 100644 --- a/briar-android/src/org/briarproject/android/AndroidModule.java +++ b/briar-android/src/org/briarproject/android/AndroidModule.java @@ -1,13 +1,10 @@ package org.briarproject.android; import android.app.Application; +import android.content.Context; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - -import org.briarproject.api.android.AndroidExecutor; -import org.briarproject.api.android.AndroidNotificationManager; -import org.briarproject.api.android.ReferenceManager; +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; @@ -16,11 +13,19 @@ import org.briarproject.api.ui.UiCallback; import java.io.File; +import javax.inject.Inject; import javax.inject.Singleton; -import static android.content.Context.MODE_PRIVATE; +import dagger.Module; +import dagger.Provides; + +@Module +public class AndroidModule { -public class AndroidModule extends AbstractModule { + static class EagerSingletons { + @Inject + AndroidNotificationManager androidNotificationManager; + } private final UiCallback uiCallback; @@ -42,18 +47,15 @@ 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 + public UiCallback provideUICallback() { + return uiCallback; } - @Provides @Singleton - DatabaseConfig getDatabaseConfig(final Application app) { - final File dir = app.getApplicationContext().getDir("db", MODE_PRIVATE); + @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; @@ -80,12 +82,21 @@ public class AndroidModule extends AbstractModule { }; } - @Provides @Singleton - AndroidNotificationManager getAndroidNotificationManager( + @Provides + @Singleton + ReferenceManager provideReferenceManager() { + return new ReferenceManagerImpl(); + } + + @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/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java index 8a0561f4d2bf1ec5bab72c997e9d5828c2b717a7..172c998d10467e80ccf1bf5ffd2c2f7928911b58 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.AndroidExecutor; -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; 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 0000000000000000000000000000000000000000..53631803d5d86e7bf6c0203eaf2749afcf7c6bfb --- /dev/null +++ b/briar-android/src/org/briarproject/android/AppModule.java @@ -0,0 +1,24 @@ +package org.briarproject.android; + +import android.app.Application; + +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 35cfab4b4d2e55e6cb5f591ce5ac71f8b638b19b..8fc2f16be2b7ff463722d519b80855874e3b0fb6 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<Key<?>, Object> scopedObjects = - new HashMap<Key<?>, 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); - } - - 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)); + AndroidComponent component = + ((BriarApplication) getApplication()).getApplicationComponent(); + injectActivity(component); } - 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<Key<?>, 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 dc0249ff57c480880836e8dbc4e838b157ff9a55..80d33959e84bc97800f405c3d9a936ee1db44e7f 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 8e54544cfe8e248db67e28692f42894d0f02fd94..a4a34720dbf52910df3c7f3392b710c5c4c6dc95 100644 --- a/briar-android/src/org/briarproject/android/BriarApplication.java +++ b/briar-android/src/org/briarproject/android/BriarApplication.java @@ -6,19 +6,37 @@ import java.util.logging.Logger; import android.app.Application; import android.content.Context; +import org.briarproject.CoreModule; + public class BriarApplication extends Application { private static final Logger LOG = Logger.getLogger(BriarApplication.class.getName()); + private AndroidComponent applicationComponent; + @Override public void onCreate() { super.onCreate(); - LOG.info("Created"); + LOG.info("Application Created"); UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler(); Context ctx = getApplicationContext(); CrashHandler newHandler = new CrashHandler(ctx, oldHandler); Thread.setDefaultUncaughtExceptionHandler(newHandler); + + applicationComponent = DaggerAndroidComponent.builder() + .appModule(new AppModule(this)) + .androidModule(new AndroidModule()) + .build(); + + // We need to load the eager singletons directly after making the + // dependency graphs + CoreModule.initEagerSingletons(applicationComponent); + AndroidEagerSingletons.initEagerSingletons(applicationComponent); + } + + 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 f11019303edf796ea0c3d505c115c2a514308d88..06a09cce19cc23e621467203c3bc5c2947028e4f 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; @@ -11,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.android.api.AndroidExecutor; import org.briarproject.api.db.DatabaseConfig; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.LifecycleManager.StartResult; @@ -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 c6bc58b788237bb756dccc48ffa04b2258498b8e..d3d45e61ed4ef14b6a9f2e9695a81ddacc2f0f90 100644 --- a/briar-android/src/org/briarproject/android/NavDrawerActivity.java +++ b/briar-android/src/org/briarproject/android/NavDrawerActivity.java @@ -8,12 +8,12 @@ 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; import android.view.ViewGroup; import android.widget.BaseAdapter; +import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.TextView; @@ -24,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; @@ -42,9 +42,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 +57,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<Transport> transports; private BaseAdapter transportsAdapter; @@ -104,6 +91,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 +104,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 f9f60ed1a5c5143ad498d6fc3edce432e61d7162..d1653207fe14ad05eecf3b7e121ba993960fca66 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/ReferenceManagerImpl.java b/briar-android/src/org/briarproject/android/ReferenceManagerImpl.java index 7b1b96c2b1842e53f67c3edfc6904a9c033f8502..d5959a622e2988bf951643d3308e82b7e6a6d1ef 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 81e832d5f0da4e64b9c41fbfed3613885a894d54..6caf20e5acbaf686aed94603143eb980750689df 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; @@ -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 c58427834b261d4c641354529fa6c03994705b92..45944439a02c29dcc87cb20d6ee2b46d042379ac 100644 --- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java +++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java @@ -1,9 +1,9 @@ package org.briarproject.android; 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 +11,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.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 +36,20 @@ 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,26 +65,31 @@ 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()) { + String hex = getEncryptedDatabaseKey(); + + if (hex != null && dbConfig.databaseExists()) { startActivity(new Intent(this, NavDrawerActivity.class)); } else { - prefs.edit().clear().apply(); + clearSharedPrefs(); AndroidUtils.deleteAppData(this); startActivity(new Intent(this, SetupActivity.class)); } @@ -114,7 +114,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 25d03728945879da013b717a4b7db5c38a12df4a..5180c33c27fe72a5b9fe4b1009f8597bfe7560bf 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 47c319cf01a99dcd335e253302c5491450dc411f..a7446b0cd2913a0a97ea97441b828bc2cea65c95 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-api/src/org/briarproject/api/android/AndroidExecutor.java b/briar-android/src/org/briarproject/android/api/AndroidExecutor.java similarity index 92% rename from briar-api/src/org/briarproject/api/android/AndroidExecutor.java rename to briar-android/src/org/briarproject/android/api/AndroidExecutor.java index 635702d0154d9a1ffe85ee8644c85dbd47071dba..5ed8ef0f89e9d19ce60bd932e4e91bc3cac91157 100644 --- a/briar-api/src/org/briarproject/api/android/AndroidExecutor.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; 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 3aad189dc32c3b404fa8cf1ba695c8e55e2acebd..33177e1b8c42aee32ca58196a75a175cbed64c46 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 2366d9e1cdafebae0967b3bc7ffedfd8413c76fd..8f1cd93b017b07363c530b2de7be5e6b4ff2f35f 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/ContactListAdapter.java b/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java index 739912d95343ed2c32afd572df539286a772bed6..38c64e839cdb90e56c11d1c0b936846256de1597 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 b1352dda77a7f4e2a6b2bd040f53acd03456ad91..30d7ecb5d9ddc0d783da2bbd958c26330c90e574 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,22 @@ public class ContactListFragment extends BaseEventFragment { } @Inject - private 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 injectActivity(AndroidComponent component) { + component.inject(this); + } @Nullable @Override @@ -86,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 b3f562949b34658b1f690376dd7f83c0b091f9b6..45ebe6eab9dbbe9bf053731d975763393f8f7658 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -17,14 +17,14 @@ 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; -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; @@ -71,10 +71,9 @@ 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 AndroidNotificationManager notificationManager; + @Inject protected ConnectionRegistry connectionRegistry; + @Inject @CryptoExecutor protected Executor cryptoExecutor; private Map<MessageId, byte[]> bodyCache = new HashMap<MessageId, byte[]>(); private ConversationAdapter adapter = null; private BriarRecyclerView list = null; @@ -82,10 +81,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; @@ -103,7 +102,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); @@ -115,6 +114,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/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java index a35db98bdd96863a16a752b4d87fdd7dd804c329..7cb7227325a837b24ba7b214e32c56c157b57df3 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/AvailableForumsActivity.java b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java index 2a9beba3c19447bcc6dfb09671b7ddddce6edd6a..6ce64a2a1bb1556450bf83ea2d55d37fe0a37e4d 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 ca0b2ab13c8d3f0777937a2c293be8d2d5cf632e..9307bbb43beee11584944ae8e97fbcfdac55d0cd 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 943db626978ece7bc94611220c5282c40d15a8ca..6b6fcea0496c1f9859a289cbbb3e96490cdd42f6 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java +++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java @@ -13,11 +13,12 @@ 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; 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; @@ -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<MessageId, byte[]> bodyCache = new HashMap<MessageId, byte[]>(); 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 30b62b2827f109b1307b3eb63c1d01a71c61f8f3..1684a14fc686c164723e19ff8ed563189d893a21 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 45cec82f65259481fabfd74deca2eec5d74cea23..890cc0398407b35b56b503c9b66be9933c027653 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 59821f9a126f3efb651c304400fa66cdbed250fa..cf252102eca90424b4e648750f7361d3cce87623 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<Contact> contacts = null; private volatile Collection<ContactId> 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 6bd289e3eeda0c9583f5c5ea3f2a9a16194e3465..59b5b4c3949dd7b4c4d96dc7de1575ec98afee87 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; @@ -123,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); @@ -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 5d69a5870edf9d45e7cc0986085f1101250f568a..03dd189537cb2093ad967611fad40d471dc61bf0 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 b1eb92585bb10a5d7ef1135dae35ae09d6a2eb3f..f98c16ab08336ebfc98b50e94fca9fa2dca5ef51 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 2b293e4e05b873bd94ffbd650dde6d7c856ecfc3..d1d37f9facfcf74e757fba257fb2692755ec410d 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/identity/LocalAuthorSpinnerAdapter.java b/briar-android/src/org/briarproject/android/identity/LocalAuthorSpinnerAdapter.java index a0e2d88de2ebfff7c8dd3e5d3bdcb01f4ad2ffce..3a87c7c354ef280c00b3ad4a8c79f8f927b308d7 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<LocalAuthorItem> list = new ArrayList<LocalAuthorItem>(); - 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/AddContactActivity.java b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java index 3ae2ae4bce8c7a381000bc30f7cb4632e12afca6..1d8b12fe0ac12217cae7d09a7eaafa7b90d5bf0a 100644 --- a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java +++ b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java @@ -5,8 +5,9 @@ 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.android.api.ReferenceManager; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.identity.AuthorId; @@ -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 912d28ccebaf78525a7115852776583b1e3a3000..940de7e7594f83fff6a48fd6d1d0062ce8e8f048 100644 --- a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java +++ b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java @@ -16,16 +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 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 +30,6 @@ import static org.briarproject.android.invitation.AddContactActivity.REQUEST_CRE class ChooseIdentityView extends AddContactView implements OnItemSelectedListener, OnClickListener { - @Inject private CryptoComponent crypto; private LocalAuthorSpinnerAdapter adapter = null; private Spinner spinner = null; @@ -46,7 +40,6 @@ implements OnItemSelectedListener, OnClickListener { void populate() { removeAllViews(); Context ctx = getContext(); - RoboGuice.injectMembers(ctx, this); LayoutInflater inflater = (LayoutInflater) ctx.getSystemService (Context.LAYOUT_INFLATER_SERVICE); @@ -57,7 +50,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/panic/ExitActivity.java b/briar-android/src/org/briarproject/android/panic/ExitActivity.java index 9cfb775d2463e1cbd67e129f60dd691489c61ccc..4417c1fe8f8500ea9c85fa46f748c984979dcc7d 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 13556f838d941dda1366279614833d93fe064133..c25461c347476556401f09c57da3264b724112ec 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 2dd25617c0b7bb938b763b5464fe29cb8c9fc853..29f271f0e4113f82d950aea02b0e63aed166b247 100644 --- a/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java +++ b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java @@ -7,12 +7,17 @@ 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 +31,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,6 +101,11 @@ public class PanicResponderActivity extends BriarActivity { } } + @Override + public void injectActivity(AndroidComponent component) { + component.inject(this); + } + private void deleteAllData() { new Thread() { @Override diff --git a/briar-android/src/org/briarproject/android/util/AuthorView.java b/briar-android/src/org/briarproject/android/util/AuthorView.java index 0f247ce7cddbe6cd1fa9e83cc7408c0694e0872d..4b11d51e8de38760b7ecff84a9790ec06b0793d4 100644 --- a/briar-android/src/org/briarproject/android/util/AuthorView.java +++ b/briar-android/src/org/briarproject/android/util/AuthorView.java @@ -16,11 +16,9 @@ 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; private ImageView avatarView; private TextView nameView; private ImageView statusView; @@ -45,7 +43,6 @@ public class AuthorView extends FrameLayout { } private void initViews() { - RoboGuice.injectMembers(getContext(), this); if (isInEditMode()) return; @@ -63,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-android/src/org/briarproject/plugins/AndroidPluginsModule.java b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java index d9625b36a612b24e79a30fd13da362c5eaeb5494..7718122f011489613a21bba5d61a3717aace09f7 100644 --- a/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java +++ b/briar-android/src/org/briarproject/plugins/AndroidPluginsModule.java @@ -3,9 +3,7 @@ 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.android.api.AndroidExecutor; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.plugins.BackoffFactory; @@ -24,10 +22,14 @@ import java.util.Collection; import java.util.Collections; import java.util.concurrent.Executor; -public class AndroidPluginsModule extends PluginsModule { +import dagger.Module; +import dagger.Provides; + +@Module +public class AndroidPluginsModule { @Provides - SimplexPluginConfig getSimplexPluginConfig() { + SimplexPluginConfig provideSimplexPluginConfig() { return new SimplexPluginConfig() { public Collection<SimplexPluginFactory> getFactories() { return Collections.emptyList(); @@ -36,9 +38,9 @@ public class AndroidPluginsModule extends PluginsModule { } @Provides - DuplexPluginConfig getDuplexPluginConfig(@IoExecutor Executor ioExecutor, - AndroidExecutor androidExecutor, Application app, - SecureRandom random, BackoffFactory backoffFactory, + 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, @@ -55,4 +57,5 @@ public class AndroidPluginsModule extends PluginsModule { } }; } + } diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java index 325a49d74f430d28cb733742b27525b38372fdf5..2bc7dbe702d2ddbeba33e540373dd5345a46d398 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 db89929a2282a62e493f0872218c8e9df4ee5143..229aba22722481cbb67b91e49a1aa6fcd3c66d39 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/android/AndroidExecutorImpl.java b/briar-android/src/org/briarproject/system/AndroidExecutorImpl.java similarity index 88% rename from briar-android/src/org/briarproject/android/AndroidExecutorImpl.java rename to briar-android/src/org/briarproject/system/AndroidExecutorImpl.java index e46e7193bad9dfc7fc0ab75d7d3af109ed109897..0b9674c25274f1f7341f00b8d683374522ebf949 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,19 +6,16 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; -import org.briarproject.api.android.AndroidExecutor; +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 AndroidExecutor { 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/AndroidLocationUtils.java b/briar-android/src/org/briarproject/system/AndroidLocationUtils.java index 3fe05e036ab82190018f6400f92e434ab8c7a2e4..e5907c9c003a5317947b11e9986a3d5a11b42d50 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 9528cb7dbe733dc6c633a8c83016f69d75d65733..74e39e06af0bd375d43098fbedc3c5bf295711b5 100644 --- a/briar-android/src/org/briarproject/system/AndroidSystemModule.java +++ b/briar-android/src/org/briarproject/system/AndroidSystemModule.java @@ -1,18 +1,29 @@ package org.briarproject.system; -import com.google.inject.AbstractModule; +import android.app.Application; -import org.briarproject.api.system.Clock; +import org.briarproject.android.api.AndroidExecutor; 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 + 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-api/build.gradle b/briar-api/build.gradle index bd5a6609387874ca28bf41e0098150fdc7fa7e39..71e8c70be037a51570c625109562329307ed0d07 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 = [ + 'com.google.dagger:dagger:84c0282ed8be73a29e0475d639da030b55dee72369e58dd35ae7d4fe6243dcf9', + 'com.google.dagger:dagger-compiler:b74bc9de063dd4c6400b232231f2ef5056145b8fbecbf5382012007dd1c071b3', '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-producers:99ec15e8a0507ba569e7655bc1165ee5e5ca5aa914b3c8f7e2c2458f724edd6b', + 'com.google.guava:guava:d664fbfc03d2e5ce9cab2a44fb01f1d0bf9dfebeccc1a473b1f9ea31f79f6f99', ] } diff --git a/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java b/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java index c527c5812a238bc57b07d215644aebf7c21d4209..3d531c4e05f6c51d5f0270ae6b8fbc40b2226956 100644 --- a/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.java +++ b/briar-api/src/org/briarproject/api/crypto/CryptoExecutor.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 for long-running crypto tasks. */ -@BindingAnnotation -@Target({ FIELD, METHOD, PARAMETER }) +@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 22d04d0150de4db9b509c133779cdbbf8be740f5..f682121d077dea6805e7ac4ecf99827ba3c02bab 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 01e0ea49959963d8a85b0f07a0301572faa88b96..02bc5bf875a941be136b0939a268028739a4d2f4 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/CoreEagerSingletons.java b/briar-core/src/org/briarproject/CoreEagerSingletons.java new file mode 100644 index 0000000000000000000000000000000000000000..00d46b1da768305a8b0cf484befdb60015a1bf58 --- /dev/null +++ b/briar-core/src/org/briarproject/CoreEagerSingletons.java @@ -0,0 +1,26 @@ +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 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); + +} diff --git a/briar-core/src/org/briarproject/CoreModule.java b/briar-core/src/org/briarproject/CoreModule.java new file mode 100644 index 0000000000000000000000000000000000000000..11d6c87b0ac55d85e9a16c3e2de12a872c8b41d4 --- /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/clients/ClientHelperImpl.java b/briar-core/src/org/briarproject/clients/ClientHelperImpl.java index 65740a391c13e21461a2251dbfd5fe648302dead..40640c17ab397c780f6cd97ad0253ec3af946009 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 b4c1a306cee9f43240883584eae7144ed906f365..055143d43b799faaa5abff52d053e6b1be88fa7d 100644 --- a/briar-core/src/org/briarproject/clients/ClientsModule.java +++ b/briar-core/src/org/briarproject/clients/ClientsModule.java @@ -1,19 +1,40 @@ 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; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; +import org.briarproject.messaging.MessagingModule; +import org.briarproject.sync.SyncModule; -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 4f5698acfac3c93f34040539dc6ad3db5a2b7ccd..df75b73e1a17fbce161b1c527086dd2808233710 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,6 +19,8 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import javax.inject.Inject; + class ContactManagerImpl implements ContactManager, RemoveIdentityHook { private final DatabaseComponent db; diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java index 8e9f3d632bb66dd64cf28b5e156d736c9bf9c43b..bd8e2d3afa05b27aedc9cf3117468995f9fbcf01 100644 --- a/briar-core/src/org/briarproject/contact/ContactModule.java +++ b/briar-core/src/org/briarproject/contact/ContactModule.java @@ -1,20 +1,26 @@ 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.Inject; import javax.inject.Singleton; -public class ContactModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; + +@Module +public class ContactModule { - @Override - protected void configure() {} + public static class EagerSingletons { + @Inject ContactManager contactManager; + } - @Provides @Singleton - ContactManager getContactManager(IdentityManager identityManager, + @Provides + @Singleton + ContactManager getContactManager(LifecycleManager lifecycleManager, + IdentityManager identityManager, ContactManagerImpl 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 5df7e38f0e9c185fe3e5cf04c4fbc09a539e5c1f..aa9744483778fe0a5a7cefdad78bb9cfb1a6f76e 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,26 @@ 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; +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. */ + public static class EagerSingletons { + @Inject + @CryptoExecutor Executor cryptoExecutor; + } + + /** + * The maximum number of executor threads. + */ private static final int MAX_EXECUTOR_THREADS = Runtime.getRuntime().availableProcessors(); @@ -41,19 +52,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 + CryptoComponent provideCryptoComponent(SeedProvider seedProvider) { + return new CryptoComponentImpl(seedProvider); } - @Provides @Singleton @CryptoExecutor + @Provides + PasswordStrengthEstimator providePasswordStrengthEstimator() { + return new PasswordStrengthEstimatorImpl(); + } + + @Provides + StreamDecrypterFactory provideStreamDecrypterFactory( + Provider<AuthenticatedCipher> cipherProvider) { + return new StreamDecrypterFactoryImpl(cipherProvider); + } + + @Provides + StreamEncrypterFactory provideStreamEncrypterFactory(CryptoComponent crypto, + Provider<AuthenticatedCipher> cipherProvider) { + return new StreamEncrypterFactoryImpl(crypto, cipherProvider); + } + + @Provides + @Singleton + @CryptoExecutor Executor getCryptoExecutor(LifecycleManager lifecycleManager) { lifecycleManager.registerForShutdown(cryptoExecutor); return cryptoExecutor; @@ -63,4 +92,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 c3fe841aee351adf938a17fd13dae8a095da52b1..b83293104ff086fe21f5267e99bab9ba0fd16742 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(BdfReaderFactory bdfReaderFactory) { + return new MetadataParserImpl(bdfReaderFactory); + } + + @Provides + MetadataEncoder provideMetaDataEncoder(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 c35ee3ddb834dd4dd140ee8bde58cabadd8173a4..d6cc64b145a970b68770d86c6ad74b0a63f4de8d 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 7d59970b8c5451b1487c128c085229dc2cdcb11e..f387b2d0c5b244299653354d5b1e2644069cd9dd 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/db/DatabaseModule.java b/briar-core/src/org/briarproject/db/DatabaseModule.java index 6a050ed44b9a449fc8d2e5f5ec461ef749f61043..7f590ddd521821f759fff466804e2e6bb6b0e691 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,21 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; +import javax.inject.Inject; 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 { + + public static class EagerSingletons { + @Inject + @DatabaseExecutor ExecutorService executorService; + } private final ExecutorService databaseExecutor; @@ -39,30 +46,28 @@ public class DatabaseModule extends AbstractModule { policy); } - @Override - protected void configure() {} - - @Provides @Singleton - Database<Connection> getDatabase(DatabaseConfig config, + @Provides + @Singleton + Database<Connection> provideDatabase(DatabaseConfig config, SecureRandom random, Clock clock) { return new H2Database(config, random, clock); } @Provides @Singleton - DatabaseComponent getDatabaseComponent(Database<Connection> db, + DatabaseComponent provideDatabaseComponent(Database<Connection> db, EventBus eventBus, ShutdownManager shutdown) { return new DatabaseComponentImpl<Connection>(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 34aa23eb66d4469a246648ac361557cb202232af..e7f92f0379d500ae2d9c06da40d1748a28dcb144 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 fe51b778b32eb7de93fd65a635c281674cfab2ac..d2b2d872e8ebd38954e273ae2a8579438638ba72 100644 --- a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java +++ b/briar-core/src/org/briarproject/forum/ForumManagerImpl.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.contact.Contact; @@ -32,6 +30,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import javax.inject.Inject; + 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; diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java index 19e7ce06f135b2c2917f5a9142c60bafe3bef460..4a51872e7abc05aed8f2cdbfb59a6ecda10eca7d 100644 --- a/briar-core/src/org/briarproject/forum/ForumModule.java +++ b/briar-core/src/org/briarproject/forum/ForumModule.java @@ -1,12 +1,12 @@ 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.MetadataEncoder; +import org.briarproject.api.data.MetadataParser; +import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.forum.ForumManager; import org.briarproject.api.forum.ForumPostFactory; import org.briarproject.api.forum.ForumSharingManager; @@ -14,18 +14,40 @@ import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; +import javax.inject.Inject; import javax.inject.Singleton; -public class ForumModule extends AbstractModule { +import dagger.Module; +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, + ClientHelper clientHelper) { + return new ForumManagerImpl(db, clientHelper); + } - @Override - protected void configure() { - bind(ForumManager.class).to(ForumManagerImpl.class).in(Singleton.class); - bind(ForumPostFactory.class).to(ForumPostFactoryImpl.class); + @Provides + ForumPostFactory provideForumPostFactory(CryptoComponent crypto, + ClientHelper clientHelper) { + return new ForumPostFactoryImpl(crypto, clientHelper); } - @Provides @Singleton - ForumPostValidator getForumPostValidator( + @Provides + @Singleton + ForumPostValidator provideForumPostValidator( ValidationManager validationManager, CryptoComponent crypto, AuthorFactory authorFactory, ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock) { @@ -36,8 +58,9 @@ public class ForumModule extends AbstractModule { return validator; } - @Provides @Singleton - ForumListValidator getForumListValidator( + @Provides + @Singleton + ForumListValidator provideForumListValidator( ValidationManager validationManager, ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock) { ForumListValidator validator = new ForumListValidator(clientHelper, @@ -47,8 +70,10 @@ public class ForumModule extends AbstractModule { 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 aa083679df926ce7e8e94cd807657998de42cad3..b0e8fd486f810180ea15631ba8d2eb57135db72b 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,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import javax.inject.Inject; + 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 0ae2e5aa584958e721a91befb21d0ef648337a0a..997456d2941dad65c40509e8507dc0eb9a5ca06e 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,8 +11,9 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -class IdentityManagerImpl implements IdentityManager { +import javax.inject.Inject; +class IdentityManagerImpl implements IdentityManager { private final DatabaseComponent db; private final List<AddIdentityHook> addHooks; private final List<RemoveIdentityHook> removeHooks; diff --git a/briar-core/src/org/briarproject/identity/IdentityModule.java b/briar-core/src/org/briarproject/identity/IdentityModule.java index c987a8a55addf7c980f145c60842a82858e45b03..e2701561292b08e5b444f15f336741d84fcf9d00 100644 --- a/briar-core/src/org/briarproject/identity/IdentityModule.java +++ b/briar-core/src/org/briarproject/identity/IdentityModule.java @@ -1,23 +1,39 @@ package org.briarproject.identity; -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.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 org.briarproject.crypto.CryptoModule; +import org.briarproject.data.DataModule; +import org.briarproject.db.DatabaseModule; + +import javax.inject.Singleton; -public class IdentityModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; - @Override - protected void configure() { - bind(AuthorFactory.class).to(AuthorFactoryImpl.class); - bind(IdentityManager.class).to(IdentityManagerImpl.class); +@Module +public class IdentityModule { + + @Provides + 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<Author> getAuthorReader(AuthorFactory authorFactory) { + ObjectReader<Author> 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 057ec973207bb09bac052a449dba71690bf7fee3..1a604c9e6b89aebf1d75e69807bdbd859b8aaa11 100644 --- a/briar-core/src/org/briarproject/invitation/InvitationModule.java +++ b/briar-core/src/org/briarproject/invitation/InvitationModule.java @@ -2,14 +2,40 @@ 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, ConnectionManager connectionManager, + IdentityManager identityManager, ContactManager contactManager, + Clock clock, PluginManager pluginManager) { + return new InvitationTaskFactoryImpl(crypto, bdfReaderFactory, + bdfWriterFactory, streamReaderFactory, streamWriterFactory, + authorFactory, 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 0714a0555e4082817fe08b82bc462036616c69f7..7b98244eb405d4e30dc32a4fe1de56e01251d8a6 100644 --- a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java +++ b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java @@ -9,16 +9,26 @@ 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; +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 { + + public static class EagerSingletons { + @Inject + @IoExecutor Executor executor; + } private final ExecutorService ioExecutor; @@ -33,17 +43,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 928b793bf35be07d3275394e6920df4885d3d827..c1a0eb797cad84b3130b76785e1d397bb682dc32 100644 --- a/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java +++ b/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java @@ -1,7 +1,5 @@ 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; @@ -28,6 +26,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; +import javax.inject.Inject; + class MessagingManagerImpl implements MessagingManager, AddContactHook, RemoveContactHook { diff --git a/briar-core/src/org/briarproject/messaging/MessagingModule.java b/briar-core/src/org/briarproject/messaging/MessagingModule.java index 4ea10f9078b84d8aae170d86422eefd377abc4f1..b943a6921d87c689ed83ac44dbf36424e9338207 100644 --- a/briar-core/src/org/briarproject/messaging/MessagingModule.java +++ b/briar-core/src/org/briarproject/messaging/MessagingModule.java @@ -1,8 +1,5 @@ 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.MetadataEncoder; @@ -11,18 +8,30 @@ import org.briarproject.api.messaging.PrivateMessageFactory; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; +import javax.inject.Inject; 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 { + + public static class EagerSingletons { + @Inject MessagingManager messagingManager; + @Inject PrivateMessageValidator privateMessageValidator; + } - @Override - protected void configure() { - bind(PrivateMessageFactory.class).to(PrivateMessageFactoryImpl.class); + @Provides + PrivateMessageFactory providePrivateMessageFactory( + ClientHelper clientHelper) { + return new PrivateMessageFactoryImpl(clientHelper); } - @Provides @Singleton + @Provides + @Singleton PrivateMessageValidator getValidator(ValidationManager validationManager, ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock) { @@ -32,7 +41,8 @@ public class MessagingModule extends AbstractModule { 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 245a37dbb417d57013b402ff14fb178a2c4ba425..86cfab5a18b5fdc7d3908af341c274cdbc6d453f 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 d7f8962d787bfcf1a37faeb3eaecd7e608fd6ece..6f3357b8b5ac88229644c4a6eae3e38c7f283477 100644 --- a/briar-core/src/org/briarproject/plugins/PluginsModule.java +++ b/briar-core/src/org/briarproject/plugins/PluginsModule.java @@ -1,31 +1,73 @@ package org.briarproject.plugins; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; +import javax.inject.Inject; +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; +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; -import javax.inject.Singleton; +import java.security.SecureRandom; +import java.util.concurrent.Executor; + +import dagger.Module; +import dagger.Provides; + + +@Module +public class PluginsModule { + + public static class EagerSingletons { + @Inject + PluginManager pluginManager; + } -public class PluginsModule extends AbstractModule { + @Provides + BackoffFactory provideBackoffFactory() { + return new BackoffFactoryImpl(); + } + + @Provides + Poller providePoller(@IoExecutor Executor ioExecutor, + ConnectionRegistry connectionRegistry, SecureRandom random, + Timer timer) { + return new PollerImpl(ioExecutor, connectionRegistry, random, timer); + } - @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); + @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 + @Provides + @Singleton + ConnectionRegistry provideConnectionRegistry(EventBus eventBus) { + return new ConnectionRegistryImpl(eventBus); + } + + + @Provides + @Singleton PluginManager getPluginManager(LifecycleManager lifecycleManager, PluginManagerImpl pluginManager) { lifecycleManager.register(pluginManager); return pluginManager; } + } diff --git a/briar-core/src/org/briarproject/properties/PropertiesModule.java b/briar-core/src/org/briarproject/properties/PropertiesModule.java index cd40134deb03775a106d60987f3f560bae812ba7..e9f2fcf5801726e72acd6ea8c815be42c68cf738 100644 --- a/briar-core/src/org/briarproject/properties/PropertiesModule.java +++ b/briar-core/src/org/briarproject/properties/PropertiesModule.java @@ -1,8 +1,5 @@ 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.MetadataEncoder; @@ -10,16 +7,24 @@ import org.briarproject.api.properties.TransportPropertyManager; import org.briarproject.api.sync.ValidationManager; import org.briarproject.api.system.Clock; +import javax.inject.Inject; 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() {} + public static class EagerSingletons { + @Inject TransportPropertyValidator transportPropertyValidator; + @Inject TransportPropertyManager transportPropertyManager; + } - @Provides @Singleton + @Provides + @Singleton TransportPropertyValidator getValidator(ValidationManager validationManager, ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock) { diff --git a/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java b/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java index 9c04d99fe9c2e670714c5a682f17ad379c632035..2c90166526ae97810aca79d0e1d8d6cddb1e4e1e 100644 --- a/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java +++ b/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java @@ -1,7 +1,5 @@ package org.briarproject.properties; -import com.google.inject.Inject; - import org.briarproject.api.DeviceId; import org.briarproject.api.FormatException; import org.briarproject.api.TransportId; @@ -33,6 +31,8 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import javax.inject.Inject; + class TransportPropertyManagerImpl implements TransportPropertyManager, AddContactHook, RemoveContactHook { diff --git a/briar-core/src/org/briarproject/properties/TransportPropertyValidator.java b/briar-core/src/org/briarproject/properties/TransportPropertyValidator.java index 55b913c7dd2f60aa935773158602a0fb27cf65a5..b26775d7360abed07d1b69ec9a80b946f79071cb 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-core/src/org/briarproject/reliability/ReliabilityModule.java b/briar-core/src/org/briarproject/reliability/ReliabilityModule.java index aabd18e8754d40674096aa71fc38246c96b58f52..092f218b34a13d71972a5a742b3e23b0c17c29be 100644 --- a/briar-core/src/org/briarproject/reliability/ReliabilityModule.java +++ b/briar-core/src/org/briarproject/reliability/ReliabilityModule.java @@ -1,14 +1,28 @@ 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 javax.inject.Named; - @Override - protected void configure() { - bind(ReliabilityLayerFactory.class).to( - ReliabilityLayerFactoryImpl.class); +import dagger.Module; +import dagger.Provides; + +@Module +public class ReliabilityModule { + + @Provides + ReliabilityLayerFactory provideReliabilityFactoryByExector(@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 eb929aa0991f76006c49e1be5ff19d5c7c66f532..4ff0ff2217cd9c0ec5a5e16bba6e2f121e9fca25 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 f2d0e2b46022e43e535f3cecf05d659fef310995..b9edc99515f8f727f86351fec1c64b6305c64850 100644 --- a/briar-core/src/org/briarproject/settings/SettingsModule.java +++ b/briar-core/src/org/briarproject/settings/SettingsModule.java @@ -1,13 +1,18 @@ package org.briarproject.settings; -import com.google.inject.AbstractModule; - +import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.settings.SettingsManager; +import org.briarproject.db.DatabaseModule; + +import dagger.Module; +import dagger.Provides; -public class SettingsModule extends AbstractModule { +@Module +public class SettingsModule { - @Override - protected void configure() { - bind(SettingsManager.class).to(SettingsManagerImpl.class); + @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 1015b7daf77a885a930ea0a3344c8c49d71eeeb4..68b5e01b0d1210169b749d5580f1e314ff33ab8e 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 64ed5d50538bda1d054c77ba1d897ac74aff78b4..15d13ce66fc0174e188bc0bcd7ce2386cb90ef11 100644 --- a/briar-core/src/org/briarproject/sync/SyncModule.java +++ b/briar-core/src/org/briarproject/sync/SyncModule.java @@ -1,8 +1,8 @@ package org.briarproject.sync; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - +import org.briarproject.api.crypto.CryptoComponent; +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.event.EventBus; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.sync.GroupFactory; @@ -11,22 +11,55 @@ import org.briarproject.api.sync.PacketReaderFactory; 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 java.util.concurrent.Executor; +import javax.inject.Inject; import javax.inject.Singleton; -public class SyncModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; + +@Module +public class SyncModule { + + public static class EagerSingletons { + @Inject ValidationManager validationManager; + } + + @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(); + } - @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); + @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 @Singleton + @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 949dcc516ee76cccb7ea85d2c77388fa8a59e320..4837a1b57a813175fefbd9a24b559d1ab3616efb 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/system/SystemModule.java b/briar-core/src/org/briarproject/system/SystemModule.java new file mode 100644 index 0000000000000000000000000000000000000000..eb2a0d88d28e3bb95608b0bf8794ba74e40d8b2f --- /dev/null +++ b/briar-core/src/org/briarproject/system/SystemModule.java @@ -0,0 +1,23 @@ +package org.briarproject.system; + +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; + +@Module +public class SystemModule { + @Provides + Clock provideClock() { + return new SystemClock(); + } + + @Provides + Timer provideTimer() { + return new SystemTimer(); + } + +} diff --git a/briar-core/src/org/briarproject/transport/TransportModule.java b/briar-core/src/org/briarproject/transport/TransportModule.java index 367340a4cc3113cad2bd89f133a4dd2a7f71bca2..d5819fbfcbe19f94b376f51dbac8db4fb4fd3d2b 100644 --- a/briar-core/src/org/briarproject/transport/TransportModule.java +++ b/briar-core/src/org/briarproject/transport/TransportModule.java @@ -1,25 +1,40 @@ 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; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; +import javax.inject.Inject; import javax.inject.Singleton; -public class TransportModule extends AbstractModule { +import dagger.Module; +import dagger.Provides; + +@Module +public class TransportModule { + + public static class EagerSingletons { + @Inject KeyManager keyManager; + } + + @Provides + StreamReaderFactory provideStreamReaderFactory( + StreamDecrypterFactory streamDecrypterFactory) { + return new StreamReaderFactoryImpl(streamDecrypterFactory); + } - @Override - protected void configure() { - bind(StreamReaderFactory.class).to(StreamReaderFactoryImpl.class); - bind(StreamWriterFactory.class).to(StreamWriterFactoryImpl.class); + @Provides + StreamWriterFactory provideStreamWriterFactory( + StreamEncrypterFactory streamEncrypterFactory) { + return new StreamWriterFactoryImpl(streamEncrypterFactory); } - @Provides @Singleton + @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 bf1a41d2a93463fdb52ca0e0675098125189e192..4986668b1e5f25af228994f5c0f14824c391bfaa 100644 --- a/briar-desktop/src/org/briarproject/lifecycle/DesktopLifecycleModule.java +++ b/briar-desktop/src/org/briarproject/lifecycle/DesktopLifecycleModule.java @@ -1,23 +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 com.google.inject.Singleton; +import javax.inject.Singleton; +import dagger.Module; +import dagger.Provides; + +@Module public class DesktopLifecycleModule extends LifecycleModule { - @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/plugins/DesktopPluginsModule.java b/briar-desktop/src/org/briarproject/plugins/DesktopPluginsModule.java index ff69727386264ae2c8a4c580560158a105fc7c83..6d727a6d89786c273f7ee9fd58c1abf1837bb65d 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 3ed1a7540aec56d2d27bf88bbd3ab608bc5a719e..ab811ebba86ee576691dc16c1f1083e006dc8d4c 100644 --- a/briar-desktop/src/org/briarproject/system/DesktopSystemModule.java +++ b/briar-desktop/src/org/briarproject/system/DesktopSystemModule.java @@ -1,18 +1,31 @@ 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 { +import dagger.Module; +import dagger.Provides; + +@Module +public class DesktopSystemModule { + + @Provides + Clock provideClock() { + return new SystemClock(); + } + + @Provides + Timer provideTimer() { + return new SystemTimer(); + } - 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 + SeedProvider provideSeedProvider() { + if (OsUtils.isLinux()) { + return new LinuxSeedProvider(); + } + return null; } } diff --git a/briar-tests/build.gradle b/briar-tests/build.gradle index afa7bbb2e4659437640dab09727142e93431ad72..c5ae112372d62d09b74d1e6eb28c406c1ef32bf5 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 429f6a9dee67782577937abc12b8cb6961979a90..b6659315f2ea989b092cd2aac96008d8a19e4cf2 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 a6b6a618638572d9488fbde7e051a42911b0a93f..fbf07ca0d4ff861a7de86dd0ca2fd87331305cab 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,74 @@ import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -public class TestLifecycleModule extends AbstractModule { +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class TestLifecycleModule { + + @Provides + LifecycleManager provideLifecycleManager() { + return new LifecycleManager() { + @Override + public void register(Service s) { + + } - @Override - protected void configure() { - bind(LifecycleManager.class).toInstance(new LifecycleManager() { + @Override + public void registerForShutdown(ExecutorService e) { - public void register(Service s) {} + } - public void registerForShutdown(ExecutorService e) {} + @Override + public StartResult startServices() { + return StartResult.SUCCESS; + } - public StartResult startServices() { return StartResult.SUCCESS; } + @Override + public void stopServices() { - public void stopServices() {} + } - public void waitForDatabase() throws InterruptedException {} + @Override + public void waitForDatabase() throws InterruptedException { - public void waitForStartup() throws InterruptedException {} + } - public void waitForShutdown() throws InterruptedException {} - }); - bind(ShutdownManager.class).toInstance(new ShutdownManager() { + @Override + public void waitForStartup() throws InterruptedException { + } + + @Override + public void waitForShutdown() throws InterruptedException { + + } + }; + } + + @Provides + 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 + @Singleton + Executor provideExecutor() { + return Executors.newCachedThreadPool(); } + } diff --git a/briar-tests/src/org/briarproject/TestSystemModule.java b/briar-tests/src/org/briarproject/TestSystemModule.java index 9734f533e01226083dfcdc2b4d7a707194ebc4b2..2082896a312abd7e62f3eb25612fd5ee78d98856 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; + +@Module +public class TestSystemModule { + + @Provides + Clock provideClock() { + return new SystemClock(); + } + + @Provides + Timer provideSystemTimer() { + return new SystemTimer(); + } - protected void configure() { - bind(Clock.class).to(SystemClock.class); - bind(Timer.class).to(SystemTimer.class); - bind(SeedProvider.class).to(TestSeedProvider.class); + @Provides + SeedProvider provideSeedProvider() { + return new TestSeedProvider(); } } diff --git a/build.gradle b/build.gradle index 614bca7eb459516fce2e087bb37cff0783c97a6b..ced77342bc37c91ea29a98393749e5577da03864 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 06909cf9ea1cdad2ae1bbcfdf3829c72bd9ef6f6..6de5aebc60e6dd826c77d8f3a8b8ced7eab508c7 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'