summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProvider.java
blob: eff4b1e2d4bf51b6b0a602a6195599ac842a3010 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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;
    }
}