Skip to content

Commit 2947c4c

Browse files
lukstbitmikehardy
authored andcommitted
Add 'Previous card info' menu action in old reviewer
1 parent 87942d7 commit 2947c4c

File tree

11 files changed

+65
-1
lines changed

11 files changed

+65
-1
lines changed

AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,6 +1774,7 @@ abstract class AbstractFlashcardViewer :
17741774
ViewerCommand.TOGGLE_FLAG_PURPLE,
17751775
ViewerCommand.UNSET_FLAG,
17761776
ViewerCommand.CARD_INFO,
1777+
ViewerCommand.PREVIOUS_CARD_INFO,
17771778
ViewerCommand.ADD_NOTE,
17781779
ViewerCommand.RESCHEDULE_NOTE,
17791780
ViewerCommand.TOGGLE_AUTO_ADVANCE,

AnkiDroid/src/main/java/com/ichi2/anki/Reviewer.kt

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,15 @@ import com.ichi2.anki.settings.Prefs
117117
import com.ichi2.anki.snackbar.showSnackbar
118118
import com.ichi2.anki.ui.internationalization.toSentenceCase
119119
import com.ichi2.anki.ui.windows.reviewer.ReviewerFragment
120+
import com.ichi2.anki.utils.ext.cardStatsNoCardClean
120121
import com.ichi2.anki.utils.ext.flag
121122
import com.ichi2.anki.utils.ext.setUserFlagForCards
122123
import com.ichi2.anki.utils.ext.showDialogFragment
123124
import com.ichi2.anki.utils.navBarNeedsScrim
124125
import com.ichi2.anki.utils.remainingTime
125126
import com.ichi2.themes.Themes
126127
import com.ichi2.themes.Themes.currentTheme
128+
import com.ichi2.utils.BundleUtils.getNullableLong
127129
import com.ichi2.utils.HandlerUtils.executeFunctionWithDelay
128130
import com.ichi2.utils.HandlerUtils.getDefaultLooper
129131
import com.ichi2.utils.Permissions.canRecordAudio
@@ -157,6 +159,7 @@ open class Reviewer :
157159
private lateinit var colorPalette: LinearLayout
158160
private var toggleStylus = false
159161
private var isEraserMode = false
162+
private var previousCardId: CardId? = null
160163

161164
// A flag that determines if the SchedulingStates in CurrentQueueState are
162165
// safe to persist in the database when answering a card. This is used to
@@ -248,6 +251,7 @@ open class Reviewer :
248251
}
249252
startLoadingCollection()
250253
registerOnForgetHandler { listOf(currentCardId!!) }
254+
previousCardId = savedInstanceState?.getNullableLong(KEY_PREVIOUS_CARD_ID)
251255
}
252256

253257
override fun onPause() {
@@ -266,6 +270,11 @@ open class Reviewer :
266270
}
267271
}
268272

273+
override fun onSaveInstanceState(outState: Bundle) {
274+
super.onSaveInstanceState(outState)
275+
previousCardId?.let { outState.putLong(KEY_PREVIOUS_CARD_ID, it) }
276+
}
277+
269278
protected val flagToDisplay: Flag
270279
get() {
271280
return FlagToDisplay(
@@ -531,6 +540,10 @@ open class Reviewer :
531540
Timber.i("Card Viewer:: Card Info")
532541
openCardInfo()
533542
}
543+
R.id.action_previous_card_info -> {
544+
Timber.i("Card Viewer:: Previous Card Info")
545+
openPreviousCardInfo()
546+
}
534547
R.id.user_action_1 -> userAction(1)
535548
R.id.user_action_2 -> userAction(2)
536549
R.id.user_action_3 -> userAction(3)
@@ -802,6 +815,19 @@ open class Reviewer :
802815
startActivityWithAnimation(intent, animation)
803816
}
804817

818+
@NeedsTest("Starting animation from swipe is inverse to the finishing one")
819+
protected fun openPreviousCardInfo(fromGesture: Gesture? = null) {
820+
if (previousCardId == null) {
821+
showSnackbar(TR.cardStatsNoCardClean(), Snackbar.LENGTH_SHORT)
822+
return
823+
}
824+
Timber.i("opening previous card info")
825+
val intent = CardInfoDestination(previousCardId!!, TR.cardStatsPreviousCard(TR.decksStudy())).toIntent(this)
826+
val animation = getAnimationTransitionFromGesture(fromGesture)
827+
intent.putExtra(FINISH_ANIMATION_EXTRA, getInverseTransition(animation) as Parcelable)
828+
startActivityWithAnimation(intent, animation)
829+
}
830+
805831
// Related to https://github.com/ankidroid/Anki-Android/pull/11061#issuecomment-1107868455
806832
@NeedsTest("Order of operations needs Testing around Menu (Overflow) Icons and their colors.")
807833
override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -1189,13 +1215,15 @@ open class Reviewer :
11891215

11901216
override suspend fun answerCardInner(rating: Rating) {
11911217
val state = queueState!!
1192-
Timber.d("answerCardInner: ${currentCard!!.id} $rating")
1218+
val cardId = currentCard!!.id
1219+
Timber.d("answerCardInner: $cardId $rating")
11931220
var wasLeech = false
11941221
undoableOp(this) {
11951222
sched.answerCard(state, rating).also {
11961223
wasLeech = sched.stateIsLeech(state.states.again)
11971224
}
11981225
}.also {
1226+
previousCardId = cardId
11991227
if (rating == Rating.AGAIN && wasLeech) {
12001228
state.topCard.load(getColUnsafe)
12011229
val leechMessage: String =
@@ -1382,6 +1410,10 @@ open class Reviewer :
13821410
openCardInfo(fromGesture)
13831411
return true
13841412
}
1413+
ViewerCommand.PREVIOUS_CARD_INFO -> {
1414+
openPreviousCardInfo(fromGesture)
1415+
return true
1416+
}
13851417
ViewerCommand.RESCHEDULE_NOTE -> {
13861418
showDueDateDialog()
13871419
return true
@@ -1769,6 +1801,8 @@ open class Reviewer :
17691801
*/
17701802
const val EXTRA_DECK_ID = "deckId"
17711803

1804+
private const val KEY_PREVIOUS_CARD_ID = "key_previous_card_id"
1805+
17721806
private const val REQUEST_AUDIO_PERMISSION = 0
17731807
private const val ANIMATION_DURATION = 200
17741808
private const val TRANSPARENCY = 0.90f

AnkiDroid/src/main/java/com/ichi2/anki/analytics/UsageAnalytics.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ object UsageAnalytics {
546546
R.string.page_down_command_key,
547547
R.string.tag_command_key,
548548
R.string.card_info_command_key,
549+
R.string.previous_card_info_command_key,
549550
R.string.record_voice_command_key,
550551
R.string.replay_voice_command_key,
551552
R.string.save_voice_command_key,
@@ -597,6 +598,7 @@ object UsageAnalytics {
597598
R.string.custom_button_add_card_key,
598599
R.string.custom_button_replay_key,
599600
R.string.custom_button_card_info_key,
601+
R.string.custom_button_previous_card_info_key,
600602
R.string.custom_button_select_tts_key,
601603
R.string.custom_button_deck_options_key,
602604
R.string.custom_button_mark_card_key,

AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/ViewerCommand.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ enum class ViewerCommand : MappableAction<ReviewerBinding> {
5656
PAGE_DOWN,
5757
TAG,
5858
CARD_INFO,
59+
PREVIOUS_CARD_INFO,
5960
RECORD_VOICE,
6061
SAVE_VOICE,
6162
REPLAY_VOICE,
@@ -131,6 +132,10 @@ enum class ViewerCommand : MappableAction<ReviewerBinding> {
131132
SAVE_VOICE -> listOf(keyCode(KeyEvent.KEYCODE_S, CardSide.BOTH, shift()))
132133
UNDO -> listOf(keyCode(KeyEvent.KEYCODE_Z, CardSide.BOTH, ctrl()))
133134
REDO -> listOf(keyCode(KeyEvent.KEYCODE_Z, CardSide.BOTH, ModifierKeys(shift = true, ctrl = true, alt = false)))
135+
PREVIOUS_CARD_INFO ->
136+
listOf(
137+
keyCode(KeyEvent.KEYCODE_I, CardSide.BOTH, ModifierKeys(shift = false, ctrl = true, alt = true)),
138+
)
134139
TOGGLE_FLAG_RED ->
135140
listOf(
136141
keyCode(KeyEvent.KEYCODE_1, CardSide.BOTH, ctrl()),

AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ActionButtonStatus.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class ActionButtonStatus {
4141
setupButton(preferences, R.id.action_add_note_reviewer, "customButtonAddCard", MENU_DISABLED)
4242
setupButton(preferences, R.id.action_replay, "customButtonReplay", SHOW_AS_ACTION_IF_ROOM)
4343
setupButton(preferences, R.id.action_card_info, "customButtonCardInfo", MENU_DISABLED)
44+
setupButton(preferences, R.id.action_previous_card_info, "customButtonPreviousCardInfo", MENU_DISABLED)
4445
setupButton(preferences, R.id.action_clear_whiteboard, "customButtonClearWhiteboard", SHOW_AS_ACTION_IF_ROOM)
4546
setupButton(preferences, R.id.action_hide_whiteboard, "customButtonShowHideWhiteboard", SHOW_AS_ACTION_ALWAYS)
4647
setupButton(preferences, R.id.action_select_tts, "customButtonSelectTts", SHOW_AS_ACTION_NEVER)

AnkiDroid/src/main/res/menu/reviewer.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@
113113
android:icon="@drawable/ic_dialog_info"
114114
android:title="@string/card_info_title"
115115
ankidroid:showAsAction="never"/>
116+
<item
117+
android:id="@+id/action_previous_card_info"
118+
android:icon="@drawable/ic_outline_info_24"
119+
android:title="@string/previous_card_info_title"
120+
ankidroid:showAsAction="never"/>
116121
<item
117122
android:id="@+id/action_tag"
118123
android:icon="@drawable/ic_tag"

AnkiDroid/src/main/res/values/01-core.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@
156156

157157
<!-- card Info -->
158158
<string name="card_info_title" maxLength="28">Card info</string>
159+
<string name="previous_card_info_title" maxLength="28">Previous card info</string>
159160

160161
<!-- Permissions -->
161162
<string name="read_write_permission_label">Read and write to the AnkiDroid database</string>

AnkiDroid/src/main/res/values/preferences.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
<string name="custom_button_add_card_key">customButtonAddCard</string>
6868
<string name="custom_button_replay_key">customButtonReplay</string>
6969
<string name="custom_button_card_info_key">customButtonCardInfo</string>
70+
<string name="custom_button_previous_card_info_key">customButtonPreviousCardInfo</string>
7071
<string name="custom_button_select_tts_key">customButtonSelectTts</string>
7172
<string name="custom_button_deck_options_key">customButtonDeckOptions</string>
7273
<string name="custom_button_mark_card_key">customButtonMarkCard</string>
@@ -129,6 +130,7 @@
129130
<string name="statistics_command_key">binding_STATISTICS</string>
130131
<string name="tag_command_key">binding_TAG</string>
131132
<string name="card_info_command_key">binding_CARD_INFO</string>
133+
<string name="previous_card_info_command_key">binding_PREVIOUS_CARD_INFO</string>
132134
<string name="record_voice_command_key">binding_RECORD_VOICE</string>
133135
<string name="replay_voice_command_key">binding_REPLAY_VOICE</string>
134136
<string name="save_voice_command_key">binding_SAVE_VOICE</string>

AnkiDroid/src/main/res/xml/preferences_custom_buttons.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,13 @@ TODO: Add a unit test
9696
android:key="@string/custom_button_card_info_key"
9797
android:title="@string/card_info_title"
9898
app:useSimpleSummaryProvider="true"/>
99+
<ListPreference
100+
android:defaultValue="3"
101+
android:entries="@array/custom_button_labels"
102+
android:entryValues="@array/custom_button_values"
103+
android:key="@string/custom_button_previous_card_info_key"
104+
android:title="@string/previous_card_info_title"
105+
app:useSimpleSummaryProvider="true"/>
99106
<ListPreference
100107
android:defaultValue="0"
101108
android:entries="@array/custom_button_labels"

AnkiDroid/src/main/res/xml/preferences_reviewer_controls.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@
9595
<com.ichi2.preferences.ReviewerControlPreference
9696
android:key="@string/card_info_command_key"
9797
android:title="@string/card_info_title"
98+
android:icon="@drawable/ic_dialog_info"
99+
/>
100+
<com.ichi2.preferences.ReviewerControlPreference
101+
android:key="@string/previous_card_info_command_key"
102+
android:title="@string/previous_card_info_title"
98103
android:icon="@drawable/ic_outline_info_24"
99104
/>
100105
</PreferenceCategory>

0 commit comments

Comments
 (0)