diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPI.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPI.kt index 5bb743bf0615..3d9188e4ce31 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPI.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPI.kt @@ -337,21 +337,37 @@ open class AnkiDroidJsAPI(private val activity: AbstractFlashcardViewer) { @JavascriptInterface fun ankiBuryCard(): Boolean { + if (!isInit(jsAPIConstants.BURY_CARD, jsAPIConstants.ankiJsErrorCodeBuryCard)) { + return false + } + return activity.buryCard() } @JavascriptInterface fun ankiBuryNote(): Boolean { + if (!isInit(jsAPIConstants.BURY_NOTE, jsAPIConstants.ankiJsErrorCodeBuryNote)) { + return false + } + return activity.buryNote() } @JavascriptInterface fun ankiSuspendCard(): Boolean { + if (!isInit(jsAPIConstants.SUSPEND_CARD, jsAPIConstants.ankiJsErrorCodeSuspendCard)) { + return false + } + return activity.suspendCard() } @JavascriptInterface fun ankiSuspendNote(): Boolean { + if (!isInit(jsAPIConstants.SUSPEND_NOTE, jsAPIConstants.ankiJsErrorCodeSuspendNote)) { + return false + } + return activity.suspendNote() } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPIConstants.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPIConstants.kt index d71bb11548a6..5fd1bec593fb 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPIConstants.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPIConstants.kt @@ -27,6 +27,16 @@ class AnkiDroidJsAPIConstants { @kotlin.jvm.JvmField val ankiJsErrorCodeFlagCard: Int = 2 + @kotlin.jvm.JvmField + val ankiJsErrorCodeBuryCard: Int = 3 + @kotlin.jvm.JvmField + val ankiJsErrorCodeSuspendCard: Int = 4 + + @kotlin.jvm.JvmField + val ankiJsErrorCodeBuryNote: Int = 5 + @kotlin.jvm.JvmField + val ankiJsErrorCodeSuspendNote: Int = 6 + // js api developer contact @kotlin.jvm.JvmField var mCardSuppliedDeveloperContact = "" @@ -41,10 +51,25 @@ class AnkiDroidJsAPIConstants { @kotlin.jvm.JvmField val TOGGLE_FLAG = "toggleFlag" + @kotlin.jvm.JvmField + val BURY_CARD = "buryCard" + @kotlin.jvm.JvmField + val BURY_NOTE = "buryNote" + @kotlin.jvm.JvmField + val SUSPEND_CARD = "suspendCard" + @kotlin.jvm.JvmField + val SUSPEND_NOTE = "suspendNote" + fun initApiMap(): HashMap { val jsApiListMap = HashMap() jsApiListMap[MARK_CARD] = false jsApiListMap[TOGGLE_FLAG] = false + + jsApiListMap[BURY_CARD] = false + jsApiListMap[BURY_NOTE] = false + jsApiListMap[SUSPEND_CARD] = false + jsApiListMap[SUSPEND_NOTE] = false + return jsApiListMap } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidJsAPITest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidJsAPITest.kt index e1e7d0759fbf..fac213ccc783 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidJsAPITest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidJsAPITest.kt @@ -47,7 +47,7 @@ class AnkiDroidJsAPITest : RobolectricTest() { data.put("developer", "dev@mail.com") // this will be changed when new api added - val expected = "{\"markCard\":true,\"toggleFlag\":true}" + val expected = "{\"suspendNote\":true,\"markCard\":true,\"suspendCard\":true,\"buryCard\":true,\"toggleFlag\":true,\"buryNote\":true}" waitForAsyncTasksToComplete() assertThat(javaScriptFunction.init(data.toString()), equalTo(expected)) @@ -231,6 +231,85 @@ class AnkiDroidJsAPITest : RobolectricTest() { reviewer.webView.evaluateJavascript(flagCardJs) { s -> assertThat(s, equalTo(1)) } } + fun ankiBurySuspendTest() { + // js api test for bury and suspend notes and cards + // add five notes, four will be buried and suspended + // count number of notes, if buried or suspended then + // in scheduling the count will be less than previous scheduling + val col = col + val models = col.models + val decks = col.decks + val didA = addDeck("Test") + val basic = models.byName(AnkiDroidApp.getAppResources().getString(R.string.basic_model_name)) + basic!!.put("did", didA) + addNoteUsingBasicModel("foo", "bar") + addNoteUsingBasicModel("baz", "bak") + addNoteUsingBasicModel("Anki", "Droid") + addNoteUsingBasicModel("Test Card", "Bury and Suspend Card") + addNoteUsingBasicModel("Test Note", "Bury and Suspend Note") + decks.select(didA) + + val reviewer: Reviewer = startReviewer() + + waitForAsyncTasksToComplete() + + // ---------- + // Bury Card + // ---------- + var jsScript = createTestScript("AnkiDroidJS.ankiBuryCard();") + // call script to bury current card + reviewer.webView.evaluateJavascript(jsScript) { s -> assertThat(s, equalTo(true)) } + + // count number of notes + assertThat(reviewer.mSched.cardCount(), equalTo(4)) + + // ---------- + // Bury Note + // ---------- + jsScript = createTestScript("AnkiDroidJS.ankiBuryNote();") + // call script to bury current note + reviewer.webView.evaluateJavascript(jsScript) { s -> assertThat(s, equalTo(true)) } + + // count number of notes + assertThat(reviewer.mSched.cardCount(), equalTo(3)) + + // ------------- + // Suspend Card + // ------------- + jsScript = createTestScript("AnkiDroidJS.ankiSuspendCard();") + // call script to suspend current card + reviewer.webView.evaluateJavascript(jsScript) { s -> assertThat(s, equalTo(true)) } + + // count number of notes + assertThat(reviewer.mSched.cardCount(), equalTo(2)) + + // ------------- + // Suspend Note + // ------------- + jsScript = createTestScript("AnkiDroidJS.ankiSuspendNote();") + // call script to suspend current note + reviewer.webView.evaluateJavascript(jsScript) { s -> assertThat(s, equalTo(true)) } + + // count number of notes + assertThat(reviewer.mSched.cardCount(), equalTo(1)) + } + + private fun createTestScript(apiName: String): String { + // create js script for evaluating in webview + var script = "javascript:(function () {\n" + + // add js api developer contract + script += "var jsApi = {\"version\" : \"0.0.1\", \"developer\" : \"dev@mail.com\"};\n" + + // init JS API + script += "AnkiDroidJS.init(JSON.stringify(jsApi));\n" + + // call js api + script += "$apiName\n})();" + + return script + } + private fun startReviewer(): Reviewer { return ReviewerTest.startReviewer(this) }