diff --git a/bramble-android/src/main/java/org/briarproject/bramble/account/AndroidAccountManager.java b/bramble-android/src/main/java/org/briarproject/bramble/account/AndroidAccountManager.java index d2eda64b2..8a4648bfd 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/account/AndroidAccountManager.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/account/AndroidAccountManager.java @@ -9,7 +9,6 @@ import org.briarproject.bramble.api.account.AccountManager; import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.db.DatabaseConfig; import org.briarproject.bramble.api.identity.IdentityManager; -import org.briarproject.bramble.util.IoUtils; import java.io.File; import java.util.HashSet; @@ -20,6 +19,9 @@ import javax.annotation.Nullable; import javax.inject.Inject; import static android.os.Build.VERSION.SDK_INT; +import static java.util.logging.Level.INFO; +import static org.briarproject.bramble.util.IoUtils.deleteFileOrDir; +import static org.briarproject.bramble.util.LogUtils.logFileOrDir; class AndroidAccountManager extends AccountManagerImpl implements AccountManager { @@ -41,6 +43,16 @@ class AndroidAccountManager extends AccountManagerImpl appContext = app.getApplicationContext(); } + @Override + public boolean accountExists() { + boolean exists = super.accountExists(); + if (!exists && LOG.isLoggable(INFO)) { + LOG.info("Account does not exist. Contents of account directory:"); + logFileOrDir(LOG, INFO, getDataDir()); + } + return exists; + } + // Locking: stateChangeLock @Override @Nullable @@ -74,9 +86,17 @@ class AndroidAccountManager extends AccountManagerImpl @Override public void deleteAccount() { synchronized (stateChangeLock) { + if (LOG.isLoggable(INFO)) { + LOG.info("Contents of account directory before deleting:"); + logFileOrDir(LOG, INFO, getDataDir()); + } super.deleteAccount(); SharedPreferences defaultPrefs = getDefaultSharedPreferences(); deleteAppData(prefs, defaultPrefs); + if (LOG.isLoggable(INFO)) { + LOG.info("Contents of account directory after deleting:"); + logFileOrDir(LOG, INFO, getDataDir()); + } } } @@ -94,7 +114,7 @@ class AndroidAccountManager extends AccountManagerImpl } // Delete files, except lib and shared_prefs directories Set files = new HashSet<>(); - File dataDir = new File(appContext.getApplicationInfo().dataDir); + File dataDir = getDataDir(); @Nullable File[] fileArray = dataDir.listFiles(); if (fileArray == null) { @@ -121,13 +141,17 @@ class AndroidAccountManager extends AccountManagerImpl } } for (File file : files) { - IoUtils.deleteFileOrDir(file); + deleteFileOrDir(file); } // Recreate the cache dir as some OpenGL drivers expect it to exist if (!new File(dataDir, "cache").mkdirs()) LOG.warning("Could not recreate cache dir"); } + private File getDataDir() { + return new File(appContext.getApplicationInfo().dataDir); + } + private void addIfNotNull(Set files, @Nullable File file) { if (file != null) files.add(file); } diff --git a/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java b/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java index cdda0ca04..89065b89e 100644 --- a/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java +++ b/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java @@ -128,7 +128,7 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase { will(returnValue(editor)); oneOf(editor).commit(); will(returnValue(true)); - oneOf(app).getApplicationInfo(); + allowing(app).getApplicationInfo(); will(returnValue(applicationInfo)); oneOf(app).getFilesDir(); will(returnValue(filesDir)); diff --git a/bramble-api/src/main/java/org/briarproject/bramble/util/LogUtils.java b/bramble-api/src/main/java/org/briarproject/bramble/util/LogUtils.java index bc1a1a217..c98ef09f6 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/util/LogUtils.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/util/LogUtils.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.util; +import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; @@ -19,6 +20,7 @@ public class LogUtils { /** * Logs the duration of a task. + * * @param logger the logger to use * @param task a description of the task * @param start the start time of the task, as returned by {@link #now()} @@ -33,4 +35,26 @@ public class LogUtils { public static void logException(Logger logger, Level level, Throwable t) { if (logger.isLoggable(level)) logger.log(level, t.toString(), t); } + + public static void logFileOrDir(Logger logger, Level level, File f) { + if (logger.isLoggable(level)) { + if (f.isFile()) { + logWithType(logger, level, f, "F"); + } else if (f.isDirectory()) { + logWithType(logger, level, f, "D"); + File[] children = f.listFiles(); + if (children != null) { + for (File child : children) + logFileOrDir(logger, level, child); + } + } else if (f.exists()) { + logWithType(logger, level, f, "?"); + } + } + } + + private static void logWithType(Logger logger, Level level, File f, + String type) { + logger.log(level, type + " " + f.getAbsolutePath() + " " + f.length()); + } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java index 4b0c9834d..5177b163f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java @@ -20,9 +20,11 @@ import java.util.logging.Logger; import javax.annotation.Nullable; import javax.inject.Inject; +import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.db.JdbcUtils.tryToClose; +import static org.briarproject.bramble.util.LogUtils.logFileOrDir; /** * Contains all the H2-specific code for the database. @@ -61,8 +63,18 @@ class H2Database extends JdbcDatabase { public boolean open(SecretKey key, @Nullable MigrationListener listener) throws DbException { this.key = key; - boolean reopen = !config.getDatabaseDirectory().mkdirs(); + File dir = config.getDatabaseDirectory(); + if (LOG.isLoggable(INFO)) { + LOG.info("Contents of account directory before opening DB:"); + logFileOrDir(LOG, INFO, dir.getParentFile()); + } + boolean reopen = !dir.mkdirs(); + if (LOG.isLoggable(INFO)) LOG.info("Reopening DB: " + reopen); super.open("org.h2.Driver", reopen, key, listener); + if (LOG.isLoggable(INFO)) { + LOG.info("Contents of account directory after opening DB:"); + logFileOrDir(LOG, INFO, dir.getParentFile()); + } return reopen; }