Search in sources :

Example 91 with TaskData

use of com.ichi2.async.TaskData in project AnkiChinaAndroid by ankichinateam.

the class StudyOptionsFragment method refreshInterface.

/**
 * Rebuild the fragment's interface to reflect the status of the currently selected deck.
 *
 * @param resetSched    Indicates whether to rebuild the queues as well. Set to true for any
 *                      task that modifies queues (e.g., unbury or empty filtered deck).
 * @param resetDecklist Indicates whether to call back to the parent activity in order to
 *                      also refresh the deck list.
 */
protected void refreshInterface(boolean resetSched, boolean resetDecklist) {
    Timber.d("Refreshing StudyOptionsFragment");
    // Load the deck counts for the deck from Collection asynchronously
    if (resetDecklist) {
        mInitCollapsedStatus = false;
    }
    CollectionTask.launchCollectionTask(UPDATE_VALUES_FROM_DECK, getCollectionTaskListener(resetDecklist), new TaskData(new Object[] { resetSched }));
}
Also used : TaskData(com.ichi2.async.TaskData)

Example 92 with TaskData

use of com.ichi2.async.TaskData 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)

Example 93 with TaskData

use of com.ichi2.async.TaskData in project AnkiChinaAndroid by ankichinateam.

the class TemporaryModel method saveToDatabase.

public void saveToDatabase(TaskListener listener) {
    Timber.d("saveToDatabase() called");
    dumpChanges();
    TemporaryModel.clearTempModelFiles();
    TaskData args = new TaskData(new Object[] { mEditedModel, getAdjustedTemplateChanges() });
    CollectionTask.launchCollectionTask(SAVE_MODEL, listener, args);
}
Also used : TaskData(com.ichi2.async.TaskData)

Example 94 with TaskData

use of com.ichi2.async.TaskData in project AnkiChinaAndroid by ankichinateam.

the class ModelBrowser method deleteModel.

/*
     * Deletes the currently selected model
     */
private void deleteModel() throws ConfirmModSchemaException {
    CollectionTask.launchCollectionTask(DELETE_MODEL, deleteModelHandler(), new TaskData(mCurrentID));
    mModels.remove(mModelListPosition);
    mModelIds.remove(mModelListPosition);
    mModelDisplayList.remove(mModelListPosition);
    mCardCounts.remove(mModelListPosition);
    refreshList();
}
Also used : TaskData(com.ichi2.async.TaskData)

Example 95 with TaskData

use of com.ichi2.async.TaskData in project AnkiChinaAndroid by ankichinateam.

the class ModelFieldEditor method sortByField.

/*
     * Changes the sort field (that displays in card browser) to the current field
     */
private void sortByField() {
    changeHandler listener = changeFieldHandler();
    try {
        mCol.modSchema();
        CollectionTask.launchCollectionTask(CHANGE_SORT_FIELD, listener, new TaskData(new Object[] { mMod, mCurrentPos }));
    } catch (ConfirmModSchemaException e) {
        // Handler mMod schema confirmation
        ConfirmationDialog c = new ConfirmationDialog();
        c.setArgs(getResources().getString(R.string.full_sync_confirmation));
        Runnable confirm = () -> {
            mCol.modSchemaNoCheck();
            CollectionTask.launchCollectionTask(CHANGE_SORT_FIELD, listener, new TaskData(new Object[] { mMod, mCurrentPos }));
            dismissContextMenu();
        };
        c.setConfirm(confirm);
        c.setCancel(mConfirmDialogCancel);
        ModelFieldEditor.this.showDialogFragment(c);
    }
}
Also used : ConfirmModSchemaException(com.ichi2.anki.exception.ConfirmModSchemaException) JSONObject(com.ichi2.utils.JSONObject) TaskData(com.ichi2.async.TaskData) ConfirmationDialog(com.ichi2.anki.dialogs.ConfirmationDialog)

Aggregations

Collection (com.ichi2.libanki.Collection)67 TaskData (com.ichi2.async.TaskData)46 JSONObject (com.ichi2.utils.JSONObject)35 Card (com.ichi2.libanki.Card)16 JSONException (com.ichi2.utils.JSONException)15 ArrayList (java.util.ArrayList)14 JSONObject (org.json.JSONObject)13 Resources (android.content.res.Resources)12 HashMap (java.util.HashMap)12 SharedPreferences (android.content.SharedPreferences)11 Deck (com.ichi2.libanki.Deck)11 Intent (android.content.Intent)10 View (android.view.View)9 TextView (android.widget.TextView)9 ConfirmationDialog (com.ichi2.anki.dialogs.ConfirmationDialog)9 TaskListener (com.ichi2.async.TaskListener)9 Map (java.util.Map)9 VisibleForTesting (androidx.annotation.VisibleForTesting)8 CollectionTask (com.ichi2.async.CollectionTask)8 IOException (java.io.IOException)8