package com.schibsted.spain.barista.cleardata;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.support.annotation.VisibleForTesting;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class DatabaseOperations {
private static final String[] UNWANTED_FILENAME_SUFFIXES = new String[] {
"-journal",
"-shm",
"-uid",
"-wal"
};
static void clearAllDatabases(Context appContext) {
for (File file : getDatabaseFiles(appContext)) {
clearDatabase(file);
}
}
private static void clearDatabase(File databaseFile) {
SQLiteDatabase database = openDatabase(databaseFile);
try {
List<String> tables = getTableNames(database);
for (String table : tables) {
deleteTableContent(database, table);
}
} finally {
database.close();
}
}
private static List<File> getDatabaseFiles(Context context) {
List<File> allDatabaseFiles = new ArrayList<>();
for (String databaseName : context.databaseList()) {
allDatabaseFiles.add(context.getDatabasePath(databaseName));
}
return filterUnwantedDatabaseFiles(allDatabaseFiles);
}
@VisibleForTesting
static List<File> filterUnwantedDatabaseFiles(List<File> allDatabaseFiles) {
List<File> filteredList = new ArrayList<>();
for (File databaseFile : allDatabaseFiles) {
if (!hasUnwantedSuffix(databaseFile)) {
filteredList.add(databaseFile);
}
}
return filteredList;
}
private static boolean hasUnwantedSuffix(File databaseFile) {
String databaseName = databaseFile.getPath();
for (String suffix : UNWANTED_FILENAME_SUFFIXES) {
if (databaseName.endsWith(suffix)) {
return true;
}
}
return false;
}
private static SQLiteDatabase openDatabase(File databaseFile) {
return SQLiteDatabase.openDatabase(
databaseFile.getAbsolutePath(),
null /* cursorFactory */,
0 /* flags */);
}
private static List<String> getTableNames(SQLiteDatabase database) throws SQLiteException {
Cursor cursor = database.rawQuery("SELECT name FROM sqlite_master WHERE type IN (?, ?)", new String[] { "table", "view" });
try {
List<String> tableNames = new ArrayList<>();
while (cursor.moveToNext()) {
tableNames.add(cursor.getString(0));
}
return tableNames;
} finally {
cursor.close();
}
}
private static void deleteTableContent(SQLiteDatabase database, String table) {
database.delete(table, null, null);
}
}