From 91b20bb25c9b412efe76966b550249508f405c81 Mon Sep 17 00:00:00 2001 From: Song Eric Yu Li Date: Fri, 3 Jul 2026 17:34:14 -0400 Subject: [PATCH] refactor: use MenuProvider in StudyOptionsActivity, remove starting reviewer in undo Move to using the modern MenuProvider system for the undo button in StudyOptionsActivity. Also, removed starting the reviewer when undo is clicked, addressing a pending TODO comment. It was initially added here https://github.com/ankidroid/Anki-Android/commit/3e7ad6a9e6 but doesn't match Desktop behavior. I think it's probably safe to delete, tested it and I see now issues. Assisted-by: Claude Sonnet 4.5 --- .../com/ichi2/anki/StudyOptionsActivity.kt | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsActivity.kt index e2558911dc1c..0f7e4c8877f0 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsActivity.kt @@ -18,8 +18,10 @@ package com.ichi2.anki import android.content.Intent import android.os.Bundle import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem import androidx.core.view.MenuItemCompat +import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope @@ -62,6 +64,7 @@ class StudyOptionsActivity : loadStudyOptionsFragment() } setResult(RESULT_OK) + addMenuProvider(menuProvider) setFragmentResultListener(REQUEST_KEY) { _, bundle -> when (CustomStudyAction.fromBundle(bundle)) { @@ -91,10 +94,40 @@ class StudyOptionsActivity : ) addToBackStack(null) } - invalidateOptionsMenu() + invalidateMenu() } } + private val menuProvider: MenuProvider = + object : MenuProvider { + override fun onCreateMenu( + menu: Menu, + menuInflater: MenuInflater, + ) { + menuInflater.inflate(R.menu.activity_study_options, menu) + val undoMenuItem = menu.findItem(R.id.action_undo) + val undoActionProvider = MenuItemCompat.getActionProvider(undoMenuItem) as? RtlCompliantActionProvider + undoActionProvider?.clickHandler = { _, menuItem -> onMenuItemSelected(menuItem) } + } + + override fun onPrepareMenu(menu: Menu) { + val undoMenuItem = menu.findItem(R.id.action_undo) + undoMenuItem.isVisible = undoState.hasAction && (currentFragment is StudyOptionsFragment) + undoMenuItem.title = undoState.label + } + + override fun onMenuItemSelected(item: MenuItem): Boolean = + when (item.itemId) { + R.id.action_undo -> { + launchCatchingTask { + undoAndShowSnackbar() + } + true + } + else -> false + } + } + private fun loadStudyOptionsFragment() { val currentFragment = StudyOptionsFragment() supportFragmentManager.commit { @@ -105,39 +138,6 @@ class StudyOptionsActivity : private val currentFragment: Fragment? get() = supportFragmentManager.findFragmentById(R.id.studyoptions_frame) - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.activity_study_options, menu) - val undoMenuItem = menu.findItem(R.id.action_undo) - val undoActionProvider = MenuItemCompat.getActionProvider(undoMenuItem) as? RtlCompliantActionProvider - // Set the proper click target for the undo button's ActionProvider - undoActionProvider?.clickHandler = { _, menuItem -> onOptionsItemSelected(menuItem) } - undoMenuItem.isVisible = undoState.hasAction && (currentFragment is StudyOptionsFragment) - undoMenuItem.title = undoState.label - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - android.R.id.home -> { - onBackPressedDispatcher.onBackPressed() - true - } - R.id.action_undo -> { - launchCatchingTask { - undoAndShowSnackbar() - // TODO why are we going to the Reviewer from here? Desktop doesn't do this - Reviewer - .getIntent(this@StudyOptionsActivity) - .apply { flags = Intent.FLAG_ACTIVITY_FORWARD_RESULT } - .also { startActivity(it) } - finish() - } - true - } - else -> return super.onOptionsItemSelected(item) - } - } - override fun onResume() { super.onResume() refreshUndoState() @@ -162,7 +162,7 @@ class StudyOptionsActivity : } if (undoState != newUndoState) { undoState = newUndoState - invalidateOptionsMenu() + invalidateMenu() } } }