package com.topjohnwu.magisk.database; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import com.topjohnwu.magisk.App; import com.topjohnwu.magisk.Config; import com.topjohnwu.magisk.Const; import com.topjohnwu.magisk.container.Repo; import java.util.HashSet; import java.util.Set; public class RepoDatabaseHelper extends SQLiteOpenHelper { private static final int DATABASE_VER = 4; private static final String TABLE_NAME = "repos"; private SQLiteDatabase mDb; private Runnable adapterCb; public RepoDatabaseHelper(Context context) { super(context, "repo.db", null, DATABASE_VER); mDb = getWritableDatabase(); // Remove outdated repos mDb.delete(TABLE_NAME, "minMagisk list) { for (String id : list) { if (id == null) continue; mDb.delete(TABLE_NAME, "id=?", new String[] { id }); } notifyAdapter(); } public void addRepo(Repo repo) { mDb.replace(TABLE_NAME, null, repo.getContentValues()); notifyAdapter(); } public Repo getRepo(String id) { try (Cursor c = mDb.query(TABLE_NAME, null, "id=?", new String[] { id }, null, null, null)) { if (c.moveToNext()) { return new Repo(c); } } return null; } public Cursor getRawCursor() { return mDb.query(TABLE_NAME, null, null, null, null, null, null); } public Cursor getRepoCursor() { String orderBy = null; switch ((int) Config.get(Config.Key.REPO_ORDER)) { case Config.Value.ORDER_NAME: orderBy = "name COLLATE NOCASE"; break; case Config.Value.ORDER_DATE: orderBy = "last_update DESC"; } return mDb.query(TABLE_NAME, null, "minMagisk<=? AND minMagisk>=?", new String[] { String.valueOf(Config.magiskVersionCode), String.valueOf(Const.MIN_MODULE_VER) }, null, null, orderBy); } public Set getRepoIDSet() { HashSet set = new HashSet<>(300); try (Cursor c = mDb.query(TABLE_NAME, null, null, null, null, null, null)) { while (c.moveToNext()) { set.add(c.getString(c.getColumnIndex("id"))); } } return set; } public void registerAdapterCallback(Runnable cb) { adapterCb = cb; } public void unregisterAdapterCallback() { adapterCb = null; } private void notifyAdapter() { if (adapterCb != null) { App.mainHandler.post(adapterCb); } } }