@@ -19,6 +19,7 @@ import android.animation.Animator
1919import android.content.Context
2020import android.content.res.ColorStateList
2121import android.provider.Settings
22+ import android.view.KeyEvent
2223import android.view.MotionEvent
2324import android.view.View
2425import android.widget.LinearLayout
@@ -355,6 +356,21 @@ class DeckPickerFloatingActionMenu(
355356 return animDuration != 0f && animTransition != 0f && animWindow != 0f
356357 }
357358
359+ private fun createActivationKeyListener (
360+ logMessage : String ,
361+ action : () -> Unit ,
362+ ): View .OnKeyListener =
363+ View .OnKeyListener { _, keyCode, event ->
364+ if (event.action == KeyEvent .ACTION_DOWN &&
365+ (keyCode == KeyEvent .KEYCODE_ENTER || keyCode == KeyEvent .KEYCODE_DPAD_CENTER )
366+ ) {
367+ Timber .d(logMessage)
368+ action()
369+ return @OnKeyListener true
370+ }
371+ false
372+ }
373+
358374 init {
359375 val addSharedButton: FloatingActionButton = view.findViewById(R .id.add_shared_action)
360376 val addDeckButton: FloatingActionButton = view.findViewById(R .id.add_deck_action)
@@ -380,6 +396,32 @@ class DeckPickerFloatingActionMenu(
380396 }
381397 },
382398 )
399+
400+ // Enable keyboard activation for Enter/DPAD_CENTER/ESC keys
401+ fabMain.setOnKeyListener { _, keyCode, event ->
402+ if (event.action == KeyEvent .ACTION_DOWN ) {
403+ when (keyCode) {
404+ KeyEvent .KEYCODE_ENTER , KeyEvent .KEYCODE_DPAD_CENTER -> {
405+ Timber .d(" FAB main button: ENTER key pressed" )
406+ if (! isFABOpen) {
407+ showFloatingActionMenu()
408+ } else {
409+ addNote()
410+ }
411+ return @setOnKeyListener true
412+ }
413+ KeyEvent .KEYCODE_ESCAPE -> {
414+ if (isFABOpen) {
415+ Timber .d(" FAB main button: ESC key pressed - closing menu" )
416+ closeFloatingActionMenu(applyRiseAndShrinkAnimation = true )
417+ return @setOnKeyListener true
418+ }
419+ }
420+ }
421+ }
422+ false
423+ }
424+
383425 fabBGLayout.setOnClickListener { closeFloatingActionMenu(applyRiseAndShrinkAnimation = true ) }
384426 val addDeckListener =
385427 View .OnClickListener {
@@ -390,6 +432,17 @@ class DeckPickerFloatingActionMenu(
390432 }
391433 addDeckButton.setOnClickListener(addDeckListener)
392434 addDeckLabel.setOnClickListener(addDeckListener)
435+
436+ // Enable keyboard activation for Enter/DPAD_CENTER keys
437+ val addDeckKeyListener =
438+ createActivationKeyListener(" Add Deck button: ENTER key pressed" ) {
439+ if (isFABOpen) {
440+ closeFloatingActionMenu(applyRiseAndShrinkAnimation = false )
441+ deckPicker.showCreateDeckDialog()
442+ }
443+ }
444+ addDeckButton.setOnKeyListener(addDeckKeyListener)
445+ addDeckLabel.setOnKeyListener(addDeckKeyListener)
393446 val addFilteredDeckListener =
394447 View .OnClickListener {
395448 if (isFABOpen) {
@@ -399,6 +452,17 @@ class DeckPickerFloatingActionMenu(
399452 }
400453 addFilteredDeckButton.setOnClickListener(addFilteredDeckListener)
401454 addFilteredDeckLabel.setOnClickListener(addFilteredDeckListener)
455+
456+ // Enable keyboard activation for Enter/DPAD_CENTER keys
457+ val addFilteredDeckKeyListener =
458+ createActivationKeyListener(" Add Filtered Deck button: ENTER key pressed" ) {
459+ if (isFABOpen) {
460+ closeFloatingActionMenu(applyRiseAndShrinkAnimation = false )
461+ deckPicker.showCreateFilteredDeckDialog()
462+ }
463+ }
464+ addFilteredDeckButton.setOnKeyListener(addFilteredDeckKeyListener)
465+ addFilteredDeckLabel.setOnKeyListener(addFilteredDeckKeyListener)
402466 val addSharedListener =
403467 View .OnClickListener {
404468 if (isFABOpen) {
@@ -409,6 +473,17 @@ class DeckPickerFloatingActionMenu(
409473 }
410474 addSharedButton.setOnClickListener(addSharedListener)
411475 addSharedLabel.setOnClickListener(addSharedListener)
476+
477+ // Enable keyboard activation for Enter/DPAD_CENTER keys
478+ val addSharedKeyListener =
479+ createActivationKeyListener(" Add Shared Deck button: ENTER key pressed" ) {
480+ if (isFABOpen) {
481+ closeFloatingActionMenu(applyRiseAndShrinkAnimation = false )
482+ deckPicker.openAnkiWebSharedDecks()
483+ }
484+ }
485+ addSharedButton.setOnKeyListener(addSharedKeyListener)
486+ addSharedLabel.setOnKeyListener(addSharedKeyListener)
412487 val addNoteLabelListener =
413488 View .OnClickListener {
414489 if (isFABOpen) {
@@ -418,6 +493,16 @@ class DeckPickerFloatingActionMenu(
418493 }
419494 }
420495 addNote.setOnClickListener(addNoteLabelListener)
496+
497+ // Enable keyboard activation for Enter/DPAD_CENTER keys
498+ addNote.setOnKeyListener(
499+ createActivationKeyListener(" Add Note label: ENTER key pressed" ) {
500+ if (isFABOpen) {
501+ closeFloatingActionMenu(applyRiseAndShrinkAnimation = false )
502+ addNote()
503+ }
504+ },
505+ )
421506 }
422507
423508 /* *
0 commit comments