Search in sources :

Example 6 with Consumer

use of com.ichi2.utils.FunctionalInterfaces.Consumer in project AnkiChinaAndroid by ankichinateam.

the class CardBrowser method onOptionsItemSelected.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // (when another operation will be performed on the model, it will undo the latest operation)
    if (mUndoSnackbar != null && mUndoSnackbar.isShown()) {
        mUndoSnackbar.dismiss();
    }
    switch(item.getItemId()) {
        case android.R.id.home:
            endMultiSelectMode();
            return true;
        case R.id.action_add_note_from_card_browser:
            {
                Intent intent = new Intent(CardBrowser.this, NoteEditor.class);
                intent.putExtra(NoteEditor.EXTRA_CALLER, NoteEditor.CALLER_CARDBROWSER_ADD);
                startActivityForResultWithAnimation(intent, ADD_NOTE, ActivityTransitionAnimation.LEFT);
                return true;
            }
        case R.id.action_save_search:
            {
                String searchTerms = mSearchView.getQuery().toString();
                showDialogFragment(CardBrowserMySearchesDialog.newInstance(null, mMySearchesDialogListener, searchTerms, CardBrowserMySearchesDialog.CARD_BROWSER_MY_SEARCHES_TYPE_SAVE));
                return true;
            }
        case R.id.action_list_my_searches:
            {
                JSONObject savedFiltersObj = getCol().getConf().optJSONObject("savedFilters");
                HashMap<String, String> savedFilters = new HashMap<>();
                if (savedFiltersObj != null) {
                    Iterator<String> it = savedFiltersObj.keys();
                    while (it.hasNext()) {
                        String searchName = it.next();
                        savedFilters.put(searchName, savedFiltersObj.optString(searchName));
                    }
                }
                showDialogFragment(CardBrowserMySearchesDialog.newInstance(savedFilters, mMySearchesDialogListener, "", CardBrowserMySearchesDialog.CARD_BROWSER_MY_SEARCHES_TYPE_LIST));
                return true;
            }
        case R.id.action_sort_by_size:
            showDialogFragment(CardBrowserOrderDialog.newInstance(mOrder, mOrderAsc, mOrderDialogListener));
            return true;
        case R.id.action_show_marked:
            mSearchTerms = "tag:marked";
            mSearchView.setQuery("", false);
            mSearchView.setQueryHint(getResources().getString(R.string.card_browser_show_marked));
            searchCards();
            return true;
        case R.id.action_show_suspended:
            mSearchTerms = "is:suspended";
            mSearchView.setQuery("", false);
            mSearchView.setQueryHint(getResources().getString(R.string.card_browser_show_suspended));
            searchCards();
            return true;
        case R.id.action_search_by_tag:
            showTagsDialog();
            return true;
        case R.id.action_flag_zero:
            flagTask(0);
            return true;
        case R.id.action_flag_one:
            flagTask(1);
            return true;
        case R.id.action_flag_two:
            flagTask(2);
            return true;
        case R.id.action_flag_three:
            flagTask(3);
            return true;
        case R.id.action_flag_four:
            flagTask(4);
            return true;
        case R.id.action_delete_card:
            if (mInMultiSelectMode) {
                CollectionTask.launchCollectionTask(DISMISS_MULTI, mDeleteNoteHandler, new TaskData(new Object[] { getSelectedCardIds(), Collection.DismissType.DELETE_NOTE_MULTI }));
                mCheckedCards.clear();
                endMultiSelectMode();
                mCardsAdapter.notifyDataSetChanged();
            }
            return true;
        case R.id.action_mark_card:
            CollectionTask.launchCollectionTask(DISMISS_MULTI, markCardHandler(), new TaskData(new Object[] { getSelectedCardIds(), Collection.DismissType.MARK_NOTE_MULTI }));
            return true;
        case R.id.action_suspend_card:
            CollectionTask.launchCollectionTask(DISMISS_MULTI, suspendCardHandler(), new TaskData(new Object[] { getSelectedCardIds(), Collection.DismissType.SUSPEND_CARD_MULTI }));
            return true;
        case R.id.action_change_deck:
            {
                AlertDialog.Builder builderSingle = new AlertDialog.Builder(this);
                builderSingle.setTitle(getString(R.string.move_all_to_deck));
                // WARNING: changeDeck depends on this index, so any changes should be reflected there.
                final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.dropdown_deck_item);
                for (Deck deck : getValidDecksForChangeDeck()) {
                    try {
                        arrayAdapter.add(deck.getString("name"));
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                builderSingle.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                builderSingle.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        changeDeck(which);
                    }
                });
                builderSingle.show();
                return true;
            }
        case R.id.action_undo:
            if (getCol().undoAvailable()) {
                CollectionTask.launchCollectionTask(UNDO, mUndoHandler);
            }
            return true;
        case R.id.action_select_none:
            onSelectNone();
            return true;
        case R.id.action_select_all:
            onSelectAll();
            return true;
        case R.id.action_preview:
            {
                Intent previewer = new Intent(CardBrowser.this, Previewer.class);
                if (mInMultiSelectMode && checkedCardCount() > 1) {
                    // Multiple cards have been explicitly selected, so preview only those cards
                    previewer.putExtra("index", 0);
                    previewer.putExtra("cardList", getSelectedCardIds());
                } else {
                    // Preview all cards, starting from the one that is currently selected
                    int startIndex = mCheckedCards.isEmpty() ? 0 : mCheckedCards.iterator().next().getPosition();
                    previewer.putExtra("index", startIndex);
                    previewer.putExtra("cardList", getAllCardIds());
                }
                startActivityForResultWithoutAnimation(previewer, PREVIEW_CARDS);
                return true;
            }
        case R.id.action_reset_cards_progress:
            {
                Timber.i("NoteEditor:: Reset progress button pressed");
                // Show confirmation dialog before resetting card progress
                ConfirmationDialog dialog = new ConfirmationDialog();
                String title = getString(R.string.reset_card_dialog_title);
                String message = getString(R.string.reset_card_dialog_message);
                dialog.setArgs(title, message);
                Runnable confirm = () -> {
                    Timber.i("CardBrowser:: ResetProgress button pressed");
                    CollectionTask.launchCollectionTask(DISMISS_MULTI, resetProgressCardHandler(), new TaskData(new Object[] { getSelectedCardIds(), Collection.DismissType.RESET_CARDS }));
                };
                dialog.setConfirm(confirm);
                showDialogFragment(dialog);
                return true;
            }
        case R.id.action_reschedule_cards:
            {
                Timber.i("CardBrowser:: Reschedule button pressed");
                long[] selectedCardIds = getSelectedCardIds();
                FunctionalInterfaces.Consumer<Integer> consumer = newDays -> CollectionTask.launchCollectionTask(DISMISS_MULTI, rescheduleCardHandler(), new TaskData(new Object[] { selectedCardIds, Collection.DismissType.RESCHEDULE_CARDS, newDays }));
                RescheduleDialog rescheduleDialog;
                if (selectedCardIds.length == 1) {
                    long cardId = selectedCardIds[0];
                    Card selected = getCol().getCard(cardId);
                    rescheduleDialog = RescheduleDialog.rescheduleSingleCard(getResources(), selected, consumer);
                } else {
                    rescheduleDialog = RescheduleDialog.rescheduleMultipleCards(getResources(), consumer, selectedCardIds.length);
                }
                showDialogFragment(rescheduleDialog);
                return true;
            }
        case R.id.action_reposition_cards:
            {
                Timber.i("CardBrowser:: Reposition button pressed");
                // Only new cards may be repositioned
                long[] cardIds = getSelectedCardIds();
                for (int i = 0; i < cardIds.length; i++) {
                    if (getCol().getCard(cardIds[i]).getQueue() != Consts.CARD_TYPE_NEW) {
                        SimpleMessageDialog dialog = SimpleMessageDialog.newInstance(getString(R.string.vague_error), getString(R.string.reposition_card_not_new_error), false);
                        showDialogFragment(dialog);
                        return false;
                    }
                }
                IntegerDialog repositionDialog = new IntegerDialog();
                repositionDialog.setArgs(getString(R.string.reposition_card_dialog_title), getString(R.string.reposition_card_dialog_message), 5);
                repositionDialog.setCallbackRunnable(days -> CollectionTask.launchCollectionTask(DISMISS_MULTI, repositionCardHandler(), new TaskData(new Object[] { cardIds, Collection.DismissType.REPOSITION_CARDS, days })));
                showDialogFragment(repositionDialog);
                return true;
            }
        case R.id.action_edit_note:
            {
                openNoteEditorForCurrentlySelectedNote();
            }
        default:
            return super.onOptionsItemSelected(item);
    }
}
Also used : AlertDialog(android.app.AlertDialog) Arrays(java.util.Arrays) Bundle(android.os.Bundle) TagsDialog(com.ichi2.anki.dialogs.TagsDialog) Deck(com.ichi2.libanki.Deck) NonNull(androidx.annotation.NonNull) WindowManager(android.view.WindowManager) Compat(com.ichi2.compat.Compat) ConfirmationDialog(com.ichi2.anki.dialogs.ConfirmationDialog) Permissions(com.ichi2.utils.Permissions) FunctionalInterfaces(com.ichi2.utils.FunctionalInterfaces) ActionBar(androidx.appcompat.app.ActionBar) Decks(com.ichi2.libanki.Decks) CheckBox(android.widget.CheckBox) Locale(java.util.Locale) Handler(android.os.Handler) Map(java.util.Map) JSONException(com.ichi2.utils.JSONException) View(android.view.View) TaskData(com.ichi2.async.TaskData) AdapterView(android.widget.AdapterView) Media(com.ichi2.libanki.Media) CardBrowserMySearchesDialog(com.ichi2.anki.dialogs.CardBrowserMySearchesDialog) Upgrade(com.ichi2.upgrade.Upgrade) IntentFilter(android.content.IntentFilter) Set(java.util.Set) SearchView(androidx.appcompat.widget.SearchView) JSONObject(com.ichi2.utils.JSONObject) BroadcastReceiver(android.content.BroadcastReceiver) ViewGroup(android.view.ViewGroup) Timber(timber.log.Timber) AlertDialog(android.app.AlertDialog) Objects(java.util.Objects) List(java.util.List) Nullable(androidx.annotation.Nullable) TextView(android.widget.TextView) OnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener) BaseAdapter(android.widget.BaseAdapter) Consts(com.ichi2.libanki.Consts) CompatHelper(com.ichi2.compat.CompatHelper) Toolbar(androidx.appcompat.widget.Toolbar) TaskListenerWithContext(com.ichi2.async.TaskListenerWithContext) ListView(android.widget.ListView) Pattern(java.util.regex.Pattern) MaterialDialog(com.afollestad.materialdialogs.MaterialDialog) Snackbar(com.google.android.material.snackbar.Snackbar) Typeface(android.graphics.Typeface) Context(android.content.Context) Pair(android.util.Pair) Intent(android.content.Intent) SystemClock(android.os.SystemClock) RescheduleDialog(com.ichi2.anki.dialogs.RescheduleDialog) HashMap(java.util.HashMap) SdCardReceiver(com.ichi2.anki.receiver.SdCardReceiver) Collection(com.ichi2.libanki.Collection) Column(com.ichi2.anki.CardBrowser.Column) MenuItem(android.view.MenuItem) ArrayList(java.util.ArrayList) TASK_TYPE(com.ichi2.async.CollectionTask.TASK_TYPE) HashSet(java.util.HashSet) DeckDropDownAdapter(com.ichi2.anki.widgets.DeckDropDownAdapter) WidgetStatus(com.ichi2.widget.WidgetStatus) Menu(android.view.Menu) SimpleMessageDialog(com.ichi2.anki.dialogs.SimpleMessageDialog) Utils(com.ichi2.libanki.Utils) LinkedHashSet(java.util.LinkedHashSet) DialogInterface(android.content.DialogInterface) IntegerDialog(com.ichi2.anki.dialogs.IntegerDialog) CheckResult(androidx.annotation.CheckResult) Iterator(java.util.Iterator) LayoutInflater(android.view.LayoutInflater) TextUtils(android.text.TextUtils) AbsListView(android.widget.AbsListView) CollectionTask(com.ichi2.async.CollectionTask) Themes(com.ichi2.themes.Themes) Spinner(android.widget.Spinner) ArrayAdapter(android.widget.ArrayAdapter) SharedPreferences(android.content.SharedPreferences) TypedValue(android.util.TypedValue) SECONDS_PER_DAY(com.ichi2.libanki.stats.Stats.SECONDS_PER_DAY) LanguageUtil(com.ichi2.utils.LanguageUtil) Card(com.ichi2.libanki.Card) VisibleForTesting(androidx.annotation.VisibleForTesting) ActivityTransitionAnimation(com.ichi2.anim.ActivityTransitionAnimation) Collections(java.util.Collections) CardBrowserOrderDialog(com.ichi2.anki.dialogs.CardBrowserOrderDialog) HashMap(java.util.HashMap) DialogInterface(android.content.DialogInterface) TaskData(com.ichi2.async.TaskData) ConfirmationDialog(com.ichi2.anki.dialogs.ConfirmationDialog) RescheduleDialog(com.ichi2.anki.dialogs.RescheduleDialog) Iterator(java.util.Iterator) SimpleMessageDialog(com.ichi2.anki.dialogs.SimpleMessageDialog) Deck(com.ichi2.libanki.Deck) JSONException(com.ichi2.utils.JSONException) Intent(android.content.Intent) Card(com.ichi2.libanki.Card) JSONObject(com.ichi2.utils.JSONObject) IntegerDialog(com.ichi2.anki.dialogs.IntegerDialog) JSONObject(com.ichi2.utils.JSONObject) ArrayAdapter(android.widget.ArrayAdapter)

Example 7 with Consumer

use of com.ichi2.utils.FunctionalInterfaces.Consumer in project Anki-Android by ankidroid.

the class Collection method fixIntegrity.

/**
 * Fix possible problems and rebuild caches.
 */
public CheckDatabaseResult fixIntegrity(TaskManager.ProgressCallback<String> progressCallback) {
    File file = new File(mPath);
    CheckDatabaseResult result = new CheckDatabaseResult(file.length());
    final int[] currentTask = { 1 };
    // a few fixes are in all-models loops, the rest are one-offs
    int totalTasks = (getModels().all().size() * 4) + 27;
    Runnable notifyProgress = () -> fixIntegrityProgress(progressCallback, currentTask[0]++, totalTasks);
    Consumer<FunctionalInterfaces.FunctionThrowable<Runnable, List<String>, JSONException>> executeIntegrityTask = function -> {
        // DEFECT: notifyProgress will lag if an exception is thrown.
        try {
            mDb.getDatabase().beginTransaction();
            result.addAll(function.apply(notifyProgress));
            mDb.getDatabase().setTransactionSuccessful();
        } catch (Exception e) {
            Timber.e(e, "Failed to execute integrity check");
            AnkiDroidApp.sendExceptionReport(e, "fixIntegrity");
        } finally {
            try {
                mDb.getDatabase().endTransaction();
            } catch (Exception e) {
                Timber.e(e, "Failed to end integrity check transaction");
                AnkiDroidApp.sendExceptionReport(e, "fixIntegrity - endTransaction");
            }
        }
    };
    try {
        mDb.getDatabase().beginTransaction();
        save();
        notifyProgress.run();
        if (!mDb.getDatabase().isDatabaseIntegrityOk()) {
            return result.markAsFailed();
        }
        mDb.getDatabase().setTransactionSuccessful();
    } catch (SQLiteDatabaseLockedException ex) {
        Timber.w(ex, "doInBackgroundCheckDatabase - Database locked");
        return result.markAsLocked();
    } catch (RuntimeException e) {
        Timber.e(e, "doInBackgroundCheckDatabase - RuntimeException on marking card");
        AnkiDroidApp.sendExceptionReport(e, "doInBackgroundCheckDatabase");
        return result.markAsFailed();
    } finally {
        // if the database was locked, we never got the transaction.
        if (mDb.getDatabase().inTransaction()) {
            mDb.getDatabase().endTransaction();
        }
    }
    executeIntegrityTask.accept(this::deleteNotesWithMissingModel);
    // for each model
    for (Model m : getModels().all()) {
        executeIntegrityTask.accept((callback) -> deleteCardsWithInvalidModelOrdinals(callback, m));
        executeIntegrityTask.accept((callback) -> deleteNotesWithWrongFieldCounts(callback, m));
    }
    executeIntegrityTask.accept(this::deleteNotesWithMissingCards);
    executeIntegrityTask.accept(this::deleteCardsWithMissingNotes);
    executeIntegrityTask.accept(this::removeOriginalDuePropertyWhereInvalid);
    executeIntegrityTask.accept(this::removeDynamicPropertyFromNonDynamicDecks);
    executeIntegrityTask.accept(this::removeDeckOptionsFromDynamicDecks);
    executeIntegrityTask.accept(this::resetInvalidDeckOptions);
    executeIntegrityTask.accept(this::rebuildTags);
    executeIntegrityTask.accept(this::updateFieldCache);
    executeIntegrityTask.accept(this::fixNewCardDuePositionOverflow);
    executeIntegrityTask.accept(this::resetNewCardInsertionPosition);
    executeIntegrityTask.accept(this::fixExcessiveReviewDueDates);
    // v2 sched had a bug that could create decimal intervals
    executeIntegrityTask.accept(this::fixDecimalCardsData);
    executeIntegrityTask.accept(this::fixDecimalRevLogData);
    executeIntegrityTask.accept(this::restoreMissingDatabaseIndices);
    executeIntegrityTask.accept(this::ensureModelsAreNotEmpty);
    executeIntegrityTask.accept((progressNotifier) -> this.ensureCardsHaveHomeDeck(progressNotifier, result));
    // and finally, optimize (unable to be done inside transaction).
    try {
        optimize(notifyProgress);
    } catch (Exception e) {
        Timber.e(e, "optimize");
        AnkiDroidApp.sendExceptionReport(e, "fixIntegrity - optimize");
    }
    file = new File(mPath);
    long newSize = file.length();
    result.setNewSize(newSize);
    // if any problems were found, force a full sync
    if (result.hasProblems()) {
        modSchemaNoCheck();
    }
    logProblems(result.getProblems());
    return result;
}
Also used : TemplateRenderOutput(com.ichi2.libanki.TemplateManager.TemplateRenderContext.TemplateRenderOutput) Arrays(java.util.Arrays) TaskManager(com.ichi2.async.TaskManager) NonNull(androidx.annotation.NonNull) UsageAnalytics(com.ichi2.anki.analytics.UsageAnalytics) AbstractSched(com.ichi2.libanki.sched.AbstractSched) Random(java.util.Random) DroidBackend(com.ichi2.libanki.backend.DroidBackend) Time(com.ichi2.libanki.utils.Time) FunctionalInterfaces(com.ichi2.utils.FunctionalInterfaces) ParsedNode(com.ichi2.libanki.template.ParsedNode) KotlinCleanup(com.ichi2.utils.KotlinCleanup) SupportSQLiteDatabase(androidx.sqlite.db.SupportSQLiteDatabase) Locale(java.util.Locale) UIUtils(com.ichi2.anki.UIUtils) Map(java.util.Map) CancelListener.isCancelled(com.ichi2.async.CancelListener.isCancelled) JSONException(com.ichi2.utils.JSONException) SQLiteDatabaseLockedException(android.database.sqlite.SQLiteDatabaseLockedException) PrintWriter(java.io.PrintWriter) Upgrade(com.ichi2.upgrade.Upgrade) HashUtil(com.ichi2.utils.HashUtil) GregorianCalendar(java.util.GregorianCalendar) Set(java.util.Set) JSONObject(com.ichi2.utils.JSONObject) Timber(timber.log.Timber) CancelListener(com.ichi2.async.CancelListener) Contract(org.jetbrains.annotations.Contract) List(java.util.List) BackendNotSupportedException(com.ichi2.libanki.backend.exception.BackendNotSupportedException) Nullable(androidx.annotation.Nullable) AnkiDroidApp(com.ichi2.anki.AnkiDroidApp) ContentValues(android.content.ContentValues) UnknownDatabaseVersionException(com.ichi2.libanki.exception.UnknownDatabaseVersionException) Pattern(java.util.regex.Pattern) VersionUtils(com.ichi2.utils.VersionUtils) RustCleanup(net.ankiweb.rsdroid.RustCleanup) Context(android.content.Context) Pair(android.util.Pair) R(com.ichi2.anki.R) HashMap(java.util.HashMap) Sched(com.ichi2.libanki.sched.Sched) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) SuppressLint(android.annotation.SuppressLint) JSONArray(com.ichi2.utils.JSONArray) Calendar(java.util.Calendar) ProgressSender(com.ichi2.async.ProgressSender) ChessFilter(com.ichi2.libanki.hooks.ChessFilter) SupportSQLiteStatement(androidx.sqlite.db.SupportSQLiteStatement) Cursor(android.database.Cursor) ConfirmModSchemaException(com.ichi2.anki.exception.ConfirmModSchemaException) CheckResult(androidx.annotation.CheckResult) BufferedWriter(java.io.BufferedWriter) FileWriter(java.io.FileWriter) SchedV2(com.ichi2.libanki.sched.SchedV2) TextUtils(android.text.TextUtils) CollectionTask(com.ichi2.async.CollectionTask) TemplateError(com.ichi2.libanki.template.TemplateError) IOException(java.io.IOException) File(java.io.File) Consumer(java.util.function.Consumer) NoSuchDeckException(com.ichi2.libanki.exception.NoSuchDeckException) LinkedBlockingDeque(java.util.concurrent.LinkedBlockingDeque) Collections(java.util.Collections) VisibleForTesting(androidx.annotation.VisibleForTesting) Resources(android.content.res.Resources) SQLiteDatabaseLockedException(android.database.sqlite.SQLiteDatabaseLockedException) SuppressLint(android.annotation.SuppressLint) JSONException(com.ichi2.utils.JSONException) SQLiteDatabaseLockedException(android.database.sqlite.SQLiteDatabaseLockedException) BackendNotSupportedException(com.ichi2.libanki.backend.exception.BackendNotSupportedException) UnknownDatabaseVersionException(com.ichi2.libanki.exception.UnknownDatabaseVersionException) ConfirmModSchemaException(com.ichi2.anki.exception.ConfirmModSchemaException) IOException(java.io.IOException) NoSuchDeckException(com.ichi2.libanki.exception.NoSuchDeckException) File(java.io.File)

Example 8 with Consumer

use of com.ichi2.utils.FunctionalInterfaces.Consumer in project Anki-Android by ankidroid.

the class Reviewer method showRescheduleCardDialog.

private void showRescheduleCardDialog() {
    Consumer<Integer> runnable = days -> {
        List<Long> cardIds = Collections.singletonList(mCurrentCard.getId());
        new SchedulerService.RescheduleCards(cardIds, days).runWithHandler(scheduleCollectionTaskHandler(R.plurals.reschedule_cards_dialog_acknowledge));
    };
    RescheduleDialog dialog = RescheduleDialog.rescheduleSingleCard(getResources(), mCurrentCard, runnable);
    showDialogFragment(dialog);
}
Also used : JavascriptInterface(android.webkit.JavascriptInterface) LinearLayout(android.widget.LinearLayout) COMMAND_NOTHING(com.ichi2.anki.cardviewer.ViewerCommand.COMMAND_NOTHING) Bundle(android.os.Bundle) MenuItemCompat(androidx.core.view.MenuItemCompat) PackageManager(android.content.pm.PackageManager) AnswerTimer(com.ichi2.anki.reviewer.AnswerTimer) NonNull(androidx.annotation.NonNull) AutomaticAnswerAction(com.ichi2.anki.reviewer.AutomaticAnswerAction) FrameLayout(android.widget.FrameLayout) ImageView(android.widget.ImageView) UnderlineSpan(android.text.style.UnderlineSpan) Animator(android.animation.Animator) DrawableRes(androidx.annotation.DrawableRes) Drawable(android.graphics.drawable.Drawable) ConfirmationDialog(com.ichi2.anki.dialogs.ConfirmationDialog) VectorDrawableCompat(androidx.vectordrawable.graphics.drawable.VectorDrawableCompat) Permissions(com.ichi2.utils.Permissions) ColorStateList(android.content.res.ColorStateList) COMMAND_EXIT(com.ichi2.anki.cardviewer.ViewerCommand.COMMAND_EXIT) ActionBar(androidx.appcompat.app.ActionBar) Manifest(android.Manifest) Decks(com.ichi2.libanki.Decks) ViewerCommand(com.ichi2.anki.cardviewer.ViewerCommand) AndroidUiUtils(com.ichi2.utils.AndroidUiUtils) Handler(android.os.Handler) PluralsRes(androidx.annotation.PluralsRes) View(android.view.View) ActionButtons(com.ichi2.anki.reviewer.ActionButtons) WebView(android.webkit.WebView) ContextCompat(androidx.core.content.ContextCompat) CardMarker(com.ichi2.anki.reviewer.CardMarker) TaskListenerBuilder(com.ichi2.anki.servicelayer.TaskListenerBuilder) AnimatorListenerAdapter(android.animation.AnimatorListenerAdapter) SubMenu(android.view.SubMenu) ViewGroup(android.view.ViewGroup) Timber(timber.log.Timber) IdRes(androidx.annotation.IdRes) List(java.util.List) Unit(kotlin.Unit) TextView(android.widget.TextView) Nullable(androidx.annotation.Nullable) Message(android.os.Message) Consts(com.ichi2.libanki.Consts) Gesture(com.ichi2.anki.cardviewer.Gesture) AudioView(com.ichi2.anki.multimediacard.AudioView) Context(android.content.Context) NextCard(com.ichi2.anki.servicelayer.SchedulerService.NextCard) ViewGroupUtils(com.ichi2.utils.ViewGroupUtils) KeyEvent(android.view.KeyEvent) ResourcesCompat(androidx.core.content.res.ResourcesCompat) HandlerUtils(com.ichi2.utils.HandlerUtils) Direction(com.ichi2.anim.ActivityTransitionAnimation.Direction) Counts(com.ichi2.libanki.sched.Counts) Intent(android.content.Intent) RescheduleDialog(com.ichi2.anki.dialogs.RescheduleDialog) Collection(com.ichi2.libanki.Collection) AnswerButtons(com.ichi2.anki.reviewer.AnswerButtons) MenuItem(android.view.MenuItem) MenuRes(androidx.annotation.MenuRes) SuppressLint(android.annotation.SuppressLint) WidgetStatus(com.ichi2.widget.WidgetStatus) PeripheralKeymap(com.ichi2.anki.reviewer.PeripheralKeymap) Menu(android.view.Menu) CardAppearance(com.ichi2.anki.cardviewer.CardAppearance) Build(android.os.Build) WeakReference(java.lang.ref.WeakReference) Utils(com.ichi2.libanki.Utils) NoteService(com.ichi2.anki.servicelayer.NoteService) CheckResult(androidx.annotation.CheckResult) Computation(com.ichi2.utils.Computation) SpannableString(android.text.SpannableString) ActivityCompat(androidx.core.app.ActivityCompat) MenuBuilder(androidx.appcompat.view.menu.MenuBuilder) ReviewerUi(com.ichi2.anki.reviewer.ReviewerUi) Themes(com.ichi2.themes.Themes) File(java.io.File) Consumer(java.util.function.Consumer) SharedPreferences(android.content.SharedPreferences) ActionProvider(androidx.core.view.ActionProvider) FirefoxSnackbarWorkaround(com.ichi2.anki.workarounds.FirefoxSnackbarWorkaround) Card(com.ichi2.libanki.Card) VisibleForTesting(androidx.annotation.VisibleForTesting) FullScreenMode(com.ichi2.anki.reviewer.FullScreenMode) Collections(java.util.Collections) SchedulerService(com.ichi2.anki.servicelayer.SchedulerService) RescheduleDialog(com.ichi2.anki.dialogs.RescheduleDialog) ColorStateList(android.content.res.ColorStateList) List(java.util.List)

Aggregations

NonNull (androidx.annotation.NonNull)8 VisibleForTesting (androidx.annotation.VisibleForTesting)8 Timber (timber.log.Timber)8 Intent (android.content.Intent)7 Bundle (android.os.Bundle)7 CheckResult (androidx.annotation.CheckResult)7 Permissions (com.ichi2.utils.Permissions)7 Context (android.content.Context)6 SharedPreferences (android.content.SharedPreferences)5 Menu (android.view.Menu)5 MenuItem (android.view.MenuItem)5 View (android.view.View)5 ViewGroup (android.view.ViewGroup)5 Themes (com.ichi2.themes.Themes)5 Handler (android.os.Handler)4 TextUtils (android.text.TextUtils)4 TypedValue (android.util.TypedValue)4 TextView (android.widget.TextView)4 Nullable (androidx.annotation.Nullable)4 ActionBar (androidx.appcompat.app.ActionBar)4