mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 18:59:06 +01:00
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:
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package org.briarproject.android.controller;
|
||||
|
||||
public interface DbController {
|
||||
|
||||
void runOnDbThread(Runnable task);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user