Search in sources :

Example 11 with QUESTION

use of com.ichi2.anki.CardBrowser.Column.QUESTION in project AnkiChinaAndroid by ankichinateam.

the class CardTemplatePreviewer method onCollectionLoaded.

@Override
protected void onCollectionLoaded(Collection col) {
    super.onCollectionLoaded(col);
    if ((mCurrentCard == null) && (mCardList == null)) {
        Timber.d("onCollectionLoaded - incorrect state to load, closing");
        closeCardTemplatePreviewer();
        return;
    }
    if (mCardList != null && mOrdinal >= 0 && mOrdinal < mCardList.length) {
        mCurrentCard = new PreviewerCard(col, mCardList[mOrdinal]);
    }
    if (mNoteEditorBundle != null) {
        long newDid = mNoteEditorBundle.getLong("did");
        if (col.getDecks().isDyn(newDid)) {
            mCurrentCard.setODid(mCurrentCard.getDid());
        }
        mCurrentCard.setDid(newDid);
        Note currentNote = mCurrentCard.note();
        ArrayList<String> tagsList = mNoteEditorBundle.getStringArrayList("tags");
        NoteUtils.setTags(currentNote, tagsList);
        Bundle noteFields = mNoteEditorBundle.getBundle("editFields");
        if (noteFields != null) {
            for (String fieldOrd : noteFields.keySet()) {
                // In case the fields on the card are out of sync with the bundle
                int fieldOrdInt = Integer.parseInt(fieldOrd);
                if (fieldOrdInt < currentNote.getFields().length) {
                    currentNote.setField(fieldOrdInt, noteFields.getString(fieldOrd));
                }
            }
        }
    }
    displayCardQuestion();
    Timber.i("display card question while showing answer:%s", mShowingAnswer);
    if (mShowingAnswer) {
        displayCardAnswer();
    }
// showBackIcon();
}
Also used : Bundle(android.os.Bundle) Note(com.ichi2.libanki.Note)

Example 12 with QUESTION

use of com.ichi2.anki.CardBrowser.Column.QUESTION in project AnkiChinaAndroid by ankichinateam.

the class CollectionTest method test_furigana.

@Test
@Ignore("Pending port of media search from Rust code")
public void test_furigana() {
    Collection col = getCol();
    Models mm = col.getModels();
    Model m = mm.current();
    // filter should work
    m.getJSONArray("tmpls").getJSONObject(0).put("qfmt", "{{kana:Front}}");
    mm.save(m);
    Note n = col.newNote();
    n.setItem("Front", "foo[abc]");
    col.addNote(n);
    Card c = n.cards().get(0);
    assertTrue(c.q().endsWith("abc"));
    // and should avoid sound
    n.setItem("Front", "foo[sound:abc.mp3]");
    n.flush();
    String question = c.q(true);
    assertThat("Question «" + question + "» does not contains «anki:play».", question, containsString("anki:play"));
    // it shouldn't throw an error while people are editing
    m.getJSONArray("tmpls").getJSONObject(0).put("qfmt", "{{kana:}}");
    mm.save(m);
    c.q(true);
}
Also used : Matchers.containsString(org.hamcrest.Matchers.containsString) Ignore(org.junit.Ignore) RobolectricTest(com.ichi2.anki.RobolectricTest) Test(org.junit.Test)

Example 13 with QUESTION

use of com.ichi2.anki.CardBrowser.Column.QUESTION in project AnkiChinaAndroid by ankichinateam.

the class ModelTest method test_cloze_mathjax.

@Test
public void test_cloze_mathjax() {
    Collection col = getCol();
    col.getModels().setCurrent(col.getModels().byName("Cloze"));
    Note note = col.newNote();
    note.setItem("Text", "{{c1::ok}} \\(2^2\\) {{c2::not ok}} \\(2^{{c3::2}}\\) \\(x^3\\) {{c4::blah}} {{c5::text with \\(x^2\\) jax}}");
    assertNotEquals(0, col.addNote(note));
    assertEquals(5, note.numberOfCards());
    assertThat(note.cards().get(0).q(), containsString("class=cloze"));
    assertThat(note.cards().get(1).q(), containsString("class=cloze"));
    assertThat(note.cards().get(2).q(), not(containsString("class=cloze")));
    assertThat(note.cards().get(3).q(), containsString("class=cloze"));
    assertThat(note.cards().get(4).q(), containsString("class=cloze"));
    note = col.newNote();
    note.setItem("Text", "\\(a\\) {{c1::b}} \\[ {{c1::c}} \\]");
    assertNotEquals(0, col.addNote(note));
    assertEquals(1, note.numberOfCards());
    String question = note.cards().get(0).q();
    assertTrue("Question «" + question + "» does not end correctly", question.endsWith("\\(a\\) <span class=cloze>[...]</span> \\[ [...] \\]"));
}
Also used : Matchers.containsString(org.hamcrest.Matchers.containsString) RobolectricTest(com.ichi2.anki.RobolectricTest) Test(org.junit.Test)

Example 14 with QUESTION

use of com.ichi2.anki.CardBrowser.Column.QUESTION in project Anki-Android by ankidroid.

the class CardBrowser method onCollectionLoaded.

// Finish initializing the activity after the collection has been correctly loaded
@Override
protected void onCollectionLoaded(Collection col) {
    super.onCollectionLoaded(col);
    Timber.d("onCollectionLoaded()");
    registerExternalStorageListener();
    SharedPreferences preferences = AnkiDroidApp.getSharedPrefs(getBaseContext());
    // Load reference to action bar title
    mActionBarTitle = findViewById(R.id.toolbar_title);
    mOrder = CARD_ORDER_NONE;
    String colOrder = getCol().get_config_string("sortType");
    for (int c = 0; c < fSortTypes.length; ++c) {
        if (fSortTypes[c].equals(colOrder)) {
            mOrder = c;
            break;
        }
    }
    if (mOrder == 1 && preferences.getBoolean("cardBrowserNoSorting", false)) {
        mOrder = 0;
    }
    // This upgrade should already have been done during
    // setConf. However older version of AnkiDroid didn't call
    // upgradeJSONIfNecessary during setConf, which means the
    // conf saved may still have this bug.
    mOrderAsc = Upgrade.upgradeJSONIfNecessary(getCol(), "sortBackwards", false);
    mCards.reset();
    mCardsListView = findViewById(R.id.card_browser_list);
    // Create a spinner for column1
    Spinner cardsColumn1Spinner = findViewById(R.id.browser_column1_spinner);
    ArrayAdapter<CharSequence> column1Adapter = ArrayAdapter.createFromResource(this, R.array.browser_column1_headings, android.R.layout.simple_spinner_item);
    column1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    cardsColumn1Spinner.setAdapter(column1Adapter);
    mColumn1Index = AnkiDroidApp.getSharedPrefs(getBaseContext()).getInt("cardBrowserColumn1", 0);
    cardsColumn1Spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            // If a new column was selected then change the key used to map from mCards to the column TextView
            if (pos != mColumn1Index) {
                mColumn1Index = pos;
                AnkiDroidApp.getSharedPrefs(AnkiDroidApp.getInstance().getBaseContext()).edit().putInt("cardBrowserColumn1", mColumn1Index).apply();
                Column[] fromMap = mCardsAdapter.getFromMapping();
                fromMap[0] = COLUMN1_KEYS[mColumn1Index];
                mCardsAdapter.setFromMapping(fromMap);
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        // Do Nothing
        }
    });
    // Load default value for column2 selection
    mColumn2Index = AnkiDroidApp.getSharedPrefs(getBaseContext()).getInt("cardBrowserColumn2", 0);
    // Setup the column 2 heading as a spinner so that users can easily change the column type
    Spinner cardsColumn2Spinner = findViewById(R.id.browser_column2_spinner);
    ArrayAdapter<CharSequence> column2Adapter = ArrayAdapter.createFromResource(this, R.array.browser_column2_headings, android.R.layout.simple_spinner_item);
    column2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    cardsColumn2Spinner.setAdapter(column2Adapter);
    // Create a new list adapter with updated column map any time the user changes the column
    cardsColumn2Spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            // If a new column was selected then change the key used to map from mCards to the column TextView
            if (pos != mColumn2Index) {
                mColumn2Index = pos;
                AnkiDroidApp.getSharedPrefs(AnkiDroidApp.getInstance().getBaseContext()).edit().putInt("cardBrowserColumn2", mColumn2Index).apply();
                Column[] fromMap = mCardsAdapter.getFromMapping();
                fromMap[1] = COLUMN2_KEYS[mColumn2Index];
                mCardsAdapter.setFromMapping(fromMap);
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        // Do Nothing
        }
    });
    // get the font and font size from the preferences
    int sflRelativeFontSize = preferences.getInt("relativeCardBrowserFontSize", DEFAULT_FONT_SIZE_RATIO);
    String sflCustomFont = preferences.getString("browserEditorFont", "");
    Column[] columnsContent = { COLUMN1_KEYS[mColumn1Index], COLUMN2_KEYS[mColumn2Index] };
    // make a new list adapter mapping the data in mCards to column1 and column2 of R.layout.card_item_browser
    mCardsAdapter = new MultiColumnListAdapter(this, R.layout.card_item_browser, columnsContent, new int[] { R.id.card_sfld, R.id.card_column2 }, sflRelativeFontSize, sflCustomFont);
    // link the adapter to the main mCardsListView
    mCardsListView.setAdapter(mCardsAdapter);
    // make the items (e.g. question & answer) render dynamically when scrolling
    mCardsListView.setOnScrollListener(new RenderOnScroll());
    // set the spinner index
    cardsColumn1Spinner.setSelection(mColumn1Index);
    cardsColumn2Spinner.setSelection(mColumn2Index);
    mCardsListView.setOnItemClickListener((parent, view, position, id) -> {
        if (mInMultiSelectMode) {
            // click on whole cell triggers select
            CheckBox cb = view.findViewById(R.id.card_checkbox);
            cb.toggle();
            onCheck(position, view);
        } else {
            // load up the card selected on the list
            long clickedCardId = getCards().get(position).getId();
            saveScrollingState(position);
            openNoteEditorForCard(clickedCardId);
        }
    });
    mCardsListView.setOnItemLongClickListener((adapterView, view, position, id) -> {
        if (mInMultiSelectMode) {
            boolean hasChanged = false;
            for (int i = Math.min(mLastSelectedPosition, position); i <= Math.max(mLastSelectedPosition, position); i++) {
                CardCache card = (CardCache) mCardsListView.getItemAtPosition(i);
                // Add to the set of checked cards
                hasChanged |= mCheckedCards.add(card);
            }
            if (hasChanged) {
                onSelectionChanged();
            }
        } else {
            mLastSelectedPosition = position;
            saveScrollingState(position);
            loadMultiSelectMode();
            // click on whole cell triggers select
            CheckBox cb = view.findViewById(R.id.card_checkbox);
            cb.toggle();
            onCheck(position, view);
            recenterListView(view);
            mCardsAdapter.notifyDataSetChanged();
        }
        return true;
    });
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    long deckId = getCol().getDecks().selected();
    mDeckSpinnerSelection = new DeckSpinnerSelection(this, col, this.findViewById(R.id.toolbar_spinner), true, false);
    mDeckSpinnerSelection.initializeActionBarDeckSpinner(this.getSupportActionBar());
    selectDeckAndSave(deckId);
    // If a valid value for last deck exists then use it, otherwise use libanki selected deck
    if (getLastDeckId() != null && getLastDeckId() == ALL_DECKS_ID) {
        selectAllDecks();
    } else if (getLastDeckId() != null && getCol().getDecks().get(getLastDeckId(), false) != null) {
        mDeckSpinnerSelection.selectDeckById(getLastDeckId(), false);
    } else {
        mDeckSpinnerSelection.selectDeckById(getCol().getDecks().selected(), false);
    }
}
Also used : SharedPreferences(android.content.SharedPreferences) Spinner(android.widget.Spinner) SearchView(androidx.appcompat.widget.SearchView) CardBrowserSearchView(com.ichi2.ui.CardBrowserSearchView) View(android.view.View) AdapterView(android.widget.AdapterView) TextView(android.widget.TextView) ListView(android.widget.ListView) AbsListView(android.widget.AbsListView) Column(com.ichi2.anki.CardBrowser.Column) CheckBox(android.widget.CheckBox) OnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener)

Example 15 with QUESTION

use of com.ichi2.anki.CardBrowser.Column.QUESTION in project Anki-Android by ankidroid.

the class ModelTest method test_cloze_mathjax.

@Test
public void test_cloze_mathjax() {
    Collection col = getCol();
    col.getModels().setCurrent(col.getModels().byName("Cloze"));
    Note note = col.newNote();
    note.setItem("Text", "{{c1::ok}} \\(2^2\\) {{c2::not ok}} \\(2^{{c3::2}}\\) \\(x^3\\) {{c4::blah}} {{c5::text with \\(x^2\\) jax}}");
    assertNotEquals(0, col.addNote(note));
    assertEquals(5, note.numberOfCards());
    assertThat(note.cards().get(0).q(), containsString("class=cloze"));
    assertThat(note.cards().get(1).q(), containsString("class=cloze"));
    assertThat(note.cards().get(2).q(), not(containsString("class=cloze")));
    assertThat(note.cards().get(3).q(), containsString("class=cloze"));
    assertThat(note.cards().get(4).q(), containsString("class=cloze"));
    note = col.newNote();
    note.setItem("Text", "\\(a\\) {{c1::b}} \\[ {{c1::c}} \\]");
    assertNotEquals(0, col.addNote(note));
    assertEquals(1, note.numberOfCards());
    String question = note.cards().get(0).q();
    assertTrue("Question «" + question + "» does not end correctly", question.endsWith("\\(a\\) <span class=cloze>[...]</span> \\[ [...] \\]"));
}
Also used : Matchers.containsString(org.hamcrest.Matchers.containsString) RobolectricTest(com.ichi2.anki.RobolectricTest) Test(org.junit.Test)

Aggregations

Test (org.junit.Test)7 RobolectricTest (com.ichi2.anki.RobolectricTest)6 Matchers.containsString (org.hamcrest.Matchers.containsString)6 JSONObject (com.ichi2.utils.JSONObject)4 SharedPreferences (android.content.SharedPreferences)3 View (android.view.View)3 TextView (android.widget.TextView)3 Matcher (java.util.regex.Matcher)3 Intent (android.content.Intent)2 AbsListView (android.widget.AbsListView)2 AdapterView (android.widget.AdapterView)2 OnItemSelectedListener (android.widget.AdapterView.OnItemSelectedListener)2 CheckBox (android.widget.CheckBox)2 LinearLayout (android.widget.LinearLayout)2 ListView (android.widget.ListView)2 Spinner (android.widget.Spinner)2 SearchView (androidx.appcompat.widget.SearchView)2 CardBrowser (com.ichi2.anki.CardBrowser)2 Column (com.ichi2.anki.CardBrowser.Column)2 ArrayList (java.util.ArrayList)2