From ebd845ff8d462180a4584b0019db32a964fedaca Mon Sep 17 00:00:00 2001 From: Alexi <38815390+alyoshenka@users.noreply.github.com> Date: Sun, 27 Nov 2022 06:08:20 -0800 Subject: [PATCH] Make undo button work in StudyOptions (#12852) --- .../main/java/com/ichi2/anki/StudyOptionsFragment.kt | 7 +++++++ .../java/com/ichi2/ui/RtlCompliantActionProvider.kt | 11 ++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsFragment.kt index eca543626c8e..51ac3e5e61df 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsFragment.kt @@ -31,6 +31,7 @@ import androidx.annotation.VisibleForTesting import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.Toolbar import androidx.core.text.HtmlCompat +import androidx.core.view.MenuItemCompat import androidx.fragment.app.Fragment import com.ichi2.anim.ActivityTransitionAnimation import com.ichi2.anim.ActivityTransitionAnimation.slide @@ -48,6 +49,7 @@ import com.ichi2.libanki.Collection import com.ichi2.libanki.Consts import com.ichi2.libanki.Decks import com.ichi2.libanki.Utils +import com.ichi2.ui.RtlCompliantActionProvider import com.ichi2.utils.FragmentFactoryUtils.instantiate import com.ichi2.utils.HtmlUtils.convertNewlinesToHtml import com.ichi2.utils.KotlinCleanup @@ -384,6 +386,11 @@ class StudyOptionsFragment : Fragment(), Toolbar.OnMenuItemClickListener { } // Switch on or off unbury depending on if there are cards to unbury menu.findItem(R.id.action_unbury).isVisible = col != null && col!!.sched.haveBuried() + // Set the proper click target for the undo button's ActionProvider + val undoActionProvider: RtlCompliantActionProvider? = MenuItemCompat.getActionProvider( + menu.findItem(R.id.action_undo) + ) as? RtlCompliantActionProvider + undoActionProvider?.clickHandler = { _, menuItem -> onMenuItemClick(menuItem) } // Switch on or off undo depending on whether undo is available if (col == null || !col!!.undoAvailable()) { menu.findItem(R.id.action_undo).isVisible = false diff --git a/AnkiDroid/src/main/java/com/ichi2/ui/RtlCompliantActionProvider.kt b/AnkiDroid/src/main/java/com/ichi2/ui/RtlCompliantActionProvider.kt index 7fc24cc57da6..2bc51373c404 100644 --- a/AnkiDroid/src/main/java/com/ichi2/ui/RtlCompliantActionProvider.kt +++ b/AnkiDroid/src/main/java/com/ichi2/ui/RtlCompliantActionProvider.kt @@ -30,6 +30,15 @@ class RtlCompliantActionProvider(context: Context) : ActionProviderCompat(contex @VisibleForTesting val mActivity: Activity + /** + * The action to perform when clicking the associated menu item. By default this delegates to + * the activity's [Activity.onOptionsItemSelected] callback, but a custom action can be set and + * used instead. + */ + var clickHandler: (Activity, MenuItem) -> Unit = { activity, menuItem -> + activity.onOptionsItemSelected(menuItem) + } + override fun onCreateActionView(forItem: MenuItem): View { val actionView = ImageButton(context, null, R.attr.actionButtonStyle) TooltipCompat.setTooltipText(actionView, forItem.title) @@ -42,7 +51,7 @@ class RtlCompliantActionProvider(context: Context) : ActionProviderCompat(contex if (!forItem.isEnabled) { return@setOnClickListener } - mActivity.onOptionsItemSelected(forItem) + clickHandler(mActivity, forItem) } return actionView }