diff --git a/src/android/app/src/main/java/org/citra/citra_emu/model/Game.java b/src/android/app/src/main/java/org/citra/citra_emu/model/Game.java index 622f3108b..108e76965 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/model/Game.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/model/Game.java @@ -4,6 +4,9 @@ import android.content.ContentValues; import android.database.Cursor; import android.os.Environment; +import java.nio.file.Path; +import java.nio.file.Paths; + public final class Game { private static final String PATH_SCREENSHOT_FOLDER = "file://" + Environment.getExternalStorageDirectory().getPath() + "/citra-emu/ScreenShots/"; @@ -32,6 +35,11 @@ public final class Game { int country, String path, String gameId, String company) { ContentValues values = new ContentValues(); + if (gameId.isEmpty()) { + // Homebrew, etc. may not have a game ID, use filename as a unique identifier + gameId = Paths.get(path).getFileName().toString(); + } + String screenPath = PATH_SCREENSHOT_FOLDER + gameId + "/" + gameId + "-1.png"; values.put(GameDatabase.KEY_GAME_TITLE, title); diff --git a/src/android/app/src/main/java/org/citra/citra_emu/model/GameDatabase.java b/src/android/app/src/main/java/org/citra/citra_emu/model/GameDatabase.java index 0b03cea45..1f4e21b10 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/model/GameDatabase.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/model/GameDatabase.java @@ -103,6 +103,14 @@ public final class GameDatabase extends SQLiteOpenHelper { scanLibrary(database); } + public void resetDatabase(SQLiteDatabase database) { + execSqlAndLog(database, SQL_DELETE_FOLDERS); + execSqlAndLog(database, SQL_CREATE_FOLDERS); + + execSqlAndLog(database, SQL_DELETE_GAMES); + execSqlAndLog(database, SQL_CREATE_GAMES); + } + public void scanLibrary(SQLiteDatabase database) { // Before scanning known folders, go through the game table and remove any entries for which the file itself is missing. Cursor fileCursor = database.query(TABLE_NAME_GAMES, diff --git a/src/android/app/src/main/java/org/citra/citra_emu/model/GameProvider.java b/src/android/app/src/main/java/org/citra/citra_emu/model/GameProvider.java index 40b76e5c9..55d94ddb0 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/model/GameProvider.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/model/GameProvider.java @@ -16,6 +16,7 @@ import org.citra.citra_emu.utils.Log; */ public final class GameProvider extends ContentProvider { public static final String REFRESH_LIBRARY = "refresh"; + public static final String RESET_LIBRARY = "reset"; public static final String AUTHORITY = "content://" + BuildConfig.APPLICATION_ID + ".provider"; public static final Uri URI_FOLDER = @@ -23,6 +24,7 @@ public final class GameProvider extends ContentProvider { public static final Uri URI_GAME = Uri.parse(AUTHORITY + "/" + GameDatabase.TABLE_NAME_GAMES + "/"); public static final Uri URI_REFRESH = Uri.parse(AUTHORITY + "/" + REFRESH_LIBRARY + "/"); + public static final Uri URI_RESET = Uri.parse(AUTHORITY + "/" + RESET_LIBRARY + "/"); public static final String MIME_TYPE_FOLDER = "vnd.android.cursor.item/vnd.dolphin.folder"; public static final String MIME_TYPE_GAME = "vnd.android.cursor.item/vnd.dolphin.game"; @@ -89,6 +91,10 @@ public final class GameProvider extends ContentProvider { long id = -1; if (table != null) { + if (table.equals(RESET_LIBRARY)) { + mDbHelper.resetDatabase(database); + return uri; + } if (table.equals(REFRESH_LIBRARY)) { Log.info( "[GameProvider] URI specified table REFRESH_LIBRARY. No insertion necessary; refreshing library contents..."); diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java index ba39568e4..30585257e 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java @@ -148,6 +148,11 @@ public final class MainActivity extends AppCompatActivity implements MainView { case MainPresenter.REQUEST_ADD_DIRECTORY: // If the user picked a file, as opposed to just backing out. if (resultCode == MainActivity.RESULT_OK) { + // When a new directory is picked, we currently will reset the existing games + // database. This effectively means that only one game directory is supported. + // TODO(bunnei): Consider fixing this in the future, or removing code for this. + getContentResolver().insert(GameProvider.URI_RESET, null); + // Add the new directory mPresenter.onDirectorySelected(FileBrowserHelper.getSelectedDirectory(result)); } break;