From 9af3ce123a94bce69632cdeaaafde8780adf64a7 Mon Sep 17 00:00:00 2001
From: Ernir Erlingsson <ernir@ymirmobile.com>
Date: Tue, 8 Mar 2016 22:35:42 +0100
Subject: [PATCH] Added eager singletons and made some fixes

---
 .../android/AndroidComponent.java             |  2 ++
 .../briarproject/android/AndroidModule.java   | 27 ++++++++++++++++---
 .../android/BriarApplication.java             |  8 +++++-
 .../android/SplashScreenActivity.java         |  3 +++
 .../invitation/ChooseIdentityView.java        |  6 -----
 .../briarproject/clients/ClientsModule.java   |  4 +++
 .../briarproject/contact/ContactModule.java   |  2 ++
 .../org/briarproject/crypto/CryptoModule.java |  1 +
 .../org/briarproject/db/DatabaseModule.java   |  4 +++
 .../org/briarproject/forum/ForumModule.java   |  5 ++++
 .../briarproject/identity/IdentityModule.java |  3 +++
 .../lifecycle/LifecycleModule.java            |  1 +
 .../messaging/MessagingModule.java            |  3 +++
 .../properties/PropertiesModule.java          |  3 +++
 .../briarproject/settings/SettingsModule.java |  1 +
 .../src/org/briarproject/sync/SyncModule.java |  5 ++++
 .../transport/TransportModule.java            |  2 ++
 17 files changed, 70 insertions(+), 10 deletions(-)

diff --git a/briar-android/src/org/briarproject/android/AndroidComponent.java b/briar-android/src/org/briarproject/android/AndroidComponent.java
index caf43416ae..5be1919a35 100644
--- a/briar-android/src/org/briarproject/android/AndroidComponent.java
+++ b/briar-android/src/org/briarproject/android/AndroidComponent.java
@@ -67,5 +67,7 @@ public interface AndroidComponent {
 	void inject(ContactListFragment fragment);
 	void inject(SettingsFragment fragment);
 	void inject(ForumListFragment fragment);
+	// Eager singleton load
+	void inject(AndroidModule.EagerSingletons init);
 
 }
diff --git a/briar-android/src/org/briarproject/android/AndroidModule.java b/briar-android/src/org/briarproject/android/AndroidModule.java
index 427b884b5a..b258be889a 100644
--- a/briar-android/src/org/briarproject/android/AndroidModule.java
+++ b/briar-android/src/org/briarproject/android/AndroidModule.java
@@ -1,20 +1,24 @@
 package org.briarproject.android;
 
 import android.app.Application;
-import android.content.SharedPreferences;
-import android.support.v7.preference.PreferenceManager;
 
 import org.briarproject.api.android.AndroidExecutor;
 import org.briarproject.api.android.AndroidNotificationManager;
 import org.briarproject.api.android.ReferenceManager;
+import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.crypto.SecretKey;
 import org.briarproject.api.db.DatabaseConfig;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.lifecycle.LifecycleManager;
+import org.briarproject.api.plugins.PluginManager;
+import org.briarproject.api.properties.TransportPropertyManager;
+import org.briarproject.api.sync.ValidationManager;
+import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.ui.UiCallback;
 
 import java.io.File;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import dagger.Module;
@@ -25,6 +29,24 @@ import static android.content.Context.MODE_PRIVATE;
 @Module
 public class AndroidModule {
 
+	static class EagerSingletons {
+		// Load all relevant eager singletons and their references
+		@Inject
+		KeyManager keyManager;
+		@Inject
+		ValidationManager validationManager;
+		@Inject
+		PluginManager pluginManager;
+		@Inject
+		AndroidNotificationManager androidNotificationManager;
+		@Inject
+		TransportPropertyManager transportPropertyManager;
+	}
+
+	static void injectEager(AndroidComponent c) {
+		c.inject(new EagerSingletons());
+	}
+
 	private final UiCallback uiCallback;
 
 	public AndroidModule() {
@@ -93,7 +115,6 @@ public class AndroidModule {
 		};
 	}
 
-
 	@Provides
 	@Singleton
 	AndroidNotificationManager provideAndroidNotificationManager(
diff --git a/briar-android/src/org/briarproject/android/BriarApplication.java b/briar-android/src/org/briarproject/android/BriarApplication.java
index 1478b6e2d5..e56688e697 100644
--- a/briar-android/src/org/briarproject/android/BriarApplication.java
+++ b/briar-android/src/org/briarproject/android/BriarApplication.java
@@ -6,6 +6,8 @@ import java.util.logging.Logger;
 import android.app.Application;
 import android.content.Context;
 
+import org.briarproject.event.EventModule;
+
 public class BriarApplication extends Application {
 
 	private static final Logger LOG =
@@ -16,7 +18,7 @@ public class BriarApplication extends Application {
 	@Override
 	public void onCreate() {
 		super.onCreate();
-		LOG.info("Created");
+		LOG.info("Application Created");
 		UncaughtExceptionHandler oldHandler =
 				Thread.getDefaultUncaughtExceptionHandler();
 		Context ctx = getApplicationContext();
@@ -27,6 +29,10 @@ public class BriarApplication extends Application {
 				.appModule(new AppModule(this))
 				.androidModule(new AndroidModule())
 				.build();
+		// We need to load the eager singletons directly after making the
+		// dependency graph
+		AndroidModule.injectEager(applicationComponent);
+
 	}
 
 	public AndroidComponent getApplicationComponent() {
diff --git a/briar-android/src/org/briarproject/android/SplashScreenActivity.java b/briar-android/src/org/briarproject/android/SplashScreenActivity.java
index ef374c1130..acc0652af6 100644
--- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java
+++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java
@@ -8,6 +8,7 @@ import android.os.StrictMode;
 import android.os.StrictMode.ThreadPolicy;
 import android.os.StrictMode.VmPolicy;
 import android.support.v7.preference.PreferenceManager;
+import android.util.Log;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
@@ -38,6 +39,8 @@ public class SplashScreenActivity extends BaseActivity {
 	@Inject
 	DatabaseConfig dbConfig;
 
+
+
 	public SplashScreenActivity() {
 		Logger.getLogger("").setLevel(DEFAULT_LOG_LEVEL);
 		enableStrictMode();
diff --git a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java
index e4baf6e137..940de7e759 100644
--- a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java
+++ b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java
@@ -16,14 +16,11 @@ import org.briarproject.android.identity.CreateIdentityActivity;
 import org.briarproject.android.identity.LocalAuthorItem;
 import org.briarproject.android.identity.LocalAuthorItemComparator;
 import org.briarproject.android.identity.LocalAuthorSpinnerAdapter;
-import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.identity.AuthorId;
 import org.briarproject.api.identity.LocalAuthor;
 
 import java.util.Collection;
 
-import javax.inject.Inject;
-
 import static android.bluetooth.BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE;
 import static android.bluetooth.BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION;
 import static org.briarproject.android.identity.LocalAuthorItem.NEW;
@@ -33,7 +30,6 @@ import static org.briarproject.android.invitation.AddContactActivity.REQUEST_CRE
 class ChooseIdentityView extends AddContactView
 implements OnItemSelectedListener, OnClickListener {
 
-	@Inject protected CryptoComponent crypto;
 	private LocalAuthorSpinnerAdapter adapter = null;
 	private Spinner spinner = null;
 
@@ -44,8 +40,6 @@ implements OnItemSelectedListener, OnClickListener {
 	void populate() {
 		removeAllViews();
 		Context ctx = getContext();
-		// TODO
-//		RoboGuice.injectMembers(ctx, this);
 
 		LayoutInflater inflater = (LayoutInflater) ctx.getSystemService
 				(Context.LAYOUT_INFLATER_SERVICE);
diff --git a/briar-core/src/org/briarproject/clients/ClientsModule.java b/briar-core/src/org/briarproject/clients/ClientsModule.java
index 10bcbc3c71..055143d43b 100644
--- a/briar-core/src/org/briarproject/clients/ClientsModule.java
+++ b/briar-core/src/org/briarproject/clients/ClientsModule.java
@@ -9,6 +9,10 @@ import org.briarproject.api.data.MetadataParser;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.api.sync.MessageFactory;
+import org.briarproject.data.DataModule;
+import org.briarproject.db.DatabaseModule;
+import org.briarproject.messaging.MessagingModule;
+import org.briarproject.sync.SyncModule;
 
 import dagger.Module;
 import dagger.Provides;
diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java
index f2009be57d..e4927a74f2 100644
--- a/briar-core/src/org/briarproject/contact/ContactModule.java
+++ b/briar-core/src/org/briarproject/contact/ContactModule.java
@@ -3,6 +3,8 @@ package org.briarproject.contact;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.lifecycle.LifecycleManager;
+import org.briarproject.identity.IdentityModule;
+import org.briarproject.lifecycle.LifecycleModule;
 
 import javax.inject.Singleton;
 
diff --git a/briar-core/src/org/briarproject/crypto/CryptoModule.java b/briar-core/src/org/briarproject/crypto/CryptoModule.java
index 04e216b80b..c8b1d4845f 100644
--- a/briar-core/src/org/briarproject/crypto/CryptoModule.java
+++ b/briar-core/src/org/briarproject/crypto/CryptoModule.java
@@ -7,6 +7,7 @@ import org.briarproject.api.crypto.StreamDecrypterFactory;
 import org.briarproject.api.crypto.StreamEncrypterFactory;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.system.SeedProvider;
+import org.briarproject.lifecycle.LifecycleModule;
 
 import java.security.SecureRandom;
 import java.util.concurrent.BlockingQueue;
diff --git a/briar-core/src/org/briarproject/db/DatabaseModule.java b/briar-core/src/org/briarproject/db/DatabaseModule.java
index 74512c9c0f..c177c9ae4b 100644
--- a/briar-core/src/org/briarproject/db/DatabaseModule.java
+++ b/briar-core/src/org/briarproject/db/DatabaseModule.java
@@ -7,6 +7,9 @@ import org.briarproject.api.event.EventBus;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.lifecycle.ShutdownManager;
 import org.briarproject.api.system.Clock;
+import org.briarproject.data.DataModule;
+import org.briarproject.event.EventModule;
+import org.briarproject.lifecycle.LifecycleModule;
 
 import java.security.SecureRandom;
 import java.sql.Connection;
@@ -17,6 +20,7 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.ThreadPoolExecutor;
 
+import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java
index 5712c165eb..dba71334f0 100644
--- a/briar-core/src/org/briarproject/forum/ForumModule.java
+++ b/briar-core/src/org/briarproject/forum/ForumModule.java
@@ -15,6 +15,11 @@ import org.briarproject.api.identity.Author;
 import org.briarproject.api.sync.MessageFactory;
 import org.briarproject.api.sync.ValidationManager;
 import org.briarproject.api.system.Clock;
+import org.briarproject.contact.ContactModule;
+import org.briarproject.crypto.CryptoModule;
+import org.briarproject.data.DataModule;
+import org.briarproject.db.DatabaseModule;
+import org.briarproject.sync.SyncModule;
 
 import javax.inject.Singleton;
 
diff --git a/briar-core/src/org/briarproject/identity/IdentityModule.java b/briar-core/src/org/briarproject/identity/IdentityModule.java
index 99e8eeb0f1..e270156129 100644
--- a/briar-core/src/org/briarproject/identity/IdentityModule.java
+++ b/briar-core/src/org/briarproject/identity/IdentityModule.java
@@ -9,6 +9,9 @@ import org.briarproject.api.identity.Author;
 import org.briarproject.api.identity.AuthorFactory;
 import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.system.Clock;
+import org.briarproject.crypto.CryptoModule;
+import org.briarproject.data.DataModule;
+import org.briarproject.db.DatabaseModule;
 
 import javax.inject.Singleton;
 
diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java
index 5685dd2a2d..c6218f2730 100644
--- a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java
+++ b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java
@@ -17,6 +17,7 @@ import org.briarproject.api.lifecycle.IoExecutor;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.lifecycle.ShutdownManager;
 import org.briarproject.api.system.Clock;
+import org.briarproject.event.EventModule;
 
 import dagger.Module;
 import dagger.Provides;
diff --git a/briar-core/src/org/briarproject/messaging/MessagingModule.java b/briar-core/src/org/briarproject/messaging/MessagingModule.java
index 89c748a59f..6a68b0fe1a 100644
--- a/briar-core/src/org/briarproject/messaging/MessagingModule.java
+++ b/briar-core/src/org/briarproject/messaging/MessagingModule.java
@@ -9,6 +9,9 @@ import org.briarproject.api.messaging.PrivateMessageFactory;
 import org.briarproject.api.sync.MessageFactory;
 import org.briarproject.api.sync.ValidationManager;
 import org.briarproject.api.system.Clock;
+import org.briarproject.contact.ContactModule;
+import org.briarproject.data.DataModule;
+import org.briarproject.sync.SyncModule;
 
 import javax.inject.Singleton;
 
diff --git a/briar-core/src/org/briarproject/properties/PropertiesModule.java b/briar-core/src/org/briarproject/properties/PropertiesModule.java
index 057f685ba5..15fcf56aa5 100644
--- a/briar-core/src/org/briarproject/properties/PropertiesModule.java
+++ b/briar-core/src/org/briarproject/properties/PropertiesModule.java
@@ -6,6 +6,9 @@ import org.briarproject.api.data.MetadataEncoder;
 import org.briarproject.api.properties.TransportPropertyManager;
 import org.briarproject.api.sync.ValidationManager;
 import org.briarproject.api.system.Clock;
+import org.briarproject.contact.ContactModule;
+import org.briarproject.data.DataModule;
+import org.briarproject.sync.SyncModule;
 
 import javax.inject.Singleton;
 
diff --git a/briar-core/src/org/briarproject/settings/SettingsModule.java b/briar-core/src/org/briarproject/settings/SettingsModule.java
index d8aa3b9158..b9edc99515 100644
--- a/briar-core/src/org/briarproject/settings/SettingsModule.java
+++ b/briar-core/src/org/briarproject/settings/SettingsModule.java
@@ -2,6 +2,7 @@ package org.briarproject.settings;
 
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.settings.SettingsManager;
+import org.briarproject.db.DatabaseModule;
 
 import dagger.Module;
 import dagger.Provides;
diff --git a/briar-core/src/org/briarproject/sync/SyncModule.java b/briar-core/src/org/briarproject/sync/SyncModule.java
index 654f029e6f..6c286f8af4 100644
--- a/briar-core/src/org/briarproject/sync/SyncModule.java
+++ b/briar-core/src/org/briarproject/sync/SyncModule.java
@@ -16,9 +16,14 @@ import org.briarproject.api.sync.PacketWriterFactory;
 import org.briarproject.api.sync.SyncSessionFactory;
 import org.briarproject.api.sync.ValidationManager;
 import org.briarproject.api.system.Clock;
+import org.briarproject.crypto.CryptoModule;
+import org.briarproject.db.DatabaseModule;
+import org.briarproject.event.EventModule;
+import org.briarproject.lifecycle.LifecycleModule;
 
 import java.util.concurrent.Executor;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import dagger.Module;
diff --git a/briar-core/src/org/briarproject/transport/TransportModule.java b/briar-core/src/org/briarproject/transport/TransportModule.java
index 090882d1ab..5a4ae89367 100644
--- a/briar-core/src/org/briarproject/transport/TransportModule.java
+++ b/briar-core/src/org/briarproject/transport/TransportModule.java
@@ -7,6 +7,8 @@ import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
 import org.briarproject.api.transport.StreamWriterFactory;
+import org.briarproject.event.EventModule;
+import org.briarproject.lifecycle.LifecycleModule;
 
 import javax.inject.Singleton;
 
-- 
GitLab