Modified the project structure, removed module extension and went instead for a non-complete core dependency graph

This commit is contained in:
Ernir Erlingsson
2016-03-13 22:31:14 +01:00
parent 7670bc48ea
commit 4da63b3800
33 changed files with 314 additions and 398 deletions

View File

@@ -1,6 +1,7 @@
package org.briarproject.android;
import org.briarproject.CoreComponent;
import org.briarproject.CoreEagerSingletons;
import org.briarproject.CoreModule;
import org.briarproject.android.contact.ContactListFragment;
import org.briarproject.android.contact.ConversationActivity;
import org.briarproject.android.forum.AvailableForumsActivity;
@@ -15,33 +16,59 @@ import org.briarproject.android.identity.CreateIdentityActivity;
import org.briarproject.android.invitation.AddContactActivity;
import org.briarproject.android.panic.PanicPreferencesActivity;
import org.briarproject.android.panic.PanicResponderActivity;
import org.briarproject.plugins.AndroidPluginsModule;
import org.briarproject.system.AndroidSystemModule;
import javax.inject.Singleton;
import dagger.Component;
@ApplicationScope
@Singleton
@Component(
dependencies = {CoreComponent.class},
modules = {AppModule.class, AndroidModule.class})
public interface AndroidComponent {
modules = {CoreModule.class, AppModule.class, AndroidModule.class,
AndroidPluginsModule.class, AndroidSystemModule.class})
public interface AndroidComponent extends CoreEagerSingletons {
void inject(SplashScreenActivity activity);
void inject(SetupActivity activity);
void inject(NavDrawerActivity activity);
void inject(PasswordActivity activity);
void inject(BriarService activity);
void inject(PanicResponderActivity activity);
void inject(PanicPreferencesActivity activity);
void inject(AddContactActivity activity);
void inject(ConversationActivity activity);
void inject(CreateIdentityActivity activity);
void inject(TestingActivity activity);
void inject(AvailableForumsActivity activity);
void inject(WriteForumPostActivity activity);
void inject(CreateForumActivity activity);
void inject(ShareForumActivity activity);
void inject(ReadForumPostActivity activity);
void inject(ForumActivity activity);
void inject(ContactListFragment fragment);
void inject(SettingsFragment fragment);
void inject(ForumListFragment fragment);
// Eager singleton load
void inject(AndroidModule.EagerSingletons init);

View File

@@ -1,11 +1,20 @@
package org.briarproject.android;
import org.briarproject.api.android.AndroidNotificationManager;
import org.briarproject.api.android.ReferenceManager;
import android.app.Application;
import android.content.Context;
import org.briarproject.android.api.AndroidNotificationManager;
import org.briarproject.android.api.ReferenceManager;
import org.briarproject.api.crypto.SecretKey;
import org.briarproject.api.db.DatabaseConfig;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.ui.UiCallback;
import java.io.File;
import javax.inject.Inject;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
@@ -18,14 +27,69 @@ public class AndroidModule {
AndroidNotificationManager androidNotificationManager;
}
private final UiCallback uiCallback;
public AndroidModule() {
// Use a dummy UI callback
uiCallback = new UiCallback() {
public int showChoice(String[] options, String... message) {
throw new UnsupportedOperationException();
}
public boolean showConfirmationMessage(String... message) {
throw new UnsupportedOperationException();
}
public void showMessage(String... message) {
throw new UnsupportedOperationException();
}
};
}
@Provides
@ApplicationScope
public UiCallback provideUICallback() {
return uiCallback;
}
@Provides
@Singleton
public DatabaseConfig provideDatabaseConfig(Application app) {
final File dir = app.getApplicationContext().getDir("db", Context.MODE_PRIVATE);
return new DatabaseConfig() {
private volatile SecretKey key = null;
public boolean databaseExists() {
return dir.isDirectory() && dir.listFiles().length > 0;
}
public File getDatabaseDirectory() {
return dir;
}
public void setEncryptionKey(SecretKey key) {
this.key = key;
}
public SecretKey getEncryptionKey() {
return key;
}
public long getMaxSize() {
return Long.MAX_VALUE;
}
};
}
@Provides
@Singleton
ReferenceManager provideReferenceManager() {
return new ReferenceManagerImpl();
}
@Provides
@ApplicationScope
@Singleton
AndroidNotificationManager provideAndroidNotificationManager(
LifecycleManager lifecycleManager, EventBus eventBus,
AndroidNotificationManagerImpl notificationManager) {

View File

@@ -12,8 +12,8 @@ import android.support.v4.app.TaskStackBuilder;
import org.briarproject.R;
import org.briarproject.android.contact.ConversationActivity;
import org.briarproject.android.forum.ForumActivity;
import org.briarproject.api.android.PlatformExecutor;
import org.briarproject.api.android.AndroidNotificationManager;
import org.briarproject.android.api.AndroidExecutor;
import org.briarproject.android.api.AndroidNotificationManager;
import org.briarproject.api.db.DatabaseExecutor;
import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event;
@@ -65,7 +65,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
private final SettingsManager settingsManager;
private final MessagingManager messagingManager;
private final ForumManager forumManager;
private final PlatformExecutor platformExecutor;
private final AndroidExecutor androidExecutor;
private final Context appContext;
// The following must only be accessed on the main UI thread
@@ -82,13 +82,13 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
@Inject
public AndroidNotificationManagerImpl(@DatabaseExecutor Executor dbExecutor,
SettingsManager settingsManager, MessagingManager messagingManager,
ForumManager forumManager, PlatformExecutor platformExecutor,
ForumManager forumManager, AndroidExecutor androidExecutor,
Application app) {
this.dbExecutor = dbExecutor;
this.settingsManager = settingsManager;
this.messagingManager = messagingManager;
this.forumManager = forumManager;
this.platformExecutor = platformExecutor;
this.androidExecutor = androidExecutor;
appContext = app.getApplicationContext();
}
@@ -118,7 +118,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
}
private void clearNotifications() {
platformExecutor.execute(new Runnable() {
androidExecutor.execute(new Runnable() {
public void run() {
clearPrivateMessageNotification();
clearForumPostNotification();
@@ -155,7 +155,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
}
public void showPrivateMessageNotification(final GroupId g) {
platformExecutor.execute(new Runnable() {
androidExecutor.execute(new Runnable() {
public void run() {
Integer count = contactCounts.get(g);
if (count == null) contactCounts.put(g, 1);
@@ -168,7 +168,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
}
public void clearPrivateMessageNotification(final GroupId g) {
platformExecutor.execute(new Runnable() {
androidExecutor.execute(new Runnable() {
public void run() {
Integer count = contactCounts.remove(g);
if (count == null) return; // Already cleared
@@ -239,7 +239,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
}
public void showForumPostNotification(final GroupId g) {
platformExecutor.execute(new Runnable() {
androidExecutor.execute(new Runnable() {
public void run() {
Integer count = forumCounts.get(g);
if (count == null) forumCounts.put(g, 1);
@@ -252,7 +252,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
}
public void clearForumPostNotification(final GroupId g) {
platformExecutor.execute(new Runnable() {
androidExecutor.execute(new Runnable() {
public void run() {
Integer count = forumCounts.remove(g);
if (count == null) return; // Already cleared
@@ -311,7 +311,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
}
public void blockNotification(final GroupId g) {
platformExecutor.execute(new Runnable() {
androidExecutor.execute(new Runnable() {
public void run() {
visibleGroup = g;
}
@@ -319,7 +319,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
}
public void unblockNotification(final GroupId g) {
platformExecutor.execute(new Runnable() {
androidExecutor.execute(new Runnable() {
public void run() {
if (g.equals(visibleGroup)) visibleGroup = null;
}

View File

@@ -2,6 +2,8 @@ package org.briarproject.android;
import android.app.Application;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
@@ -15,7 +17,7 @@ public class AppModule {
}
@Provides
@ApplicationScope
@Singleton
Application providesApplication() {
return application;
}

View File

@@ -1,11 +0,0 @@
package org.briarproject.android;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.inject.Scope;
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ApplicationScope {
}

View File

@@ -6,12 +6,7 @@ import java.util.logging.Logger;
import android.app.Application;
import android.content.Context;
import org.briarproject.CoreComponent;
import org.briarproject.CoreEagerSingletons;
import org.briarproject.DaggerCoreComponent;
import org.briarproject.plugins.PluginsModuleExtension;
import org.briarproject.system.PlatformModuleExtension;
import org.briarproject.system.SystemModuleExtension;
import org.briarproject.CoreModule;
public class BriarApplication extends Application {
@@ -30,20 +25,14 @@ public class BriarApplication extends Application {
CrashHandler newHandler = new CrashHandler(ctx, oldHandler);
Thread.setDefaultUncaughtExceptionHandler(newHandler);
CoreComponent coreComponent = DaggerCoreComponent.builder()
.systemModule(new SystemModuleExtension(this))
.platformModule(new PlatformModuleExtension(this))
.pluginsModule(new PluginsModuleExtension(this))
.build();
applicationComponent = DaggerAndroidComponent.builder()
.appModule(new AppModule(this))
.coreComponent(coreComponent)
.androidModule(new AndroidModule())
.build();
// We need to load the eager singletons directly after making the
// dependency graphs
CoreEagerSingletons.initEagerSingletons(coreComponent);
CoreModule.initEagerSingletons(applicationComponent);
AndroidEagerSingletons.initEagerSingletons(applicationComponent);
}

View File

@@ -12,7 +12,7 @@ import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import org.briarproject.R;
import org.briarproject.api.android.PlatformExecutor;
import org.briarproject.android.api.AndroidExecutor;
import org.briarproject.api.db.DatabaseConfig;
import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.lifecycle.LifecycleManager.StartResult;
@@ -48,7 +48,7 @@ public class BriarService extends Service {
// Fields that are accessed from background threads must be volatile
@Inject protected volatile LifecycleManager lifecycleManager;
@Inject protected volatile PlatformExecutor platformExecutor;
@Inject protected volatile AndroidExecutor androidExecutor;
private volatile boolean started = false;
@Override
@@ -106,7 +106,7 @@ public class BriarService extends Service {
}
private void showStartupFailureNotification(final StartResult result) {
platformExecutor.execute(new Runnable() {
androidExecutor.execute(new Runnable() {
public void run() {
NotificationCompat.Builder b =
new NotificationCompat.Builder(BriarService.this);

View File

@@ -8,7 +8,6 @@ import android.os.Bundle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
@@ -25,7 +24,7 @@ import org.briarproject.android.forum.ForumListFragment;
import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.android.util.CustomAnimations;
import org.briarproject.api.TransportId;
import org.briarproject.api.android.ReferenceManager;
import org.briarproject.android.api.ReferenceManager;
import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus;

View File

@@ -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 {

View File

@@ -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;

View File

@@ -8,11 +8,11 @@ import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy;
import android.os.StrictMode.VmPolicy;
import android.support.v7.preference.PreferenceManager;
import android.util.Log;
import android.widget.ImageView;
import android.widget.LinearLayout;
import org.briarproject.R;
import org.briarproject.android.util.AndroidUtils;
import org.briarproject.android.util.LayoutUtils;
import org.briarproject.api.db.DatabaseConfig;
import org.briarproject.util.FileUtils;
@@ -91,6 +91,7 @@ public class SplashScreenActivity extends BaseActivity {
startActivity(new Intent(this, NavDrawerActivity.class));
} else {
clearSharedPrefs();
AndroidUtils.deleteAppData(this);
FileUtils.deleteFileOrDir(
dbConfig.getDatabaseDirectory());
startActivity(new Intent(this, SetupActivity.class));

View File

@@ -0,0 +1,20 @@
package org.briarproject.android.api;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
/**
* Enables background threads to make Android API calls that must be made from
* a thread with a message queue.
*/
public interface AndroidExecutor {
/**
* Runs the given task on the main UI thread and returns a Future for
* getting the result.
*/
<V> Future<V> submit(Callable<V> c);
/** Runs the given task on the main UI thread. */
void execute(Runnable r);
}

View File

@@ -0,0 +1,19 @@
package org.briarproject.android.api;
import org.briarproject.api.sync.GroupId;
/** Manages notifications for private messages and forum posts. */
public interface AndroidNotificationManager {
void showPrivateMessageNotification(GroupId g);
void clearPrivateMessageNotification(GroupId g);
void showForumPostNotification(GroupId g);
void clearForumPostNotification(GroupId g);
void blockNotification(GroupId g);
void unblockNotification(GroupId g);
}

View File

@@ -0,0 +1,27 @@
package org.briarproject.android.api;
/**
* Manages mappings between object references and serialisable handles. This
* enables references to be passed between Android UI objects that belong to
* the same process but can only communicate via serialisation.
*/
public interface ReferenceManager {
/**
* Returns the object with the given handle, or null if no mapping exists
* for the handle.
*/
<T> T getReference(long handle, Class<T> c);
/**
* Creates a mapping between the given reference and a handle, and returns
* the handle.
*/
<T> long putReference(T reference, Class<T> c);
/**
* Removes and returns the object with the given handle, or returns null
* if no mapping exists for the handle.
*/
<T> T removeReference(long handle, Class<T> c);
}

View File

@@ -21,11 +21,10 @@ import org.briarproject.android.AndroidComponent;
import org.briarproject.android.BriarActivity;
import org.briarproject.android.util.BriarRecyclerView;
import org.briarproject.api.FormatException;
import org.briarproject.api.android.AndroidNotificationManager;
import org.briarproject.android.api.AndroidNotificationManager;
import org.briarproject.api.contact.Contact;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.contact.ContactManager;
import org.briarproject.api.crypto.CryptoComponent;
import org.briarproject.api.crypto.CryptoExecutor;
import org.briarproject.api.db.DbException;
import org.briarproject.api.db.NoSuchContactException;

View File

@@ -18,7 +18,7 @@ import org.briarproject.android.BriarActivity;
import org.briarproject.android.util.ElasticHorizontalSpace;
import org.briarproject.android.util.HorizontalBorder;
import org.briarproject.android.util.ListLoadingProgressBar;
import org.briarproject.api.android.AndroidNotificationManager;
import org.briarproject.android.api.AndroidNotificationManager;
import org.briarproject.api.db.DbException;
import org.briarproject.api.db.NoSuchGroupException;
import org.briarproject.api.db.NoSuchMessageException;

View File

@@ -7,7 +7,7 @@ import android.widget.Toast;
import org.briarproject.R;
import org.briarproject.android.AndroidComponent;
import org.briarproject.android.BriarActivity;
import org.briarproject.api.android.ReferenceManager;
import org.briarproject.android.api.ReferenceManager;
import org.briarproject.api.crypto.CryptoComponent;
import org.briarproject.api.db.DbException;
import org.briarproject.api.identity.AuthorId;

View File

@@ -9,6 +9,7 @@ import android.support.v7.preference.PreferenceManager;
import org.briarproject.android.AndroidComponent;
import org.briarproject.android.BriarActivity;
import org.briarproject.android.util.AndroidUtils;
import org.briarproject.api.db.DatabaseConfig;
import org.briarproject.util.FileUtils;
import org.iilab.IilabEngineeringRSA2048Pin;
@@ -111,9 +112,7 @@ public class PanicResponderActivity extends BriarActivity {
public void run() {
clearSharedPrefs();
// TODO somehow delete/shred the database more thoroughly
FileUtils
.deleteFileOrDir(
databaseConfig.getDatabaseDirectory());
AndroidUtils.deleteAppData(PanicResponderActivity.this);
PanicResponder.deleteAllAppData(PanicResponderActivity.this);
// nothing left to do after everything is deleted,