From 74159f6e71f4be8c3b200cde6bd22be8345b4d2f Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Sun, 2 Mar 2014 18:37:24 +0000
Subject: [PATCH] Check whether data has been deleted when resuming from
 recents. Bug #44.

---
 .../android/PasswordActivity.java             | 17 +++++++++++++-
 .../android/SplashScreenActivity.java         | 22 ++++++++++++++-----
 2 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/briar-android/src/org/briarproject/android/PasswordActivity.java b/briar-android/src/org/briarproject/android/PasswordActivity.java
index 64ddd1080c..22791219ca 100644
--- a/briar-android/src/org/briarproject/android/PasswordActivity.java
+++ b/briar-android/src/org/briarproject/android/PasswordActivity.java
@@ -11,6 +11,7 @@ import static android.widget.LinearLayout.VERTICAL;
 import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
 import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP;
 
+import java.io.File;
 import java.util.concurrent.Executor;
 
 import javax.inject.Inject;
@@ -24,6 +25,7 @@ import org.briarproject.api.db.DatabaseConfig;
 import org.briarproject.util.StringUtils;
 
 import roboguice.activity.RoboActivity;
+import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.text.Editable;
@@ -55,7 +57,15 @@ public class PasswordActivity extends RoboActivity {
 
 		SharedPreferences prefs = getSharedPreferences("db", MODE_PRIVATE);
 		String hex = prefs.getString("key", null);
-		if(hex == null) throw new IllegalStateException();
+		if(hex == null || !databaseConfig.databaseExists()) {
+			// Storage has been deleted - clean up and return to setup
+			prefs.edit().clear().commit();
+			delete(databaseConfig.getDatabaseDirectory());
+			setResult(RESULT_CANCELED);
+			startActivity(new Intent(this, SetupActivity.class));
+			finish();
+			return;
+		}
 		final byte[] encrypted = StringUtils.fromHexString(hex);
 
 		LinearLayout layout = new LinearLayout(this);
@@ -107,6 +117,11 @@ public class PasswordActivity extends RoboActivity {
 		setContentView(layout);
 	}
 
+	private void delete(File f) {
+		if(f.isFile()) f.delete();
+		else if(f.isDirectory()) for(File child : f.listFiles()) delete(child);
+	}
+
 	private void validatePassword(final byte[] encrypted, Editable e) {
 		if(enterPassword == null || continueButton == null || progress == null)
 			return;
diff --git a/briar-android/src/org/briarproject/android/SplashScreenActivity.java b/briar-android/src/org/briarproject/android/SplashScreenActivity.java
index 9467183bd3..e8040226e0 100644
--- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java
+++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java
@@ -4,6 +4,7 @@ import static android.view.Gravity.CENTER;
 import static java.util.logging.Level.INFO;
 import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
 
+import java.io.File;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -13,8 +14,8 @@ import org.briarproject.api.db.DatabaseConfig;
 
 import roboguice.RoboGuice;
 import roboguice.activity.RoboSplashActivity;
-import android.app.Application;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.graphics.Color;
 import android.os.Bundle;
 import android.widget.ImageView;
@@ -66,11 +67,22 @@ public class SplashScreenActivity extends RoboSplashActivity {
 			if(LOG.isLoggable(INFO)) LOG.info("Expired");
 			startActivity(new Intent(this, ExpiredActivity.class));
 		} else {
-			Application app = getApplication();
-			Injector guice = RoboGuice.getBaseApplicationInjector(app);
-			if(guice.getInstance(DatabaseConfig.class).databaseExists())
+			SharedPreferences prefs = getSharedPreferences("db", MODE_PRIVATE);
+			String hex = prefs.getString("key", null);
+			Injector i = RoboGuice.getBaseApplicationInjector(getApplication());
+			DatabaseConfig databaseConfig = i.getInstance(DatabaseConfig.class);
+			if(hex != null && databaseConfig.databaseExists()) {
 				startActivity(new Intent(this, DashboardActivity.class));
-			else startActivity(new Intent(this, SetupActivity.class));
+			} else {
+				prefs.edit().clear().commit();
+				delete(databaseConfig.getDatabaseDirectory());
+				startActivity(new Intent(this, SetupActivity.class));
+			}
 		}
 	}
+
+	private void delete(File f) {
+		if(f.isFile()) f.delete();
+		else if(f.isDirectory()) for(File child : f.listFiles()) delete(child);
+	}
 }
-- 
GitLab