Merge branch '704-constructor-injection' into 'master'

Use constructor injection for controllers

Also made some listeners volatile.

This is part of #704 - if I don't find any other classes that need constructor injection I'll close the ticket.

See merge request !351
This commit is contained in:
akwizgran
2016-10-12 16:02:53 +00:00
12 changed files with 141 additions and 102 deletions

View File

@@ -1,7 +1,6 @@
package org.briarproject.android; package org.briarproject.android;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import org.briarproject.android.blogs.BlogController; import org.briarproject.android.blogs.BlogController;
@@ -28,6 +27,7 @@ import org.briarproject.android.privategroup.list.GroupListControllerImpl;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import static android.content.Context.MODE_PRIVATE;
import static org.briarproject.android.BriarService.BriarServiceConnection; import static org.briarproject.android.BriarService.BriarServiceConnection;
@Module @Module
@@ -54,36 +54,36 @@ public class ActivityModule {
@ActivityScope @ActivityScope
@Provides @Provides
SetupController provideSetupController( SetupController provideSetupController(
SetupControllerImpl setupControllerImpl) { SetupControllerImpl setupController) {
return setupControllerImpl; return setupController;
} }
@ActivityScope @ActivityScope
@Provides @Provides
ConfigController provideConfigController( ConfigController provideConfigController(
ConfigControllerImpl configControllerImpl) { ConfigControllerImpl configController) {
return configControllerImpl; return configController;
} }
@ActivityScope @ActivityScope
@Provides @Provides
SharedPreferences provideSharedPreferences(Activity activity) { SharedPreferences provideSharedPreferences(Activity activity) {
return activity.getSharedPreferences("db", Context.MODE_PRIVATE); return activity.getSharedPreferences("db", MODE_PRIVATE);
} }
@ActivityScope @ActivityScope
@Provides @Provides
PasswordController providePasswordController( PasswordController providePasswordController(
PasswordControllerImpl passwordControllerImpl) { PasswordControllerImpl passwordController) {
return passwordControllerImpl; return passwordController;
} }
@ActivityScope @ActivityScope
@Provides @Provides
protected BriarController provideBriarController( protected BriarController provideBriarController(
BriarControllerImpl briarControllerImpl) { BriarControllerImpl briarController) {
activity.addLifecycleController(briarControllerImpl); activity.addLifecycleController(briarController);
return briarControllerImpl; return briarController;
} }
@ActivityScope @ActivityScope

View File

@@ -10,6 +10,7 @@ import org.briarproject.api.blogs.Blog;
import org.briarproject.api.blogs.BlogCommentHeader; import org.briarproject.api.blogs.BlogCommentHeader;
import org.briarproject.api.blogs.BlogManager; import org.briarproject.api.blogs.BlogManager;
import org.briarproject.api.blogs.BlogPostHeader; import org.briarproject.api.blogs.BlogPostHeader;
import org.briarproject.api.db.DatabaseExecutor;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.event.BlogPostAddedEvent; import org.briarproject.api.event.BlogPostAddedEvent;
import org.briarproject.api.event.Event; 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.event.EventListener;
import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.IdentityManager;
import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.identity.LocalAuthor;
import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageId;
@@ -24,10 +26,9 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.inject.Inject;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
@@ -37,15 +38,10 @@ abstract class BaseControllerImpl extends DbControllerImpl
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(BaseControllerImpl.class.getName()); Logger.getLogger(BaseControllerImpl.class.getName());
@Inject protected final EventBus eventBus;
EventBus eventBus; protected final AndroidNotificationManager notificationManager;
@Inject protected final IdentityManager identityManager;
AndroidNotificationManager notificationManager; protected final BlogManager blogManager;
@Inject
IdentityManager identityManager;
@Inject
volatile BlogManager blogManager;
private final Map<MessageId, String> bodyCache = new ConcurrentHashMap<>(); private final Map<MessageId, String> bodyCache = new ConcurrentHashMap<>();
private final Map<MessageId, BlogPostHeader> headerCache = private final Map<MessageId, BlogPostHeader> headerCache =
@@ -53,6 +49,17 @@ abstract class BaseControllerImpl extends DbControllerImpl
protected volatile OnBlogPostAddedListener listener; 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 @Override
@CallSuper @CallSuper
public void onStart() { public void onStart() {

View File

@@ -2,19 +2,26 @@ package org.briarproject.android.blogs;
import android.app.Activity; import android.app.Activity;
import org.briarproject.android.api.AndroidNotificationManager;
import org.briarproject.android.controller.ActivityLifecycleController; import org.briarproject.android.controller.ActivityLifecycleController;
import org.briarproject.android.controller.handler.ResultExceptionHandler; import org.briarproject.android.controller.handler.ResultExceptionHandler;
import org.briarproject.api.blogs.Blog; 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.DbException;
import org.briarproject.api.event.BlogPostAddedEvent; import org.briarproject.api.event.BlogPostAddedEvent;
import org.briarproject.api.event.Event; import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener; import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.GroupRemovedEvent; import org.briarproject.api.event.GroupRemovedEvent;
import org.briarproject.api.identity.IdentityManager;
import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.identity.LocalAuthor;
import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageId;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.inject.Inject; import javax.inject.Inject;
@@ -30,7 +37,12 @@ public class BlogControllerImpl extends BaseControllerImpl
private volatile GroupId groupId = null; private volatile GroupId groupId = null;
@Inject @Inject
BlogControllerImpl() { BlogControllerImpl(@DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager, EventBus eventBus,
AndroidNotificationManager notificationManager,
IdentityManager identityManager, BlogManager blogManager) {
super(dbExecutor, lifecycleManager, eventBus, notificationManager,
identityManager, blogManager);
} }
@Override @Override

View File

@@ -1,15 +1,22 @@
package org.briarproject.android.blogs; package org.briarproject.android.blogs;
import org.briarproject.android.api.AndroidNotificationManager;
import org.briarproject.android.controller.handler.ResultExceptionHandler; import org.briarproject.android.controller.handler.ResultExceptionHandler;
import org.briarproject.android.controller.handler.ResultHandler; import org.briarproject.android.controller.handler.ResultHandler;
import org.briarproject.api.blogs.Blog; 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.DbException;
import org.briarproject.api.db.NoSuchGroupException; import org.briarproject.api.db.NoSuchGroupException;
import org.briarproject.api.db.NoSuchMessageException; import org.briarproject.api.db.NoSuchMessageException;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.identity.Author; 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.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.inject.Inject; import javax.inject.Inject;
@@ -24,7 +31,12 @@ public class FeedControllerImpl extends BaseControllerImpl
Logger.getLogger(FeedControllerImpl.class.getName()); Logger.getLogger(FeedControllerImpl.class.getName());
@Inject @Inject
FeedControllerImpl() { FeedControllerImpl(@DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager, EventBus eventBus,
AndroidNotificationManager notificationManager,
IdentityManager identityManager, BlogManager blogManager) {
super(dbExecutor, lifecycleManager, eventBus, notificationManager,
identityManager, blogManager);
} }
@Override @Override

View File

@@ -6,6 +6,8 @@ public interface ConfigController {
String getEncryptedDatabaseKey(); String getEncryptedDatabaseKey();
void setEncryptedDatabaseKey(String hex);
void deleteAccount(Context ctx); void deleteAccount(Context ctx);
boolean accountExists(); boolean accountExists();

View File

@@ -12,13 +12,14 @@ public class ConfigControllerImpl implements ConfigController {
private static final String PREF_DB_KEY = "key"; private static final String PREF_DB_KEY = "key";
@Inject private final SharedPreferences briarPrefs;
protected SharedPreferences briarPrefs; protected final DatabaseConfig databaseConfig;
@Inject
protected volatile DatabaseConfig databaseConfig;
@Inject @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); 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 @Override
public void deleteAccount(Context ctx) { public void deleteAccount(Context ctx) {
SharedPreferences.Editor editor = briarPrefs.edit(); SharedPreferences.Editor editor = briarPrefs.edit();

View File

@@ -13,16 +13,14 @@ public class DbControllerImpl implements DbController {
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(DbControllerImpl.class.getName()); Logger.getLogger(DbControllerImpl.class.getName());
// Fields that are accessed from background threads must be volatile private final Executor dbExecutor;
@Inject private final LifecycleManager lifecycleManager;
@DatabaseExecutor
protected volatile Executor dbExecutor;
@Inject
protected volatile LifecycleManager lifecycleManager;
@Inject @Inject
public DbControllerImpl() { public DbControllerImpl(@DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager) {
this.dbExecutor = dbExecutor;
this.lifecycleManager = lifecycleManager;
} }
@Override @Override

View File

@@ -5,6 +5,7 @@ import android.app.Activity;
import org.briarproject.android.api.ReferenceManager; import org.briarproject.android.api.ReferenceManager;
import org.briarproject.android.controller.handler.ResultHandler; import org.briarproject.android.controller.handler.ResultHandler;
import org.briarproject.api.TransportId; import org.briarproject.api.TransportId;
import org.briarproject.api.db.DatabaseExecutor;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event; import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus; 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.event.TransportEnabledEvent;
import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.IdentityManager;
import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.identity.LocalAuthor;
import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.plugins.Plugin; import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.PluginManager; import org.briarproject.api.plugins.PluginManager;
import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.inject.Inject; import javax.inject.Inject;
@@ -29,22 +32,23 @@ public class NavDrawerControllerImpl extends DbControllerImpl
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(NavDrawerControllerImpl.class.getName()); Logger.getLogger(NavDrawerControllerImpl.class.getName());
@Inject private final ReferenceManager referenceManager;
ReferenceManager referenceManager; private final PluginManager pluginManager;
@Inject private final EventBus eventBus;
PluginManager pluginManager; private final IdentityManager identityManager;
@Inject
EventBus eventBus;
// Fields that are accessed from background threads must be volatile private volatile TransportStateListener listener;
@Inject
protected volatile IdentityManager identityManager;
private TransportStateListener listener;
@Inject @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 @Override

View File

@@ -1,13 +1,12 @@
package org.briarproject.android.controller; package org.briarproject.android.controller;
import android.app.Activity;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import org.briarproject.android.controller.handler.ResultHandler; import org.briarproject.android.controller.handler.ResultHandler;
import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.CryptoComponent;
import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.crypto.CryptoExecutor;
import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.crypto.SecretKey;
import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.db.DatabaseConfig;
import org.briarproject.util.StringUtils; import org.briarproject.util.StringUtils;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@@ -23,21 +22,16 @@ public class PasswordControllerImpl extends ConfigControllerImpl
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(PasswordControllerImpl.class.getName()); Logger.getLogger(PasswordControllerImpl.class.getName());
private final static String PREF_DB_KEY = "key"; protected final Executor cryptoExecutor;
protected final CryptoComponent crypto;
@Inject @Inject
@CryptoExecutor PasswordControllerImpl(SharedPreferences briarPrefs,
protected Executor cryptoExecutor; DatabaseConfig databaseConfig,
@Inject @CryptoExecutor Executor cryptoExecutor, CryptoComponent crypto) {
protected Activity activity; super(briarPrefs, databaseConfig);
this.cryptoExecutor = cryptoExecutor;
// Fields that are accessed from background threads must be volatile this.crypto = crypto;
@Inject
protected CryptoComponent crypto;
@Inject
public PasswordControllerImpl() {
} }
@Override @Override
@@ -71,7 +65,7 @@ public class PasswordControllerImpl extends ConfigControllerImpl
} else { } else {
String hex = String hex =
encryptDatabaseKey(new SecretKey(key), newPassword); encryptDatabaseKey(new SecretKey(key), newPassword);
storeEncryptedDatabaseKey(hex); setEncryptedDatabaseKey(hex);
resultHandler.onResult(true); resultHandler.onResult(true);
} }
} }
@@ -94,10 +88,4 @@ public class PasswordControllerImpl extends ConfigControllerImpl
LOG.info("Key derivation took " + duration + " ms"); LOG.info("Key derivation took " + duration + " ms");
return StringUtils.toHexString(encrypted); return StringUtils.toHexString(encrypted);
} }
void storeEncryptedDatabaseKey(String hex) {
SharedPreferences.Editor editor = briarPrefs.edit();
editor.putString(PREF_DB_KEY, hex);
editor.apply();
}
} }

View File

@@ -1,6 +1,5 @@
package org.briarproject.android.controller; package org.briarproject.android.controller;
import android.app.Activity;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import org.briarproject.android.api.ReferenceManager; 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.db.DatabaseConfig;
import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.identity.AuthorFactory;
import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.identity.LocalAuthor;
import org.briarproject.util.StringUtils;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -28,17 +26,20 @@ public class SetupControllerImpl extends PasswordControllerImpl
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(SetupControllerImpl.class.getName()); Logger.getLogger(SetupControllerImpl.class.getName());
@Inject private final PasswordStrengthEstimator strengthEstimator;
protected PasswordStrengthEstimator strengthEstimator; private final AuthorFactory authorFactory;
private final ReferenceManager referenceManager;
// Fields that are accessed from background threads must be volatile
@Inject
protected volatile AuthorFactory authorFactory;
@Inject
protected volatile ReferenceManager referenceManager;
@Inject @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(); SecretKey key = crypto.generateSecretKey();
databaseConfig.setEncryptionKey(key); databaseConfig.setEncryptionKey(key);
String hex = encryptDatabaseKey(key, password); String hex = encryptDatabaseKey(key, password);
storeEncryptedDatabaseKey(hex); setEncryptedDatabaseKey(hex);
LocalAuthor localAuthor = createLocalAuthor(nickname); LocalAuthor localAuthor = createLocalAuthor(nickname);
long handle = referenceManager.putReference(localAuthor, long handle = referenceManager.putReference(localAuthor,
LocalAuthor.class); LocalAuthor.class);

View File

@@ -11,6 +11,7 @@ import org.briarproject.api.crypto.CryptoComponent;
import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.crypto.CryptoExecutor;
import org.briarproject.api.crypto.KeyParser; import org.briarproject.api.crypto.KeyParser;
import org.briarproject.api.crypto.PrivateKey; import org.briarproject.api.crypto.PrivateKey;
import org.briarproject.api.db.DatabaseExecutor;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event; import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus; 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.forum.ForumPostHeader;
import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.IdentityManager;
import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.identity.LocalAuthor;
import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageId;
import org.briarproject.util.StringUtils; import org.briarproject.util.StringUtils;
@@ -51,31 +53,34 @@ public class ForumControllerImpl extends DbControllerImpl
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(ForumControllerImpl.class.getName()); Logger.getLogger(ForumControllerImpl.class.getName());
@Inject private final Executor cryptoExecutor;
@CryptoExecutor private final ForumPostFactory forumPostFactory;
Executor cryptoExecutor; private final CryptoComponent crypto;
@Inject private final ForumManager forumManager;
volatile ForumPostFactory forumPostFactory; private final EventBus eventBus;
@Inject private final IdentityManager identityManager;
volatile CryptoComponent crypto;
@Inject
volatile ForumManager forumManager;
@Inject
volatile EventBus eventBus;
@Inject
volatile IdentityManager identityManager;
private final Map<MessageId, byte[]> bodyCache = new ConcurrentHashMap<>(); private final Map<MessageId, byte[]> bodyCache = new ConcurrentHashMap<>();
private final AtomicLong newestTimeStamp = new AtomicLong(); private final AtomicLong newestTimeStamp = new AtomicLong();
private volatile LocalAuthor localAuthor = null; private volatile LocalAuthor localAuthor = null;
private volatile Forum forum = null; private volatile Forum forum = null;
private volatile ForumPostListener listener;
private ForumPostListener listener;
@Inject @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 @Override

View File

@@ -19,11 +19,13 @@ public class TestForumActivity extends ForumActivity {
return forumAdapter; return forumAdapter;
} }
@Override
protected ActivityModule getActivityModule() { protected ActivityModule getActivityModule() {
return new ActivityModule(this) { return new ActivityModule(this) {
@Override @Override
protected BriarController provideBriarController( protected BriarController provideBriarController(
BriarControllerImpl briarControllerImpl) { BriarControllerImpl briarController) {
BriarController c = Mockito.mock(BriarController.class); BriarController c = Mockito.mock(BriarController.class);
Mockito.when(c.hasEncryptionKey()).thenReturn(true); Mockito.when(c.hasEncryptionKey()).thenReturn(true);
return c; return c;