0
0
mirror of https://github.com/ankidroid/Anki-Android.git synced 2024-09-20 12:02:16 +02:00

refactor: Convert Media to Kotlin

com.ichi2.libanki.Media

This adds functionality to allow nulls to be passed to DB's methods
This commit is contained in:
David Allison 2022-08-26 23:11:42 +01:00 committed by Mike Hardy
parent 1dfde93ccc
commit 2cadb48133
8 changed files with 641 additions and 691 deletions

View File

@ -43,7 +43,7 @@ permission notice:
// Example of class name: "/com/ichi2/anki/UIUtils.kt"
// Ensure that it starts with '/' (slash)
def source = Source.MAIN
def className = "/com/ichi2/libanki/Media.kt"
def className = ""
enum Source {
MAIN("/src/main/java"),

View File

@ -104,43 +104,43 @@ class MediaTest : InstrumentedTest() {
val mid = mTestCol!!.models.getModels().entries.iterator().next().key
var expected: List<String?> = emptyList<String>()
var actual = mTestCol!!.media.filesInStr(mid, "aoeu")
var actual = mTestCol!!.media.filesInStr(mid, "aoeu").toMutableList()
actual.retainAll(expected)
assertEquals(expected.size, actual.size)
expected = listOf("foo.jpg")
actual = mTestCol!!.media.filesInStr(mid, "aoeu<img src='foo.jpg'>ao")
actual = mTestCol!!.media.filesInStr(mid, "aoeu<img src='foo.jpg'>ao").toMutableList()
actual.retainAll(expected)
assertEquals(expected.size, actual.size)
expected = listOf("foo.jpg", "bar.jpg")
actual = mTestCol!!.media.filesInStr(mid, "aoeu<img src='foo.jpg'><img src=\"bar.jpg\">ao")
actual = mTestCol!!.media.filesInStr(mid, "aoeu<img src='foo.jpg'><img src=\"bar.jpg\">ao").toMutableList()
actual.retainAll(expected)
assertEquals(expected.size, actual.size)
expected = listOf("foo.jpg")
actual = mTestCol!!.media.filesInStr(mid, "aoeu<img src=foo.jpg style=bar>ao")
actual = mTestCol!!.media.filesInStr(mid, "aoeu<img src=foo.jpg style=bar>ao").toMutableList()
actual.retainAll(expected)
assertEquals(expected.size, actual.size)
expected = listOf("one", "two")
actual = mTestCol!!.media.filesInStr(mid, "<img src=one><img src=two>")
actual = mTestCol!!.media.filesInStr(mid, "<img src=one><img src=two>").toMutableList()
actual.retainAll(expected)
assertEquals(expected.size, actual.size)
expected = listOf("foo.jpg")
actual = mTestCol!!.media.filesInStr(mid, "aoeu<img src=\"foo.jpg\">ao")
actual = mTestCol!!.media.filesInStr(mid, "aoeu<img src=\"foo.jpg\">ao").toMutableList()
actual.retainAll(expected)
assertEquals(expected.size, actual.size)
expected = listOf("foo.jpg", "fo")
actual =
mTestCol!!.media.filesInStr(mid, "aoeu<img src=\"foo.jpg\"><img class=yo src=fo>ao")
mTestCol!!.media.filesInStr(mid, "aoeu<img src=\"foo.jpg\"><img class=yo src=fo>ao").toMutableList()
actual.retainAll(expected)
assertEquals(expected.size, actual.size)
expected = listOf("foo.mp3")
actual = mTestCol!!.media.filesInStr(mid, "aou[sound:foo.mp3]aou")
actual = mTestCol!!.media.filesInStr(mid, "aou[sound:foo.mp3]aou").toMutableList()
actual.retainAll(expected)
assertEquals(expected.size, actual.size)
@ -183,11 +183,11 @@ class MediaTest : InstrumentedTest() {
// check media
val ret = mTestCol!!.media.check()
var expected = listOf("fake2.png")
var actual = ret[0]
var actual = ret[0].toMutableList()
actual.retainAll(expected)
assertEquals(expected.size, actual.size)
expected = listOf("foo.jpg")
actual = ret[1]
actual = ret[1].toMutableList()
actual.retainAll(expected)
assertEquals(expected.size, actual.size)
}
@ -209,11 +209,11 @@ class MediaTest : InstrumentedTest() {
}
private fun added(d: Collection?): List<String> {
return d!!.media.db.queryStringList("select fname from media where csum is not null")
return d!!.media.db!!.queryStringList("select fname from media where csum is not null")
}
private fun removed(d: Collection?): List<String> {
return d!!.media.db.queryStringList("select fname from media where csum is null")
return d!!.media.db!!.queryStringList("select fname from media where csum is null")
}
@Test

View File

@ -186,7 +186,7 @@ class DB(db: SupportSQLiteDatabase) {
return results
}
fun execute(@Language("SQL") sql: String, vararg `object`: Any) {
fun execute(@Language("SQL") sql: String, vararg `object`: Any?) {
val s = sql.trim { it <= ' ' }.lowercase()
// mark modified?
for (mo in MOD_SQLS) {
@ -230,7 +230,7 @@ class DB(db: SupportSQLiteDatabase) {
return database.insert(table, SQLiteDatabase.CONFLICT_NONE, values)
}
fun executeMany(@Language("SQL") sql: String, list: List<Array<out Any>>) {
fun executeMany(@Language("SQL") sql: String, list: List<Array<out Any?>>) {
mod = true
if (BuildConfig.DEBUG) {
if (list.size <= 1) {
@ -245,7 +245,7 @@ class DB(db: SupportSQLiteDatabase) {
/** Use this executeMany version with external transaction management */
@KotlinCleanup("Use forEach")
fun executeManyNoTransaction(@Language("SQL") sql: String, list: List<Array<out Any>>) {
fun executeManyNoTransaction(@Language("SQL") sql: String, list: List<Array<out Any?>>) {
mod = true
for (o in list) {
database.execSQL(sql, o)

File diff suppressed because it is too large Load Diff

View File

@ -104,7 +104,7 @@ open class Anki2Importer(col: Collection?, file: String) : Importer(col!!, file)
try {
// Use transactions for performance and rollbacks in case of error
dst.db.database.beginTransaction()
dst.media.db.database.beginTransaction()
dst.media.db!!.database.beginTransaction()
if (!TextUtils.isEmpty(mDeckPrefix)) {
val id = dst.decks.id_safe(mDeckPrefix!!)
dst.decks.select(id)
@ -123,14 +123,14 @@ open class Anki2Importer(col: Collection?, file: String) : Importer(col!!, file)
_postImport()
publishProgress(100, 100, 50)
dst.db.database.setTransactionSuccessful()
dst.media.db.database.setTransactionSuccessful()
dst.media.db!!.database.setTransactionSuccessful()
} catch (err: Exception) {
Timber.e(err, "_import() exception")
throw err
} finally {
// endTransaction throws about invalid transaction even when you check first!
DB.safeEndInTransaction(dst.db)
DB.safeEndInTransaction(dst.media.db)
DB.safeEndInTransaction(dst.media.db!!)
}
Timber.i("Performing vacuum/analyze")
try {

View File

@ -129,7 +129,7 @@ class MediaSyncer(
String.format(
Locale.US,
"check: lsum=%s rsum=%s ldirty=%d rusn=%d fname=%s",
if (TextUtils.isEmpty(lsum)) "" else lsum.subSequence(0, 4),
if (TextUtils.isEmpty(lsum)) "" else lsum!!.subSequence(0, 4),
if (TextUtils.isEmpty(rsum)) "" else rsum!!.subSequence(0, 4),
ldirty,
rusn,
@ -202,7 +202,7 @@ class MediaSyncer(
} else {
col.log("concurrent update, skipping usn update")
// commit for markClean
col.media.db.commit()
col.media.db!!.commit()
updateConflict = true
}
toSend -= processedCnt

View File

@ -44,16 +44,16 @@ class CheckMediaTest : RobolectricTest() {
return
}
// 7421
col.media.db.database.execSQL("drop table meta")
col.media.db!!.database.execSQL("drop table meta")
assertThat(
col.media.db.queryScalar("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='meta';"),
col.media.db!!.queryScalar("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='meta';"),
equalTo(0)
)
val task =
TaskManager.launchCollectionTask(CheckMedia()) as CollectionTask<*, *>
task.get()
assertThat(
col.media.db.queryScalar("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='meta';"),
col.media.db!!.queryScalar("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='meta';"),
equalTo(1)
)
}

View File

@ -24,7 +24,7 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class LaTeXTest : RobolectricTest() {
class MockMedia(col: Collection?) : Media(col, false) {
class MockMedia(col: Collection) : Media(col, false) {
/**
* @param fname A field name
* @return Always true, given that we want to assume the field exists in test