From 765340c34b14cf72b060ccfa966318afca82fc7a Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Wed, 5 Feb 2014 16:20:07 +0000
Subject: [PATCH] Clear all activities when showing startup failure
 notification.

---
 .../src/org/briarproject/android/BriarService.java   | 12 ++++++++++++
 .../org/briarproject/android/HomeScreenActivity.java | 10 ++++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java
index f84ab42477..d4829e2c7f 100644
--- a/briar-android/src/org/briarproject/android/BriarService.java
+++ b/briar-android/src/org/briarproject/android/BriarService.java
@@ -7,6 +7,7 @@ import static java.util.logging.Level.INFO;
 
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.Logger;
 
 import javax.inject.Inject;
@@ -37,6 +38,7 @@ public class BriarService extends RoboService {
 	private static final Logger LOG =
 			Logger.getLogger(BriarService.class.getName());
 
+	private final AtomicBoolean created = new AtomicBoolean(false);
 	private final Binder binder = new BriarBinder();
 
 	@Inject private DatabaseConfig databaseConfig;
@@ -52,6 +54,11 @@ public class BriarService extends RoboService {
 	public void onCreate() {
 		super.onCreate();
 		if(LOG.isLoggable(INFO)) LOG.info("Created");
+		if(created.getAndSet(true)) {
+			if(LOG.isLoggable(INFO)) LOG.info("Already created");
+			stopSelf();
+			return;
+		}
 		if(databaseConfig.getEncryptionKey() == null) {
 			if(LOG.isLoggable(INFO)) LOG.info("No database key");
 			stopSelf();
@@ -92,6 +99,11 @@ public class BriarService extends RoboService {
 		Object o = getSystemService(Context.NOTIFICATION_SERVICE);
 		NotificationManager nm = (NotificationManager) o;
 		nm.notify(FAILURE_NOTIFICATION_ID, b.build());
+		// Bring HomeScreenActivity to the front to clear all other activities
+		Intent i = new Intent(this, HomeScreenActivity.class);
+		i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP);
+		i.putExtra("briar.STARTUP_FAILED", true);
+		startActivity(i);
 	}
 
 	@Override
diff --git a/briar-android/src/org/briarproject/android/HomeScreenActivity.java b/briar-android/src/org/briarproject/android/HomeScreenActivity.java
index 6caeaf890a..21828df67c 100644
--- a/briar-android/src/org/briarproject/android/HomeScreenActivity.java
+++ b/briar-android/src/org/briarproject/android/HomeScreenActivity.java
@@ -53,8 +53,14 @@ public class HomeScreenActivity extends BriarActivity {
 	@Override
 	public void onCreate(Bundle state) {
 		super.onCreate(state);
-		long handle = getIntent().getLongExtra("briar.LOCAL_AUTHOR_HANDLE", -1);
-		if(handle == -1) {
+		Intent i = getIntent();
+		boolean failed = i.getBooleanExtra("briar.STARTUP_FAILED", false);
+		long handle = i.getLongExtra("briar.LOCAL_AUTHOR_HANDLE", -1);
+		if(failed) {
+			finish();
+			if(LOG.isLoggable(INFO)) LOG.info("Exiting");
+			System.exit(0);
+		} else if(handle == -1) {
 			// The activity has been launched before
 			showButtons();
 		} else {
-- 
GitLab