diff --git a/briar-android/src/org/briarproject/android/ActivityModule.java b/briar-android/src/org/briarproject/android/ActivityModule.java index 21a7d35ef0312f13904c567ca24c88924182231f..e55a32ec9534209882f97ac8758d6ba42b100ada 100644 --- a/briar-android/src/org/briarproject/android/ActivityModule.java +++ b/briar-android/src/org/briarproject/android/ActivityModule.java @@ -1,7 +1,6 @@ package org.briarproject.android; import android.app.Activity; -import android.content.Context; import android.content.SharedPreferences; import org.briarproject.android.blogs.BlogController; @@ -26,6 +25,7 @@ import org.briarproject.android.forum.ForumControllerImpl; import dagger.Module; import dagger.Provides; +import static android.content.Context.MODE_PRIVATE; import static org.briarproject.android.BriarService.BriarServiceConnection; @Module @@ -52,36 +52,36 @@ public class ActivityModule { @ActivityScope @Provides SetupController provideSetupController( - SetupControllerImpl setupControllerImpl) { - return setupControllerImpl; + SetupControllerImpl setupController) { + return setupController; } @ActivityScope @Provides ConfigController provideConfigController( - ConfigControllerImpl configControllerImpl) { - return configControllerImpl; + ConfigControllerImpl configController) { + return configController; } @ActivityScope @Provides SharedPreferences provideSharedPreferences(Activity activity) { - return activity.getSharedPreferences("db", Context.MODE_PRIVATE); + return activity.getSharedPreferences("db", MODE_PRIVATE); } @ActivityScope @Provides PasswordController providePasswordController( - PasswordControllerImpl passwordControllerImpl) { - return passwordControllerImpl; + PasswordControllerImpl passwordController) { + return passwordController; } @ActivityScope @Provides protected BriarController provideBriarController( - BriarControllerImpl briarControllerImpl) { - activity.addLifecycleController(briarControllerImpl); - return briarControllerImpl; + BriarControllerImpl briarController) { + activity.addLifecycleController(briarController); + return briarController; } @ActivityScope diff --git a/briar-android/src/org/briarproject/android/blogs/BaseControllerImpl.java b/briar-android/src/org/briarproject/android/blogs/BaseControllerImpl.java index f624023bd320b7d36fecd9fab90018c2a721d7b4..0015bc111e22d70032ce92114a1839cac71db4b5 100644 --- a/briar-android/src/org/briarproject/android/blogs/BaseControllerImpl.java +++ b/briar-android/src/org/briarproject/android/blogs/BaseControllerImpl.java @@ -10,6 +10,7 @@ import org.briarproject.api.blogs.Blog; import org.briarproject.api.blogs.BlogCommentHeader; import org.briarproject.api.blogs.BlogManager; import org.briarproject.api.blogs.BlogPostHeader; +import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.db.DbException; import org.briarproject.api.event.BlogPostAddedEvent; import org.briarproject.api.event.Event; @@ -17,6 +18,7 @@ import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventListener; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; +import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; @@ -24,10 +26,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; 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.INFO; import static java.util.logging.Level.WARNING; @@ -37,15 +38,10 @@ abstract class BaseControllerImpl extends DbControllerImpl private static final Logger LOG = Logger.getLogger(BaseControllerImpl.class.getName()); - @Inject - EventBus eventBus; - @Inject - AndroidNotificationManager notificationManager; - @Inject - IdentityManager identityManager; - - @Inject - volatile BlogManager blogManager; + protected final EventBus eventBus; + protected final AndroidNotificationManager notificationManager; + protected final IdentityManager identityManager; + protected final BlogManager blogManager; private final Map<MessageId, String> bodyCache = new ConcurrentHashMap<>(); private final Map<MessageId, BlogPostHeader> headerCache = @@ -53,6 +49,17 @@ abstract class BaseControllerImpl extends DbControllerImpl protected volatile OnBlogPostAddedListener listener; + BaseControllerImpl(@DatabaseExecutor Executor dbExecutor, + LifecycleManager lifecycleManager, EventBus eventBus, + AndroidNotificationManager notificationManager, + IdentityManager identityManager, BlogManager blogManager) { + super(dbExecutor, lifecycleManager); + this.eventBus = eventBus; + this.notificationManager = notificationManager; + this.identityManager = identityManager; + this.blogManager = blogManager; + } + @Override @CallSuper public void onStart() { diff --git a/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java b/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java index 6dd1c6ab54d0a805585356bee90e866e0b2c4246..5394821f8751dce0fc439445c3ca645434026b56 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java @@ -2,19 +2,26 @@ package org.briarproject.android.blogs; import android.app.Activity; +import org.briarproject.android.api.AndroidNotificationManager; import org.briarproject.android.controller.ActivityLifecycleController; import org.briarproject.android.controller.handler.ResultExceptionHandler; import org.briarproject.api.blogs.Blog; +import org.briarproject.api.blogs.BlogManager; +import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.db.DbException; import org.briarproject.api.event.BlogPostAddedEvent; import org.briarproject.api.event.Event; +import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventListener; import org.briarproject.api.event.GroupRemovedEvent; +import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; +import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; import java.util.Collection; +import java.util.concurrent.Executor; import java.util.logging.Logger; import javax.inject.Inject; @@ -30,7 +37,12 @@ public class BlogControllerImpl extends BaseControllerImpl private volatile GroupId groupId = null; @Inject - BlogControllerImpl() { + BlogControllerImpl(@DatabaseExecutor Executor dbExecutor, + LifecycleManager lifecycleManager, EventBus eventBus, + AndroidNotificationManager notificationManager, + IdentityManager identityManager, BlogManager blogManager) { + super(dbExecutor, lifecycleManager, eventBus, notificationManager, + identityManager, blogManager); } @Override diff --git a/briar-android/src/org/briarproject/android/blogs/FeedControllerImpl.java b/briar-android/src/org/briarproject/android/blogs/FeedControllerImpl.java index 50074c0a7adf24bd36053d1eb7bbeeef3002b828..0d85144d8dd08e5389cfe62019216d876493fd6e 100644 --- a/briar-android/src/org/briarproject/android/blogs/FeedControllerImpl.java +++ b/briar-android/src/org/briarproject/android/blogs/FeedControllerImpl.java @@ -1,15 +1,22 @@ package org.briarproject.android.blogs; +import org.briarproject.android.api.AndroidNotificationManager; import org.briarproject.android.controller.handler.ResultExceptionHandler; import org.briarproject.android.controller.handler.ResultHandler; import org.briarproject.api.blogs.Blog; +import org.briarproject.api.blogs.BlogManager; +import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.db.DbException; import org.briarproject.api.db.NoSuchGroupException; import org.briarproject.api.db.NoSuchMessageException; +import org.briarproject.api.event.EventBus; import org.briarproject.api.identity.Author; +import org.briarproject.api.identity.IdentityManager; +import org.briarproject.api.lifecycle.LifecycleManager; import java.util.ArrayList; import java.util.Collection; +import java.util.concurrent.Executor; import java.util.logging.Logger; import javax.inject.Inject; @@ -24,7 +31,12 @@ public class FeedControllerImpl extends BaseControllerImpl Logger.getLogger(FeedControllerImpl.class.getName()); @Inject - FeedControllerImpl() { + FeedControllerImpl(@DatabaseExecutor Executor dbExecutor, + LifecycleManager lifecycleManager, EventBus eventBus, + AndroidNotificationManager notificationManager, + IdentityManager identityManager, BlogManager blogManager) { + super(dbExecutor, lifecycleManager, eventBus, notificationManager, + identityManager, blogManager); } @Override diff --git a/briar-android/src/org/briarproject/android/controller/ConfigController.java b/briar-android/src/org/briarproject/android/controller/ConfigController.java index 38ad81121b4281272362b07d6cbf834519150f25..b8b7d7d17dff300b6a8a01a8ae51f46311e7eb55 100644 --- a/briar-android/src/org/briarproject/android/controller/ConfigController.java +++ b/briar-android/src/org/briarproject/android/controller/ConfigController.java @@ -6,6 +6,8 @@ public interface ConfigController { String getEncryptedDatabaseKey(); + void setEncryptedDatabaseKey(String hex); + void deleteAccount(Context ctx); boolean accountExists(); diff --git a/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java b/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java index 1f6c88e500f822b83a8fa967c2f2e5eaabff0371..3ed26016f4e32f161bf578a9daf7ca2f1b1b6ce3 100644 --- a/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java +++ b/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java @@ -12,13 +12,14 @@ public class ConfigControllerImpl implements ConfigController { private static final String PREF_DB_KEY = "key"; - @Inject - protected SharedPreferences briarPrefs; - @Inject - protected volatile DatabaseConfig databaseConfig; + private final SharedPreferences briarPrefs; + protected final DatabaseConfig databaseConfig; @Inject - public ConfigControllerImpl() { + ConfigControllerImpl(SharedPreferences briarPrefs, + DatabaseConfig databaseConfig) { + this.briarPrefs = briarPrefs; + this.databaseConfig = databaseConfig; } @@ -27,6 +28,13 @@ public class ConfigControllerImpl implements ConfigController { return briarPrefs.getString(PREF_DB_KEY, null); } + @Override + public void setEncryptedDatabaseKey(String hex) { + SharedPreferences.Editor editor = briarPrefs.edit(); + editor.putString(PREF_DB_KEY, hex); + editor.apply(); + } + @Override public void deleteAccount(Context ctx) { SharedPreferences.Editor editor = briarPrefs.edit(); diff --git a/briar-android/src/org/briarproject/android/controller/DbControllerImpl.java b/briar-android/src/org/briarproject/android/controller/DbControllerImpl.java index 14f5d41aee85232372bddc96743962c10ad150c5..c13576819e54795b8a0606711918b16d62ac8413 100644 --- a/briar-android/src/org/briarproject/android/controller/DbControllerImpl.java +++ b/briar-android/src/org/briarproject/android/controller/DbControllerImpl.java @@ -13,16 +13,14 @@ public class DbControllerImpl implements DbController { private static final Logger LOG = Logger.getLogger(DbControllerImpl.class.getName()); - // Fields that are accessed from background threads must be volatile - @Inject - @DatabaseExecutor - protected volatile Executor dbExecutor; - @Inject - protected volatile LifecycleManager lifecycleManager; + private final Executor dbExecutor; + private final LifecycleManager lifecycleManager; @Inject - public DbControllerImpl() { - + public DbControllerImpl(@DatabaseExecutor Executor dbExecutor, + LifecycleManager lifecycleManager) { + this.dbExecutor = dbExecutor; + this.lifecycleManager = lifecycleManager; } @Override diff --git a/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java b/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java index 3cfa06d7720df6a95c74217cab5b6528dd61dd18..060f77933e3993d214d548d8b8a9810e7e0b05d9 100644 --- a/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java +++ b/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java @@ -5,6 +5,7 @@ import android.app.Activity; import org.briarproject.android.api.ReferenceManager; import org.briarproject.android.controller.handler.ResultHandler; import org.briarproject.api.TransportId; +import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.db.DbException; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; @@ -13,9 +14,11 @@ import org.briarproject.api.event.TransportDisabledEvent; import org.briarproject.api.event.TransportEnabledEvent; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; +import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.plugins.Plugin; import org.briarproject.api.plugins.PluginManager; +import java.util.concurrent.Executor; import java.util.logging.Logger; import javax.inject.Inject; @@ -29,22 +32,23 @@ public class NavDrawerControllerImpl extends DbControllerImpl private static final Logger LOG = Logger.getLogger(NavDrawerControllerImpl.class.getName()); - @Inject - ReferenceManager referenceManager; - @Inject - PluginManager pluginManager; - @Inject - EventBus eventBus; + private final ReferenceManager referenceManager; + private final PluginManager pluginManager; + private final EventBus eventBus; + private final IdentityManager identityManager; - // Fields that are accessed from background threads must be volatile - @Inject - protected volatile IdentityManager identityManager; - - private TransportStateListener listener; + private volatile TransportStateListener listener; @Inject - public NavDrawerControllerImpl() { - + NavDrawerControllerImpl(@DatabaseExecutor Executor dbExecutor, + LifecycleManager lifecycleManager, + ReferenceManager referenceManager, PluginManager pluginManager, + EventBus eventBus, IdentityManager identityManager) { + super(dbExecutor, lifecycleManager); + this.referenceManager = referenceManager; + this.pluginManager = pluginManager; + this.eventBus = eventBus; + this.identityManager = identityManager; } @Override diff --git a/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java b/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java index 23527c81fcd828a1956374c4ae906e5426e9e9ff..76768b49a7ab38c4ae017f28a270049c4df57fe5 100644 --- a/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java +++ b/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java @@ -1,13 +1,12 @@ package org.briarproject.android.controller; -import android.app.Activity; import android.content.SharedPreferences; import org.briarproject.android.controller.handler.ResultHandler; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.crypto.SecretKey; -import org.briarproject.api.identity.LocalAuthor; +import org.briarproject.api.db.DatabaseConfig; import org.briarproject.util.StringUtils; import java.util.concurrent.Executor; @@ -23,21 +22,16 @@ public class PasswordControllerImpl extends ConfigControllerImpl private static final Logger LOG = Logger.getLogger(PasswordControllerImpl.class.getName()); - private final static String PREF_DB_KEY = "key"; + protected final Executor cryptoExecutor; + protected final CryptoComponent crypto; @Inject - @CryptoExecutor - protected Executor cryptoExecutor; - @Inject - protected Activity activity; - - // Fields that are accessed from background threads must be volatile - @Inject - protected CryptoComponent crypto; - - @Inject - public PasswordControllerImpl() { - + PasswordControllerImpl(SharedPreferences briarPrefs, + DatabaseConfig databaseConfig, + @CryptoExecutor Executor cryptoExecutor, CryptoComponent crypto) { + super(briarPrefs, databaseConfig); + this.cryptoExecutor = cryptoExecutor; + this.crypto = crypto; } @Override @@ -71,7 +65,7 @@ public class PasswordControllerImpl extends ConfigControllerImpl } else { String hex = encryptDatabaseKey(new SecretKey(key), newPassword); - storeEncryptedDatabaseKey(hex); + setEncryptedDatabaseKey(hex); resultHandler.onResult(true); } } @@ -94,10 +88,4 @@ public class PasswordControllerImpl extends ConfigControllerImpl LOG.info("Key derivation took " + duration + " ms"); return StringUtils.toHexString(encrypted); } - - void storeEncryptedDatabaseKey(String hex) { - SharedPreferences.Editor editor = briarPrefs.edit(); - editor.putString(PREF_DB_KEY, hex); - editor.apply(); - } } diff --git a/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java b/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java index c194b313701ed538759f2f84d4144659edb519f8..b60d1072a81c1224e5f339997f91cadc452d90ce 100644 --- a/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java +++ b/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java @@ -1,6 +1,5 @@ package org.briarproject.android.controller; -import android.app.Activity; import android.content.SharedPreferences; import org.briarproject.android.api.ReferenceManager; @@ -13,7 +12,6 @@ import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.db.DatabaseConfig; import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.identity.LocalAuthor; -import org.briarproject.util.StringUtils; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -28,17 +26,20 @@ public class SetupControllerImpl extends PasswordControllerImpl private static final Logger LOG = Logger.getLogger(SetupControllerImpl.class.getName()); - @Inject - protected PasswordStrengthEstimator strengthEstimator; - - // Fields that are accessed from background threads must be volatile - @Inject - protected volatile AuthorFactory authorFactory; - @Inject - protected volatile ReferenceManager referenceManager; + private final PasswordStrengthEstimator strengthEstimator; + private final AuthorFactory authorFactory; + private final ReferenceManager referenceManager; @Inject - public SetupControllerImpl() { + SetupControllerImpl(SharedPreferences briarPrefs, + DatabaseConfig databaseConfig, + @CryptoExecutor Executor cryptoExecutor, CryptoComponent crypto, + PasswordStrengthEstimator strengthEstimator, + AuthorFactory authorFactory, ReferenceManager referenceManager) { + super(briarPrefs, databaseConfig, cryptoExecutor, crypto); + this.strengthEstimator = strengthEstimator; + this.authorFactory = authorFactory; + this.referenceManager = referenceManager; } @@ -69,7 +70,7 @@ public class SetupControllerImpl extends PasswordControllerImpl SecretKey key = crypto.generateSecretKey(); databaseConfig.setEncryptionKey(key); String hex = encryptDatabaseKey(key, password); - storeEncryptedDatabaseKey(hex); + setEncryptedDatabaseKey(hex); LocalAuthor localAuthor = createLocalAuthor(nickname); long handle = referenceManager.putReference(localAuthor, LocalAuthor.class); diff --git a/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java b/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java index 0a1cb23a39850ae7529f650c03a6fc447b68b0b5..b6a8ddce527efa65d6ff3585fb59e1716b8e5ef8 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java +++ b/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java @@ -11,6 +11,7 @@ import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.crypto.KeyParser; import org.briarproject.api.crypto.PrivateKey; +import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.db.DbException; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; @@ -24,6 +25,7 @@ import org.briarproject.api.forum.ForumPostFactory; import org.briarproject.api.forum.ForumPostHeader; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; +import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; import org.briarproject.util.StringUtils; @@ -51,31 +53,34 @@ public class ForumControllerImpl extends DbControllerImpl private static final Logger LOG = Logger.getLogger(ForumControllerImpl.class.getName()); - @Inject - @CryptoExecutor - Executor cryptoExecutor; - @Inject - volatile ForumPostFactory forumPostFactory; - @Inject - volatile CryptoComponent crypto; - @Inject - volatile ForumManager forumManager; - @Inject - volatile EventBus eventBus; - @Inject - volatile IdentityManager identityManager; + private final Executor cryptoExecutor; + private final ForumPostFactory forumPostFactory; + private final CryptoComponent crypto; + private final ForumManager forumManager; + private final EventBus eventBus; + private final IdentityManager identityManager; private final Map<MessageId, byte[]> bodyCache = new ConcurrentHashMap<>(); private final AtomicLong newestTimeStamp = new AtomicLong(); private volatile LocalAuthor localAuthor = null; private volatile Forum forum = null; - - private ForumPostListener listener; + private volatile ForumPostListener listener; @Inject - ForumControllerImpl() { - + ForumControllerImpl(@DatabaseExecutor Executor dbExecutor, + LifecycleManager lifecycleManager, + @CryptoExecutor Executor cryptoExecutor, + ForumPostFactory forumPostFactory, CryptoComponent crypto, + ForumManager forumManager, EventBus eventBus, + IdentityManager identityManager) { + super(dbExecutor, lifecycleManager); + this.cryptoExecutor = cryptoExecutor; + this.forumPostFactory = forumPostFactory; + this.crypto = crypto; + this.forumManager = forumManager; + this.eventBus = eventBus; + this.identityManager = identityManager; } @Override diff --git a/briar-android/test/java/org/briarproject/android/forum/TestForumActivity.java b/briar-android/test/java/org/briarproject/android/forum/TestForumActivity.java index d38e5a31f6dcf6adddb943297aad79fe40cdba24..8acbf3b8df67f46659570d38ffb60ff5daf697c8 100644 --- a/briar-android/test/java/org/briarproject/android/forum/TestForumActivity.java +++ b/briar-android/test/java/org/briarproject/android/forum/TestForumActivity.java @@ -19,11 +19,13 @@ public class TestForumActivity extends ForumActivity { return forumAdapter; } + @Override protected ActivityModule getActivityModule() { return new ActivityModule(this) { + @Override protected BriarController provideBriarController( - BriarControllerImpl briarControllerImpl) { + BriarControllerImpl briarController) { BriarController c = Mockito.mock(BriarController.class); Mockito.when(c.hasEncryptionKey()).thenReturn(true); return c;