committed by
bunnei
2 changed files with 127 additions and 138 deletions
-
138src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.java
-
127src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.kt
@ -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; |
|
||||
} |
|
||||
} |
|
||||
@ -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<String>?, |
||||
|
selection: String?, |
||||
|
selectionArgs: Array<String>?, |
||||
|
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<String>?): Int { |
||||
|
Log.error("[GameProvider] Delete operations unsupported. URI: $uri") |
||||
|
return 0 |
||||
|
} |
||||
|
|
||||
|
override fun update( |
||||
|
uri: Uri, values: ContentValues?, selection: String?, |
||||
|
selectionArgs: Array<String>? |
||||
|
): 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" |
||||
|
} |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue