Search in sources :

Example 1 with JavaScriptFunction

use of com.ichi2.anki.AbstractFlashcardViewer.JavaScriptFunction in project AnkiChinaAndroid by ankichinateam.

the class ReviewerTest method jsTime4ShouldBeBlankIfButtonUnavailable.

@Test
public void jsTime4ShouldBeBlankIfButtonUnavailable() {
    // #6623 - easy should be blank when displaying a card with 3 buttons (after displaying a review)
    Note firstNote = addNoteUsingBasicModel("Hello", "World");
    moveToReviewQueue(firstNote.firstCard());
    addNoteUsingBasicModel("Hello", "World2");
    Reviewer reviewer = startReviewer();
    JavaScriptFunction javaScriptFunction = reviewer.javaScriptFunction();
    // The answer needs to be displayed to be able to get the time.
    displayAnswer(reviewer);
    assertThat("4 buttons should be displayed", reviewer.getAnswerButtonCount(), is(4));
    String nextTime = javaScriptFunction.ankiGetNextTime4();
    assertThat(nextTime, not(isEmptyString()));
    // Display the next answer
    reviewer.answerCard(EASE_4);
    displayAnswer(reviewer);
    if (schedVersion == 1) {
        assertThat("The 4th button should not be visible", reviewer.getAnswerButtonCount(), is(3));
        String learnTime = javaScriptFunction.ankiGetNextTime4();
        assertThat("If the 4th button is not visible, there should be no time4 in JS", learnTime, isEmptyString());
    }
}
Also used : Note(com.ichi2.libanki.Note) JavaScriptFunction(com.ichi2.anki.AbstractFlashcardViewer.JavaScriptFunction) Matchers.isEmptyString(org.hamcrest.Matchers.isEmptyString) Test(org.junit.Test)

Example 2 with JavaScriptFunction

use of com.ichi2.anki.AbstractFlashcardViewer.JavaScriptFunction in project AnkiChinaAndroid by ankichinateam.

the class ReviewerTest method assertCounts.

private void assertCounts(Reviewer r, int newCount, int stepCount, int revCount) {
    List<String> countList = new ArrayList<>();
    JavaScriptFunction jsApi = r.javaScriptFunction();
    countList.add(jsApi.ankiGetNewCardCount());
    countList.add(jsApi.ankiGetLrnCardCount());
    countList.add(jsApi.ankiGetRevCardCount());
    List<Integer> expexted = new ArrayList<>();
    expexted.add(newCount);
    expexted.add(stepCount);
    expexted.add(revCount);
    // We use toString as hamcrest does not print the whole array and stops at [0].
    assertThat(countList.toString(), is(expexted.toString()));
}
Also used : JavaScriptFunction(com.ichi2.anki.AbstractFlashcardViewer.JavaScriptFunction) ArrayList(java.util.ArrayList) Matchers.isEmptyString(org.hamcrest.Matchers.isEmptyString)

Example 3 with JavaScriptFunction

use of com.ichi2.anki.AbstractFlashcardViewer.JavaScriptFunction in project Anki-Android by ankidroid.

the class ReviewerTest method jsAnkiGetDeckName.

@Test
public void jsAnkiGetDeckName() {
    Collection col = getCol();
    ModelManager models = col.getModels();
    DeckManager decks = col.getDecks();
    Long didAb = addDeck("A::B");
    Model basic = models.byName(AnkiDroidApp.getAppResources().getString(R.string.basic_model_name));
    basic.put("did", didAb);
    addNoteUsingBasicModel("foo", "bar");
    Long didA = addDeck("A");
    decks.select(didA);
    Reviewer reviewer = startReviewer();
    AnkiDroidJsAPI javaScriptFunction = reviewer.javaScriptFunction();
    waitForAsyncTasksToComplete();
    assertThat(javaScriptFunction.ankiGetDeckName(), is("B"));
}
Also used : Model(com.ichi2.libanki.Model) Collection(com.ichi2.libanki.Collection) DeckManager(com.ichi2.libanki.DeckManager) ModelManager(com.ichi2.libanki.ModelManager) Test(org.junit.Test)

Example 4 with JavaScriptFunction

use of com.ichi2.anki.AbstractFlashcardViewer.JavaScriptFunction in project Anki-Android by ankidroid.

the class ReviewerTest method jsTime4ShouldBeBlankIfButtonUnavailable.

@Test
public void jsTime4ShouldBeBlankIfButtonUnavailable() {
    // #6623 - easy should be blank when displaying a card with 3 buttons (after displaying a review)
    Note firstNote = addNoteUsingBasicModel("Hello", "World");
    moveToReviewQueue(firstNote.firstCard());
    addNoteUsingBasicModel("Hello", "World2");
    Reviewer reviewer = startReviewer();
    AnkiDroidJsAPI javaScriptFunction = reviewer.javaScriptFunction();
    // The answer needs to be displayed to be able to get the time.
    displayAnswer(reviewer);
    assertThat("4 buttons should be displayed", reviewer.getAnswerButtonCount(), is(4));
    String nextTime = javaScriptFunction.ankiGetNextTime4();
    assertThat(nextTime, not(emptyString()));
    // Display the next answer
    reviewer.answerCard(Consts.BUTTON_FOUR);
    displayAnswer(reviewer);
    if (schedVersion == 1) {
        assertThat("The 4th button should not be visible", reviewer.getAnswerButtonCount(), is(3));
        String learnTime = javaScriptFunction.ankiGetNextTime4();
        assertThat("If the 4th button is not visible, there should be no time4 in JS", learnTime, emptyString());
    }
}
Also used : Note(com.ichi2.libanki.Note) Matchers.emptyString(org.hamcrest.Matchers.emptyString) Test(org.junit.Test)

Example 5 with JavaScriptFunction

use of com.ichi2.anki.AbstractFlashcardViewer.JavaScriptFunction in project AnkiChinaAndroid by ankichinateam.

the class WebViewActivity method onCreate.

@SuppressLint({ "AddJavascriptInterface", "SetJavaScriptEnabled" })
@Override
@SuppressWarnings("deprecation")
protected void onCreate(Bundle savedInstanceState) {
    Themes.setThemeLegacy(this);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.web_view);
    Toolbar toolbar = findViewById(R.id.toolbar);
    if (toolbar != null) {
        // toolbar.inflateMenu(R.menu.web_view);
        setSupportActionBar(toolbar);
    }
    getSupportActionBar().setTitle(getIntent().getStringExtra("url"));
    // Add a home button to the actionbar
    // getSupportActionBar().setHomeButtonEnabled(true);
    // getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    webView = findViewById(R.id.web_view);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    // webView.getSettings().setAppCacheMaxSize(1024*1024*8);
    webView.getSettings().setUserAgentString("User-Agent:Android");
    // 可以读取文件缓存
    webView.getSettings().setAllowFileAccess(true);
    // 开启H5(APPCache)缓存功能
    webView.getSettings().setAppCacheEnabled(true);
    webView.getSettings().setDatabaseEnabled(true);
    webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
    String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
    webView.getSettings().setAppCachePath(appCachePath);
    // webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);
    webView.setDownloadListener((url, userAgent, contentDisposition, mimeType, contentLength) -> {
        String fileName = URLUtil.guessFileName(url, contentDisposition, mimeType);
        Request request = new Request.Builder().url(url).build();
        // 构建我们的进度监听器
        File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), fileName);
        final ProgressResponseBody.ProgressListener listener = (bytesRead, contentLength1, done) -> {
            // 计算百分比并更新ProgressBar
            if (contentLength1 != 0) {
                final int percent = (int) (100 * bytesRead / contentLength1);
                mProgressDialog.setProgress(percent);
            }
            if (done) {
                runOnUiThread(() -> {
                    mProgressDialog.dismiss();
                    // fixme 下载的如果不是卡牌,需要执行通用程序
                    AsyncDialogFragment newFragment = ImportDialog.newInstance(DIALOG_IMPORT_ADD_CONFIRM, file.getAbsolutePath(), WebViewActivity.this);
                    showAsyncDialogFragment(newFragment);
                });
            }
        };
        OkHttpClient client = new OkHttpClient.Builder().addNetworkInterceptor(chain -> {
            Response response = chain.proceed(chain.request());
            return response.newBuilder().body(new ProgressResponseBody(response.body(), listener)).build();
        }).build();
        // 发送响应
        Call call = client.newCall(request);
        call.enqueue(new Callback() {

            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) {
                Timber.i("onResponse:" + response.isSuccessful());
                writeFile(file, response);
            }
        });
        mProgressDialog = new MaterialDialog.Builder(WebViewActivity.this).title("正在下载").content("请不要做任何操作,保持屏幕常亮,切换页面或APP会导致下载中断!").progress(false, 100, false).cancelable(false).negativeText("取消下载").onNegative((dialog, which) -> {
            call.cancel();
            dialog.dismiss();
        }).show();
    });
    webView.setWebChromeClient(new WebChromeClient() {

        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
            writeData(getIntent().getStringExtra("token"));
            WebViewActivity.this.getSupportActionBar().setTitle(title);
        }
    });
    webView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            writeData(getIntent().getStringExtra("token"));
        }

        @SuppressWarnings("deprecation")
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Timber.i("shouldOverrideUrlLoading:%s", url);
            if (url.startsWith("openexternalbrowser://url=")) {
                // startThirdpartyApp("https://www.baidu.com");
                openUrl(Uri.parse(url.replace("openexternalbrowser://url=", "")));
            } else if (urlCanLoad(url.toLowerCase())) {
                // 加载正常网页
                view.loadUrl(url, map);
            } else {
                // 打开第三方应用或者下载apk等
                startThirdpartyApp(url);
            }
            return true;
        }
    });
    webView.setOnKeyListener((v, keyCode, event) -> {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            // 按返回键操作并且能回退网页
            if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
                // 后退
                webView.goBack();
                return true;
            }
        }
        // showShareDialog();
        return false;
    });
    webView.addJavascriptInterface(new JavaScriptFunction(), "AnkiDroidJS");
    map.put("Referer", "https://file.ankichinas.cn");
    webView.loadUrl(getIntent().getStringExtra("url"), map);
}
Also used : JavascriptInterface(android.webkit.JavascriptInterface) RequiresApi(androidx.annotation.RequiresApi) UMImage(com.umeng.socialize.media.UMImage) LinearLayout(android.widget.LinearLayout) Bundle(android.os.Bundle) AsyncDialogFragment(com.ichi2.anki.dialogs.AsyncDialogFragment) NonNull(androidx.annotation.NonNull) Uri(android.net.Uri) ColorDrawable(android.graphics.drawable.ColorDrawable) DeviceConfigInternal.context(com.umeng.socialize.utils.DeviceConfigInternal.context) Gson(com.google.gson.Gson) Map(java.util.Map) ForwardingSource(okio.ForwardingSource) WebViewClient(android.webkit.WebViewClient) ClipboardManager(android.content.ClipboardManager) View(android.view.View) TaskData(com.ichi2.async.TaskData) WebView(android.webkit.WebView) MediaType(okhttp3.MediaType) ResponseBody(okhttp3.ResponseBody) SHARE_MEDIA(com.umeng.socialize.bean.SHARE_MEDIA) Request(okhttp3.Request) SHOW_STUDYOPTIONS(com.ichi2.anki.DeckPicker.SHOW_STUDYOPTIONS) JSONObject(com.ichi2.utils.JSONObject) ViewGroup(android.view.ViewGroup) FileNotFoundException(java.io.FileNotFoundException) Timber(timber.log.Timber) BufferedSource(okio.BufferedSource) ShareAction(com.umeng.socialize.ShareAction) Toolbar(androidx.appcompat.widget.Toolbar) TaskListenerWithContext(com.ichi2.async.TaskListenerWithContext) MaterialDialog(com.afollestad.materialdialogs.MaterialDialog) Window(android.view.Window) Context(android.content.Context) TaskListener(com.ichi2.async.TaskListener) Okio(okio.Okio) KeyEvent(android.view.KeyEvent) Source(okio.Source) DIALOG_IMPORT_ADD_CONFIRM(com.ichi2.anki.dialogs.ImportDialog.DIALOG_IMPORT_ADD_CONFIRM) Environment(android.os.Environment) UMWeb(com.umeng.socialize.media.UMWeb) ImportDialog(com.ichi2.anki.dialogs.ImportDialog) UMShareListener(com.umeng.socialize.UMShareListener) Dialog(android.app.Dialog) Intent(android.content.Intent) HashMap(java.util.HashMap) StyledProgressDialog(com.ichi2.themes.StyledProgressDialog) MenuItem(android.view.MenuItem) ClipData(android.content.ClipData) LEFT(com.ichi2.anim.ActivityTransitionAnimation.LEFT) SuppressLint(android.annotation.SuppressLint) JSONArray(com.ichi2.utils.JSONArray) WebSettings(android.webkit.WebSettings) Toast(android.widget.Toast) Menu(android.view.Menu) Response(okhttp3.Response) AnkiPackageImporter(com.ichi2.libanki.importer.AnkiPackageImporter) Call(okhttp3.Call) Callback(okhttp3.Callback) Build(android.os.Build) WebChromeClient(android.webkit.WebChromeClient) OutputStream(java.io.OutputStream) Buffer(okio.Buffer) URLUtil(android.webkit.URLUtil) FileOutputStream(java.io.FileOutputStream) TextUtils(android.text.TextUtils) IOException(java.io.IOException) Themes(com.ichi2.themes.Themes) File(java.io.File) Color(android.graphics.Color) Gravity(android.view.Gravity) OkHttpClient(okhttp3.OkHttpClient) ActivityTransitionAnimation(com.ichi2.anim.ActivityTransitionAnimation) InputStream(java.io.InputStream) Call(okhttp3.Call) OkHttpClient(okhttp3.OkHttpClient) Request(okhttp3.Request) IOException(java.io.IOException) Response(okhttp3.Response) Callback(okhttp3.Callback) WebChromeClient(android.webkit.WebChromeClient) AsyncDialogFragment(com.ichi2.anki.dialogs.AsyncDialogFragment) WebView(android.webkit.WebView) File(java.io.File) Toolbar(androidx.appcompat.widget.Toolbar) WebViewClient(android.webkit.WebViewClient) SuppressLint(android.annotation.SuppressLint)

Aggregations

Test (org.junit.Test)3 JavaScriptFunction (com.ichi2.anki.AbstractFlashcardViewer.JavaScriptFunction)2 Note (com.ichi2.libanki.Note)2 Matchers.isEmptyString (org.hamcrest.Matchers.isEmptyString)2 SuppressLint (android.annotation.SuppressLint)1 Dialog (android.app.Dialog)1 ClipData (android.content.ClipData)1 ClipboardManager (android.content.ClipboardManager)1 Context (android.content.Context)1 Intent (android.content.Intent)1 Color (android.graphics.Color)1 ColorDrawable (android.graphics.drawable.ColorDrawable)1 Uri (android.net.Uri)1 Build (android.os.Build)1 Bundle (android.os.Bundle)1 Environment (android.os.Environment)1 TextUtils (android.text.TextUtils)1 Gravity (android.view.Gravity)1 KeyEvent (android.view.KeyEvent)1 Menu (android.view.Menu)1