From 9e8ab499dcaac206cb83d7e64861e54755d30b82 Mon Sep 17 00:00:00 2001 From: Charles Lombardo Date: Wed, 8 Mar 2023 15:38:33 -0500 Subject: [PATCH] android: Convert GameProvider to Kotlin --- .../org/yuzu/yuzu_emu/model/GameProvider.java | 138 ------------------ .../org/yuzu/yuzu_emu/model/GameProvider.kt | 127 ++++++++++++++++ 2 files changed, 127 insertions(+), 138 deletions(-) delete mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.java create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.kt diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.java b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.java deleted file mode 100644 index eff4b1e2d4..0000000000 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.yuzu.yuzu_emu.model; - -import android.content.ContentProvider; -import android.content.ContentValues; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.net.Uri; - -import androidx.annotation.NonNull; - -import org.yuzu.yuzu_emu.BuildConfig; -import org.yuzu.yuzu_emu.utils.Log; - -/** - * Provides an interface allowing Activities to interact with the SQLite database. - * CRUD methods in this class can be called by Activities using getContentResolver(). - */ -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 = - Uri.parse(AUTHORITY + "/" + GameDatabase.TABLE_NAME_FOLDERS + "/"); - 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"; - - - private GameDatabase mDbHelper; - - @Override - public boolean onCreate() { - Log.info("[GameProvider] Creating Content Provider..."); - - mDbHelper = new GameDatabase(getContext()); - - return true; - } - - @Override - public Cursor query(@NonNull Uri uri, String[] projection, String selection, - String[] selectionArgs, String sortOrder) { - Log.info("[GameProvider] Querying URI: " + uri); - - SQLiteDatabase db = mDbHelper.getReadableDatabase(); - - String table = uri.getLastPathSegment(); - - if (table == null) { - Log.error("[GameProvider] Badly formatted URI: " + uri); - return null; - } - - Cursor cursor = db.query(table, projection, selection, selectionArgs, null, null, sortOrder); - cursor.setNotificationUri(getContext().getContentResolver(), uri); - - return cursor; - } - - @Override - public String getType(@NonNull Uri uri) { - Log.verbose("[GameProvider] Getting MIME type for URI: " + uri); - String lastSegment = uri.getLastPathSegment(); - - if (lastSegment == null) { - Log.error("[GameProvider] Badly formatted URI: " + uri); - return null; - } - - if (lastSegment.equals(GameDatabase.TABLE_NAME_FOLDERS)) { - return MIME_TYPE_FOLDER; - } else if (lastSegment.equals(GameDatabase.TABLE_NAME_GAMES)) { - return MIME_TYPE_GAME; - } - - Log.error("[GameProvider] Unknown MIME type for URI: " + uri); - return null; - } - - @Override - public Uri insert(@NonNull Uri uri, ContentValues values) { - Log.info("[GameProvider] Inserting row at URI: " + uri); - - SQLiteDatabase database = mDbHelper.getWritableDatabase(); - String table = uri.getLastPathSegment(); - - 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..."); - mDbHelper.scanLibrary(database); - return uri; - } - - long id = database.insertWithOnConflict(table, null, values, SQLiteDatabase.CONFLICT_IGNORE); - - // If insertion was successful... - if (id > 0) { - // If we just added a folder, add its contents to the game list. - if (table.equals(GameDatabase.TABLE_NAME_FOLDERS)) { - mDbHelper.scanLibrary(database); - } - - // Notify the UI that its contents should be refreshed. - getContext().getContentResolver().notifyChange(uri, null); - uri = Uri.withAppendedPath(uri, Long.toString(id)); - } else { - Log.error("[GameProvider] Row already exists: " + uri + " id: " + id); - } - } else { - Log.error("[GameProvider] Badly formatted URI: " + uri); - } - - database.close(); - - return uri; - } - - @Override - public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) { - Log.error("[GameProvider] Delete operations unsupported. URI: " + uri); - return 0; - } - - @Override - public int update(@NonNull Uri uri, ContentValues values, String selection, - String[] selectionArgs) { - Log.error("[GameProvider] Update operations unsupported. URI: " + uri); - return 0; - } -} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.kt new file mode 100644 index 0000000000..c9818172d0 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.kt @@ -0,0 +1,127 @@ +package org.yuzu.yuzu_emu.model + +import android.content.ContentProvider +import android.content.ContentValues +import android.database.Cursor +import android.database.sqlite.SQLiteDatabase +import android.net.Uri +import org.yuzu.yuzu_emu.BuildConfig +import org.yuzu.yuzu_emu.utils.Log + +/** + * Provides an interface allowing Activities to interact with the SQLite database. + * CRUD methods in this class can be called by Activities using getContentResolver(). + */ +class GameProvider : ContentProvider() { + private var mDbHelper: GameDatabase? = null + override fun onCreate(): Boolean { + Log.info("[GameProvider] Creating Content Provider...") + mDbHelper = GameDatabase(context!!) + return true + } + + override fun query( + uri: Uri, + projection: Array?, + selection: String?, + selectionArgs: Array?, + sortOrder: String? + ): Cursor? { + Log.info("[GameProvider] Querying URI: $uri") + val db = mDbHelper!!.readableDatabase + val table = uri.lastPathSegment + if (table == null) { + Log.error("[GameProvider] Badly formatted URI: $uri") + return null + } + val cursor = db.query(table, projection, selection, selectionArgs, null, null, sortOrder) + cursor.setNotificationUri(context!!.contentResolver, uri) + return cursor + } + + override fun getType(uri: Uri): String? { + Log.verbose("[GameProvider] Getting MIME type for URI: $uri") + val lastSegment = uri.lastPathSegment + if (lastSegment == null) { + Log.error("[GameProvider] Badly formatted URI: $uri") + return null + } + if (lastSegment == GameDatabase.TABLE_NAME_FOLDERS) { + return MIME_TYPE_FOLDER + } else if (lastSegment == GameDatabase.TABLE_NAME_GAMES) { + return MIME_TYPE_GAME + } + Log.error("[GameProvider] Unknown MIME type for URI: $uri") + return null + } + + override fun insert(uri: Uri, values: ContentValues?): Uri { + var realUri = uri + Log.info("[GameProvider] Inserting row at URI: $realUri") + val database = mDbHelper!!.writableDatabase + val table = realUri.lastPathSegment + if (table != null) { + if (table == RESET_LIBRARY) { + mDbHelper!!.resetDatabase(database) + return realUri + } + if (table == REFRESH_LIBRARY) { + Log.info( + "[GameProvider] URI specified table REFRESH_LIBRARY. No insertion necessary; refreshing library contents..." + ) + mDbHelper!!.scanLibrary(database) + return realUri + } + val id = + database.insertWithOnConflict(table, null, values, SQLiteDatabase.CONFLICT_IGNORE) + + // If insertion was successful... + if (id > 0) { + // If we just added a folder, add its contents to the game list. + if (table == GameDatabase.TABLE_NAME_FOLDERS) { + mDbHelper!!.scanLibrary(database) + } + + // Notify the UI that its contents should be refreshed. + context!!.contentResolver.notifyChange(realUri, null) + realUri = Uri.withAppendedPath(realUri, id.toString()) + } else { + Log.error("[GameProvider] Row already exists: $realUri id: $id") + } + } else { + Log.error("[GameProvider] Badly formatted URI: $realUri") + } + database.close() + return realUri + } + + override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int { + Log.error("[GameProvider] Delete operations unsupported. URI: $uri") + return 0 + } + + override fun update( + uri: Uri, values: ContentValues?, selection: String?, + selectionArgs: Array? + ): Int { + Log.error("[GameProvider] Update operations unsupported. URI: $uri") + return 0 + } + + companion object { + const val REFRESH_LIBRARY = "refresh" + const val RESET_LIBRARY = "reset" + private const val AUTHORITY = "content://${BuildConfig.APPLICATION_ID}.provider" + + @JvmField + val URI_FOLDER: Uri = Uri.parse("$AUTHORITY/${GameDatabase.TABLE_NAME_FOLDERS}/") + + @JvmField + val URI_REFRESH: Uri = Uri.parse("$AUTHORITY/$REFRESH_LIBRARY/") + + @JvmField + val URI_RESET: Uri = Uri.parse("$AUTHORITY/$RESET_LIBRARY/") + const val MIME_TYPE_FOLDER = "vnd.android.cursor.item/vnd.yuzu.folder" + const val MIME_TYPE_GAME = "vnd.android.cursor.item/vnd.yuzu.game" + } +}