Merge branch '386-rotate-crash' into 'master'

Rotate crash fix

The problem was that two controllers were trying to unbind the Briar service where of course only one was needed.

I did the following

* Restructured the relevant Controllers
* Made a more permanent solution so that the last fragment will always be reloaded on config changes and Activity restarts.

Closes #386

See merge request !183
This commit is contained in:
akwizgran
2016-05-12 17:30:55 +00:00
9 changed files with 105 additions and 54 deletions

View File

@@ -10,6 +10,8 @@ import org.briarproject.android.controller.BriarController;
import org.briarproject.android.controller.BriarControllerImpl;
import org.briarproject.android.controller.ConfigController;
import org.briarproject.android.controller.ConfigControllerImpl;
import org.briarproject.android.controller.DbController;
import org.briarproject.android.controller.DbControllerImpl;
import org.briarproject.android.controller.NavDrawerController;
import org.briarproject.android.controller.NavDrawerControllerImpl;
import org.briarproject.android.controller.PasswordController;
@@ -89,6 +91,13 @@ public class ActivityModule {
return briarControllerImpl;
}
@ActivityScope
@Provides
protected DbController provideDBController(
DbControllerImpl dbController) {
return dbController;
}
@ActivityScope
@Provides
protected NavDrawerController provideNavDrawerController(

View File

@@ -5,6 +5,7 @@ import android.content.Intent;
import android.os.Build;
import org.briarproject.android.controller.BriarController;
import org.briarproject.android.controller.DbController;
import org.briarproject.android.controller.handler.UiResultHandler;
import org.briarproject.android.panic.ExitActivity;
@@ -33,6 +34,9 @@ public abstract class BriarActivity extends BaseActivity {
@Inject
protected BriarController briarController;
// TODO remove this when the deprecated method runOnDbThread is removed
@Inject
protected DbController dbController;
@Override
protected void onActivityResult(int request, int result, Intent data) {
@@ -87,7 +91,7 @@ public abstract class BriarActivity extends BaseActivity {
@Deprecated
public void runOnDbThread(Runnable task) {
briarController.runOnDbThread(task);
dbController.runOnDbThread(task);
}
@Deprecated

View File

@@ -45,6 +45,8 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
public static final String INTENT_CONTACTS = "intent_contacts";
public static final String INTENT_FORUMS = "intent_forums";
private static final String KEY_CURRENT_FRAGMENT_ID = "key_current_id";
private static final Logger LOG =
Logger.getLogger(NavDrawerActivity.class.getName());
@@ -60,18 +62,18 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
private List<Transport> transports;
private BaseAdapter transportsAdapter;
private int currentFragmentId = R.id.nav_btn_contacts;
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (!isStartupFailed(intent)) {
checkAuthorHandle(intent);
clearBackStack();
if (intent.getBooleanExtra(INTENT_FORUMS, false))
startFragment(activityComponent.newForumListFragment());
else if (intent.getBooleanExtra(INTENT_CONTACTS, false))
startFragment(activityComponent.newContactListFragment());
}
exitIfStartupFailed(intent);
checkAuthorHandle(intent);
clearBackStack();
if (intent.getBooleanExtra(INTENT_FORUMS, false))
startFragment(activityComponent.newForumListFragment());
else if (intent.getBooleanExtra(INTENT_CONTACTS, false))
startFragment(activityComponent.newContactListFragment());
}
@Override
@@ -83,10 +85,7 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
if (isStartupFailed(getIntent()))
return;
exitIfStartupFailed(getIntent());
setContentView(R.layout.activity_nav_drawer);
toolbar = (Toolbar) findViewById(R.id.toolbar);
@@ -103,8 +102,12 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
R.string.nav_drawer_open_description,
R.string.nav_drawer_close_description);
drawerLayout.setDrawerListener(drawerToggle);
if (state == null)
if (state == null) {
startFragment(activityComponent.newContactListFragment());
} else {
currentFragmentId = state.getInt(KEY_CURRENT_FRAGMENT_ID);
loadCurrentFragment();
}
checkAuthorHandle(getIntent());
initializeTransports(getLayoutInflater());
@@ -113,6 +116,12 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
welcomeMessageCheck();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_CURRENT_FRAGMENT_ID, currentFragmentId);
}
private void welcomeMessageCheck() {
SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
if (!prefs.getBoolean(PREF_SEEN_WELCOME_MESSAGE, false)) {
@@ -140,14 +149,12 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
}
}
private boolean isStartupFailed(Intent intent) {
private void exitIfStartupFailed(Intent intent) {
if (intent.getBooleanExtra(KEY_STARTUP_FAILED, false)) {
finish();
LOG.info("Exiting");
System.exit(0);
return true;
}
return false;
}
private void storeLocalAuthor(LocalAuthor a) {
@@ -159,10 +166,8 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
});
}
public void onNavigationClick(View view) {
drawerLayout.closeDrawer(START);
clearBackStack();
switch (view.getId()) {
private void loadCurrentFragment() {
switch (currentFragmentId) {
case R.id.nav_btn_contacts:
startFragment(activityComponent.newContactListFragment());
break;
@@ -178,6 +183,13 @@ public class NavDrawerActivity extends BriarFragmentActivity implements
}
}
public void onNavigationClick(View view) {
drawerLayout.closeDrawer(START);
clearBackStack();
currentFragmentId = view.getId();
loadCurrentFragment();
}
@Override
public void onBackPressed() {

View File

@@ -4,8 +4,6 @@ import org.briarproject.android.controller.handler.ResultHandler;
public interface BriarController extends ActivityLifecycleController {
void runOnDbThread(final Runnable task);
void startAndBindService();
boolean hasEncryptionKey();

View File

@@ -9,10 +9,7 @@ import org.briarproject.android.BriarService;
import org.briarproject.android.BriarService.BriarServiceConnection;
import org.briarproject.android.controller.handler.ResultHandler;
import org.briarproject.api.db.DatabaseConfig;
import org.briarproject.api.db.DatabaseExecutor;
import org.briarproject.api.lifecycle.LifecycleManager;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import javax.inject.Inject;
@@ -29,13 +26,6 @@ public class BriarControllerImpl implements BriarController {
@Inject
protected Activity activity;
// Fields that are accessed from background threads must be volatile
@Inject
@DatabaseExecutor
protected volatile Executor dbExecutor;
@Inject
protected volatile LifecycleManager lifecycleManager;
private boolean bound = false;
@Inject
@@ -100,23 +90,8 @@ public class BriarControllerImpl implements BriarController {
}.start();
}
private void unbindService() {
protected void unbindService() {
if (bound) activity.unbindService(serviceConnection);
}
@Override
public void runOnDbThread(final Runnable task) {
dbExecutor.execute(new Runnable() {
@Override
public void run() {
try {
lifecycleManager.waitForDatabase();
task.run();
} catch (InterruptedException e) {
LOG.warning("Interrupted while waiting for database");
Thread.currentThread().interrupt();
}
}
});
}
}

View File

@@ -0,0 +1,6 @@
package org.briarproject.android.controller;
public interface DbController {
void runOnDbThread(Runnable task);
}

View File

@@ -0,0 +1,43 @@
package org.briarproject.android.controller;
import org.briarproject.api.db.DatabaseExecutor;
import org.briarproject.api.lifecycle.LifecycleManager;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import javax.inject.Inject;
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;
@Inject
public DbControllerImpl() {
}
@Override
public void runOnDbThread(final Runnable task) {
dbExecutor.execute(new Runnable() {
@Override
public void run() {
try {
lifecycleManager.waitForDatabase();
task.run();
} catch (InterruptedException e) {
LOG.warning("Interrupted while waiting for database");
Thread.currentThread().interrupt();
}
}
});
}
}

View File

@@ -4,7 +4,7 @@ import org.briarproject.android.controller.handler.UiResultHandler;
import org.briarproject.api.TransportId;
import org.briarproject.api.identity.LocalAuthor;
public interface NavDrawerController extends BriarController {
public interface NavDrawerController extends ActivityLifecycleController {
void setTransportListener(TransportStateListener transportListener);

View File

@@ -23,7 +23,7 @@ import javax.inject.Inject;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING;
public class NavDrawerControllerImpl extends BriarControllerImpl
public class NavDrawerControllerImpl extends DbControllerImpl
implements NavDrawerController, EventListener {
private static final Logger LOG =
@@ -51,21 +51,24 @@ public class NavDrawerControllerImpl extends BriarControllerImpl
@Override
public void onActivityCreate() {
super.onActivityCreate();
}
@Override
public void onActivityResume() {
super.onActivityResume();
eventBus.addListener(this);
}
@Override
public void onActivityPause() {
super.onActivityPause();
eventBus.removeListener(this);
}
@Override
public void onActivityDestroy() {
}
@Override
public void eventOccurred(Event e) {
if (e instanceof TransportEnabledEvent) {
@@ -131,4 +134,5 @@ public class NavDrawerControllerImpl extends BriarControllerImpl
public LocalAuthor removeAuthorHandle(long handle) {
return referenceManager.removeReference(handle, LocalAuthor.class);
}
}