Search code examples
androidgoogle-chrome-os

Override enter and space keys on Chromeos


First of all, this is not a duplicate question of this: How to override Android keyboard

My problem is a little bit different from the above one.

I'm playing music in the background in my app and I want to play/pause it if a user press to Enter or Space keys on any fragment or activity(I have only 1 activity) with a Chromebook's keyboard. I already implemented this and it works just fine. But there's a catch: When the user is focused on a button (ex: open X fragment), the Space or Enter key is firing the button's click event. So I want to override this.

Here's what I've tried:


Main Activity

public class MainActivity extends AppCompatActivity {
 ....
   @Override
   public boolean onKeyUp(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_SPACE || keyCode == KeyEvent.KEYCODE_ENTER) {
         BackingTrackFragment.newInstance().onKeyUp(keyCode, event);
         return true;
     }
      return super.onKeyUp(keyCode, event);
   }
}

My Fragment

public class SomeFragment extends BaseFragment implements KeyboardKeyEventListener {
    ...
 @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        // play/pause the song
        return true;
    }
}

Interface


public interface KeyboardKeyEventListener {
    boolean onKeyUp(int keyCode, KeyEvent event);
}


Solution

  • Overloading dispatchKeyEvent fixed the problem. It will prevent any and all the key events.

    Main Activity

     @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if (event.getKeyCode() == KeyEvent.KEYCODE_SPACE) {
                if (event.getAction() == KeyEvent.ACTION_UP) {
                    SomeFragment.newInstance().dispatchKeyEvent(event);
                    return false;
                }
            }
            return super.dispatchKeyEvent(event);
        }
    

    My Fragment

    public class SomeFragment extends BaseFragment implements KeyboardKeyEventListener {
        ...
     @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            // play/pause the song
            return true;
        }
    }
    

    The Interface for Overloading

    public interface KeyboardKeyEventListener {
        boolean dispatchKeyEvent(KeyEvent event);
    }