Search in sources :

Example 1 with REORDER

use of com.ichi2.async.CollectionTask.TASK_TYPE.REORDER in project AnkiChinaAndroid by ankichinateam.

the class SelfStudyActivity method removeNotesView.

/**
 * Removes cards from view. Doesn't delete them in model (database).
 *
 * @param reorderCards Whether to rearrange the positions of checked items (DEFECT: Currently deselects all)
 */
private void removeNotesView(java.util.Collection<Long> cardsIds, boolean reorderCards) {
    long reviewerCardId = getReviewerCardId();
    List<CardCache> oldMCards = getCards();
    Map<Long, Integer> idToPos = getPositionMap(oldMCards);
    Set<Long> idToRemove = new HashSet<Long>();
    for (Long cardId : cardsIds) {
        if (cardId == reviewerCardId) {
            mReloadRequired = true;
        }
        if (idToPos.containsKey(cardId)) {
            idToRemove.add(cardId);
        }
    }
    List<CardCache> newMCards = new ArrayList<>();
    int pos = 0;
    for (CardCache card : oldMCards) {
        if (!idToRemove.contains(card.getId())) {
            newMCards.add(new CardCache(card, pos++));
        }
    }
    mCards = newMCards;
    if (reorderCards) {
        // Suboptimal from a UX perspective, we should reorder
        // but this is only hit on a rare sad path and we'd need to rejig the data structures to allow an efficient
        // search
        Timber.w("Removing current selection due to unexpected removal of cards");
    }
    updateList();
}
Also used : CardCache(com.ichi2.anki.CardBrowser.CardCache) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet)

Example 2 with REORDER

use of com.ichi2.async.CollectionTask.TASK_TYPE.REORDER in project AnkiChinaAndroid by ankichinateam.

the class CollectionTask method doInBackgroundConfChange.

private TaskData doInBackgroundConfChange(TaskData param) {
    Timber.d("doInBackgroundConfChange");
    Collection col = getCol();
    Object[] data = param.getObjArray();
    Deck deck = (Deck) data[0];
    DeckConfig conf = (DeckConfig) data[1];
    try {
        long newConfId = conf.getLong("id");
        // If new config has a different sorting order, reorder the cards
        int oldOrder = col.getDecks().getConf(deck.getLong("conf")).getJSONObject("new").getInt("order");
        int newOrder = col.getDecks().getConf(newConfId).getJSONObject("new").getInt("order");
        if (oldOrder != newOrder) {
            switch(newOrder) {
                case 0:
                    col.getSched().randomizeCards(deck.getLong("id"));
                    break;
                case 1:
                    col.getSched().orderCards(deck.getLong("id"));
                    break;
            }
        }
        col.getDecks().setConf(deck, newConfId);
        col.save();
        return new TaskData(true);
    } catch (JSONException e) {
        return new TaskData(false);
    }
}
Also used : Collection(com.ichi2.libanki.Collection) Deck(com.ichi2.libanki.Deck) JSONException(com.ichi2.utils.JSONException) JSONObject(com.ichi2.utils.JSONObject) DeckConfig(com.ichi2.libanki.DeckConfig)

Example 3 with REORDER

use of com.ichi2.async.CollectionTask.TASK_TYPE.REORDER in project Anki-Android by Ramblurr.

the class DeckTask method doInBackgroundConfChange.

private TaskData doInBackgroundConfChange(TaskData... params) {
    // Log.i(AnkiDroidApp.TAG, "doInBackgroundConfChange");
    Object[] data = params[0].getObjArray();
    Collection col = (Collection) data[0];
    JSONObject deck = (JSONObject) data[1];
    JSONObject conf = (JSONObject) data[2];
    try {
        long newConfId = conf.getLong("id");
        // If new config has a different sorting order, reorder the cards
        int oldOrder = col.getDecks().getConf(deck.getLong("conf")).getJSONObject("new").getInt("order");
        int newOrder = col.getDecks().getConf(newConfId).getJSONObject("new").getInt("order");
        if (oldOrder != newOrder) {
            switch(newOrder) {
                case 0:
                    col.getSched().randomizeCards(deck.getLong("id"));
                    break;
                case 1:
                    col.getSched().orderCards(deck.getLong("id"));
                    break;
            }
        }
        col.getDecks().setConf(deck, newConfId);
        return new TaskData(true);
    } catch (JSONException e) {
        return new TaskData(false);
    }
}
Also used : JSONObject(org.json.JSONObject) Collection(com.ichi2.libanki.Collection) JSONException(org.json.JSONException) JSONObject(org.json.JSONObject)

Example 4 with REORDER

use of com.ichi2.async.CollectionTask.TASK_TYPE.REORDER in project AnkiChinaAndroid by ankichinateam.

the class StudySettingActivity method onClick.

@Override
public void onClick(View v) {
    int id = v.getId();
    CustomStyleDialog customDialog = null;
    switch(id) {
        case R.id.rl_max_learn_card:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("每日新卡上限").setEditorText(tx_max_learn_card.getText().toString(), "学习一段时间后,未来每天新卡+复习卡约180张,大约需30分钟").addSingleTextChangedListener(new CustomStyleDialog.Builder.MyTextWatcher() {

                @Override
                public void beforeTextChanged(Dialog dialog, CharSequence s, int start, int count, int after) {
                }

                @Override
                public void onTextChanged(Dialog dialog, CharSequence s, int start, int before, int count) {
                    if (s.toString().isEmpty()) {
                        ((CustomStyleDialog) dialog).getSingleEditorModeHintView().setText("未来每天学习量=新卡数x6");
                    } else {
                        try {
                            int num = Integer.parseInt(s.toString()) * 6;
                            int time = num * 10 / 60;
                            ((CustomStyleDialog) dialog).getSingleEditorModeHintView().setText(String.format("学习一段时间后,未来每天新卡+复习卡约%s张,大约需%s分钟", num, time));
                        } catch (Exception e) {
                            e.printStackTrace();
                            UIUtils.showThemedToast(StudySettingActivity.this, "请填写0至9999之间的数值", false);
                        }
                    }
                }

                @Override
                public void afterTextChanged(Dialog dialog, Editable s) {
                }
            }).setPositiveButton("确认", (dialog, which) -> {
                try {
                    int num = Integer.parseInt(((CustomStyleDialog) dialog).getEditorText());
                    Timber.i("edit num:%s", num);
                    if (num >= 0 && num <= 9999) {
                        mOptions.getJSONObject("new").put("perDay", num);
                        saveAndUpdateValues();
                        dialog.dismiss();
                    } else {
                        UIUtils.showThemedToast(this, "请填写0至9999之间的数值", false);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    UIUtils.showThemedToast(this, "请填写0至9999之间的数值", false);
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_max_review_card:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("每日复习数上限").setEditorText(tx_max_review_card.getText().toString(), "建议设置为最大9999,有多少复习多少").setPositiveButton("确认", (dialog, which) -> {
                try {
                    int num = Integer.parseInt(((CustomStyleDialog) dialog).getEditorText());
                    Timber.i("edit num:%s", num);
                    if (num >= 0 && num <= 9999) {
                        mOptions.getJSONObject("rev").put("perDay", num);
                        saveAndUpdateValues();
                        dialog.dismiss();
                    } else {
                        UIUtils.showThemedToast(this, "请填写0至9999之间的数值", false);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    UIUtils.showThemedToast(this, "请填写0至9999之间的数值", false);
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_deck_conf_max_ivl:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("最大时间间隔").setEditorText(tx_max_review_card.getText().toString(), "").setPositiveButton("确认", (dialog, which) -> {
                try {
                    int num = Integer.parseInt(((CustomStyleDialog) dialog).getEditorText());
                    Timber.i("edit num:%s", num);
                    if (num >= 0 && num <= 99999) {
                        mOptions.getJSONObject("rev").put("maxIvl", num);
                        saveAndUpdateValues();
                        dialog.dismiss();
                    } else {
                        UIUtils.showThemedToast(this, "请填写0至99999之间的数值", false);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    UIUtils.showThemedToast(this, "请填写0至99999之间的数值", false);
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_interval_step:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("间隔的步伐(以分钟计)").setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_CLASS_TEXT).setEditorText(tx_interval_step.getText().toString(), "").setPositiveButton("确认", (dialog, which) -> {
                String num = ((CustomStyleDialog) dialog).getEditorText();
                String validated = getValidatedStepsInput(num);
                if (validated == null) {
                    UIUtils.showThemedToast(this, getResources().getString(R.string.steps_error), false);
                } else if (TextUtils.isEmpty(validated)) {
                    UIUtils.showThemedToast(this, getResources().getString(R.string.steps_min_error), false);
                } else {
                    mOptions.getJSONObject("new").put("delays", convertToJSON(num));
                    saveAndUpdateValues();
                    Timber.i("edit num:%s", num);
                    dialog.dismiss();
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_interval_graduate:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("毕业时间间隔(以天计)").setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_CLASS_TEXT).setEditorText(tx_interval_graduate.getText().toString(), "").setPositiveButton("确认", (dialog, which) -> {
                try {
                    int num = Integer.parseInt(((CustomStyleDialog) dialog).getEditorText());
                    Timber.i("edit num:%s", num);
                    if (num >= 1 && num <= 99) {
                        // [graduating, easy]
                        JSONArray newInts = new JSONArray();
                        newInts.put(num);
                        newInts.put(mOptions.getJSONObject("new").getJSONArray("ints").getInt(1));
                        mOptions.getJSONObject("new").put("ints", newInts);
                        saveAndUpdateValues();
                        dialog.dismiss();
                    } else {
                        UIUtils.showThemedToast(this, "请填写1至99之间的数值", false);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    UIUtils.showThemedToast(this, "请填写1至99之间的数值", false);
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_interval_simple:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("简单按钮对应的时间间隔").setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_CLASS_TEXT).setEditorText(tx_interval_simple.getText().toString(), "").setPositiveButton("确认", (dialog, which) -> {
                try {
                    int num = Integer.parseInt(((CustomStyleDialog) dialog).getEditorText());
                    Timber.i("edit num:%s", num);
                    if (num >= 1 && num <= 99) {
                        JSONArray newInts = new JSONArray();
                        // 
                        newInts.put(mOptions.getJSONObject("new").getJSONArray("ints").getInt(0));
                        newInts.put(num);
                        mOptions.getJSONObject("new").put("ints", newInts);
                        saveAndUpdateValues();
                        dialog.dismiss();
                    } else {
                        UIUtils.showThemedToast(this, "请填写1至99之间的数值", false);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    UIUtils.showThemedToast(this, "请填写1至99之间的数值", false);
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_init_level:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("初始难度").setEditorText(tx_init_level.getText().toString(), "").setPositiveButton("确认", (dialog, which) -> {
                try {
                    int num = Integer.parseInt(((CustomStyleDialog) dialog).getEditorText());
                    Timber.i("edit num:%s", num);
                    if (num >= 100 && num <= 999) {
                        mOptions.getJSONObject("new").put("initialFactor", num * 10);
                        saveAndUpdateValues();
                        dialog.dismiss();
                    } else {
                        UIUtils.showThemedToast(this, "请填写100至999之间的数值", false);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    UIUtils.showThemedToast(this, "请填写1至99之间的数值", false);
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_new_card_sequence:
            final int[] selectPosition = { mCurrentNewOrderValue };
            customDialog = new CustomStyleDialog.Builder(this).setTitle("新卡顺序").setSelectListModeCallback(new CustomStyleDialog.Builder.SelectListModeCallback() {

                @Override
                public String[] getItemContent() {
                    return mNewOrderLabels;
                }

                @Override
                public String[] getItemHint() {
                    return new String[0];
                }

                @Override
                public int getDefaultSelectedPosition() {
                    return selectPosition[0];
                }

                @Override
                public void onItemSelect(int position) {
                    selectPosition[0] = position;
                }
            }).setPositiveButton("确认", (dialog, which) -> {
                int oldValue = mOptions.getJSONObject("new").getInt("order");
                if (oldValue != selectPosition[0]) {
                    mOptions.getJSONObject("new").put("order", selectPosition[0]);
                    CollectionTask.launchCollectionTask(REORDER, new ConfChangeHandler(StudySettingActivity.this), new TaskData(new Object[] { mOptions }));
                }
                dialog.dismiss();
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            customDialog.show();
            break;
        case R.id.rl_learn_sequence:
            final int[] selectPosition3 = { mCurrentStudyPreferenceValue };
            customDialog = new CustomStyleDialog.Builder(this).setTitle("学习顺序").setSelectListModeCallback(new CustomStyleDialog.Builder.SelectListModeCallback() {

                @Override
                public String[] getItemContent() {
                    return mStudyPreferenceLabels;
                }

                @Override
                public String[] getItemHint() {
                    return new String[0];
                }

                @Override
                public int getDefaultSelectedPosition() {
                    return selectPosition3[0];
                }

                @Override
                public void onItemSelect(int position) {
                    selectPosition3[0] = position;
                }
            }).setPositiveButton("确认", (dialog, which) -> {
                int oldValue = mCol.getConf().getInt("newSpread");
                if (oldValue != selectPosition3[0]) {
                    mCol.getConf().put("newSpread", selectPosition3[0]);
                    mCol.setMod();
                    CollectionTask.launchCollectionTask(REORDER, new ConfChangeHandler(StudySettingActivity.this), new TaskData(new Object[] { mOptions }));
                }
                dialog.dismiss();
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            customDialog.show();
            break;
        case R.id.rl_medal_simple:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("回答简单的时间间隔增加比例").setEditorText(tx_medal_simple.getText().toString(), "").setPositiveButton("确认", (dialog, which) -> {
                try {
                    int num = Integer.parseInt(((CustomStyleDialog) dialog).getEditorText());
                    Timber.i("edit num:%s", num);
                    if (num >= 100 && num <= 1000) {
                        mOptions.getJSONObject("rev").put("ease4", (Integer) num / 100.0f);
                        saveAndUpdateValues();
                        dialog.dismiss();
                    } else {
                        UIUtils.showThemedToast(this, "请填写100至1000之间的数值", false);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    UIUtils.showThemedToast(this, "请填写100至1000之间的数值", false);
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_interval_decoration:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("时间间隔因子").setEditorText(tx_interval_decoration.getText().toString(), "").setPositiveButton("确认", (dialog, which) -> {
                try {
                    int num = Integer.parseInt(((CustomStyleDialog) dialog).getEditorText());
                    Timber.i("edit num: " + num / 100.0f);
                    if (num >= 0 && num <= 999) {
                        mOptions.getJSONObject("rev").put("ivlFct", num / 100.0f);
                        saveAndUpdateValues();
                        dialog.dismiss();
                    } else {
                        UIUtils.showThemedToast(this, "请填写0至999之间的数值", false);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    UIUtils.showThemedToast(this, "请填写0至999之间的数值", false);
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_error_interval_step:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("间隔的步伐(以分钟计)").setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_CLASS_TEXT).setEditorText(tx_error_interval_step.getText().toString(), "").setPositiveButton("确认", (dialog, which) -> {
                String num = ((CustomStyleDialog) dialog).getEditorText();
                String validated = getValidatedStepsInput(num);
                if (validated == null) {
                    UIUtils.showThemedToast(this, getResources().getString(R.string.steps_error), false);
                } else {
                    mOptions.getJSONObject("lapse").put("delays", StepsPreference.convertToJSON(num));
                    saveAndUpdateValues();
                    Timber.i("edit num:%s", num);
                    dialog.dismiss();
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_error_new_interval:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("新的时间间隔").setEditorText(tx_error_new_interval.getText().toString(), "").setPositiveButton("确认", (dialog, which) -> {
                try {
                    int num = Integer.parseInt(((CustomStyleDialog) dialog).getEditorText());
                    Timber.i("edit num:%s", num);
                    if (num >= 0 && num <= 100) {
                        mOptions.getJSONObject("lapse").put("mult", num / 100.0f);
                        saveAndUpdateValues();
                        dialog.dismiss();
                    } else {
                        UIUtils.showThemedToast(this, "请填写0至100之间的数值", false);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    UIUtils.showThemedToast(this, "请填写0至100之间的数值", false);
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.rl_error_min_interval:
            customDialog = new CustomStyleDialog.Builder(this).setTitle("最小时间间隔(天)").setEditorText(tx_error_min_interval.getText().toString(), "").setPositiveButton("确认", (dialog, which) -> {
                try {
                    int num = Integer.parseInt(((CustomStyleDialog) dialog).getEditorText());
                    Timber.i("edit num:%s", num);
                    if (num >= 1 && num <= 99) {
                        mOptions.getJSONObject("lapse").put("minInt", num);
                        saveAndUpdateValues();
                        dialog.dismiss();
                    } else {
                        UIUtils.showThemedToast(this, "请填写1至99之间的数值", false);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    UIUtils.showThemedToast(this, "请填写1至99之间的数值", false);
                }
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            Timber.i("build a dialog!");
            customDialog.show();
            break;
        case R.id.ll_algorithm:
            final int[] selectPosition4 = { mCurrentMindModeValue };
            customDialog = new CustomStyleDialog.Builder(this).setTitle("选择记忆模式").setSelectListModeCallback(new CustomStyleDialog.Builder.SelectListModeCallback() {

                @Override
                public String[] getItemContent() {
                    return mMindModeLabels;
                }

                @Override
                public String[] getItemHint() {
                    return mMindModeHints;
                }

                @Override
                public int getDefaultSelectedPosition() {
                    return selectPosition4[0];
                }

                @Override
                public void onItemSelect(int position) {
                    selectPosition4[0] = position;
                }
            }).setPositiveButton("确认", (dialog, which) -> {
                SharedPreferences sharedPreferences = getSharedPreferences(STUDY_SETTING, 0);
                String oldValue = sharedPreferences.getString(KEY_MIND_MODE, "");
                // Timber.i("看看保存成什么样子了 %s ", oldValue);
                Map<String, Integer> oldMap = null;
                Gson gson = new Gson();
                try {
                    oldMap = gson.fromJson(oldValue, Map.class);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (oldMap == null) {
                    oldMap = new HashMap<>();
                }
                for (long did : getDeckIds(mDeckId, getCol())) {
                    // Timber.i("看看都是什么id %s,%s", did, selectPosition4[0]);
                    oldMap.put(String.valueOf(did), selectPosition4[0]);
                }
                String newValue = gson.toJson(oldMap);
                sharedPreferences.edit().putString(KEY_MIND_MODE, newValue).apply();
                mSavedMaxNewCardNum = mOptions.getJSONObject("new").getInt("perDay");
                mSavedMaxRevCardNum = mOptions.getJSONObject("rev").getInt("perDay");
                CollectionTask.launchCollectionTask(CONF_RESET, new ConfChangeHandler(StudySettingActivity.this, selectPosition4[0]), // 先恢复默认,即长记模式
                new TaskData(new Object[] { mOptions }));
                dialog.dismiss();
            }).setNegativeButton("取消", (dialog, which) -> dialog.dismiss()).create();
            customDialog.show();
            break;
    }
}
Also used : LinearLayout(android.widget.LinearLayout) Bundle(android.os.Bundle) KeyEvent(android.view.KeyEvent) TypeToken(com.google.gson.reflect.TypeToken) Deck(com.ichi2.libanki.Deck) NonNull(androidx.annotation.NonNull) Dialog(android.app.Dialog) HashMap(java.util.HashMap) StepsPreference.convertToJSON(com.ichi2.preferences.StepsPreference.convertToJSON) Collection(com.ichi2.libanki.Collection) Editable(android.text.Editable) TypedArray(android.content.res.TypedArray) JSONArray(com.ichi2.utils.JSONArray) StepsPreference(com.ichi2.preferences.StepsPreference) Gson(com.google.gson.Gson) DeckConfig(com.ichi2.libanki.DeckConfig) Map(java.util.Map) View(android.view.View) TaskData(com.ichi2.async.TaskData) ContextCompat(androidx.core.content.ContextCompat) REORDER(com.ichi2.async.CollectionTask.TASK_TYPE.REORDER) InputType(android.text.InputType) TextUtils(android.text.TextUtils) CollectionTask(com.ichi2.async.CollectionTask) JSONObject(com.ichi2.utils.JSONObject) Timber(timber.log.Timber) StudyOptionsFragment.getDeckIds(com.ichi2.anki.StudyOptionsFragment.getDeckIds) IdRes(androidx.annotation.IdRes) CONF_RESET(com.ichi2.async.CollectionTask.TASK_TYPE.CONF_RESET) TextView(android.widget.TextView) SharedPreferences(android.content.SharedPreferences) RelativeLayout(android.widget.RelativeLayout) Toolbar(androidx.appcompat.widget.Toolbar) TaskListenerWithContext(com.ichi2.async.TaskListenerWithContext) ActivityTransitionAnimation(com.ichi2.anim.ActivityTransitionAnimation) CustomStyleDialog(com.ichi2.ui.CustomStyleDialog) SharedPreferences(android.content.SharedPreferences) HashMap(java.util.HashMap) JSONArray(com.ichi2.utils.JSONArray) Gson(com.google.gson.Gson) TaskData(com.ichi2.async.TaskData) CustomStyleDialog(com.ichi2.ui.CustomStyleDialog) Dialog(android.app.Dialog) CustomStyleDialog(com.ichi2.ui.CustomStyleDialog) Editable(android.text.Editable) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

Collection (com.ichi2.libanki.Collection)3 Deck (com.ichi2.libanki.Deck)2 DeckConfig (com.ichi2.libanki.DeckConfig)2 JSONObject (com.ichi2.utils.JSONObject)2 Dialog (android.app.Dialog)1 SharedPreferences (android.content.SharedPreferences)1 TypedArray (android.content.res.TypedArray)1 Bundle (android.os.Bundle)1 Editable (android.text.Editable)1 InputType (android.text.InputType)1 TextUtils (android.text.TextUtils)1 KeyEvent (android.view.KeyEvent)1 View (android.view.View)1 LinearLayout (android.widget.LinearLayout)1 RelativeLayout (android.widget.RelativeLayout)1 TextView (android.widget.TextView)1 IdRes (androidx.annotation.IdRes)1 NonNull (androidx.annotation.NonNull)1 Toolbar (androidx.appcompat.widget.Toolbar)1 ContextCompat (androidx.core.content.ContextCompat)1