/** * Calls from {@link Activity#onKeyUp(int, KeyEvent)} to delegate * @param keyCode event key code * @param event key event * @return true if is intercepted as navigation, false otherwise */ public boolean onKeyUp(int keyCode, KeyEvent event) { if (!mEnabled) { return false; } boolean notLongPress = (event.getFlags() & KeyEvent.FLAG_CANCELED_LONG_PRESS) == 0; if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && notLongPress) { shortPress(DIRECTION_UP); return true; } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN && notLongPress) { shortPress(DIRECTION_DOWN); return true; } return false; }
@Test public void testOnKeyUp() { KeyEvent keyEvent = mock(KeyEvent.class); when(keyEvent.getFlags()).thenReturn(KeyEvent.FLAG_CANCELED_LONG_PRESS); assertFalse(delegate.onKeyUp(KeyEvent.KEYCODE_BACK, keyEvent)); assertFalse(delegate.onKeyUp(KeyEvent.KEYCODE_VOLUME_UP, keyEvent)); assertFalse(delegate.onKeyUp(KeyEvent.KEYCODE_VOLUME_DOWN, keyEvent)); KeyEvent keyEventVolUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_VOLUME_UP), keyEventVolDown = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_VOLUME_DOWN); assertTrue(delegate.onKeyUp(KeyEvent.KEYCODE_VOLUME_UP, keyEventVolUp)); verify(scrollable).scrollToPrevious(); verify(appBar).setExpanded(eq(true), anyBoolean()); reset(scrollable, appBar); when(scrollable.scrollToPrevious()).thenReturn(true); assertTrue(delegate.onKeyUp(KeyEvent.KEYCODE_VOLUME_UP, keyEventVolUp)); verify(scrollable).scrollToPrevious(); verify(appBar, never()).setExpanded(eq(true), anyBoolean()); reset(scrollable, appBar); when(appBar.getHeight()).thenReturn(10); when(appBar.getBottom()).thenReturn(10); assertTrue(delegate.onKeyUp(KeyEvent.KEYCODE_VOLUME_DOWN, keyEventVolDown)); verify(scrollable, never()).scrollToNext(); verify(appBar).setExpanded(eq(false), anyBoolean()); reset(scrollable, appBar); when(appBar.getHeight()).thenReturn(10); when(appBar.getBottom()).thenReturn(0); assertTrue(delegate.onKeyUp(KeyEvent.KEYCODE_VOLUME_DOWN, keyEventVolDown)); verify(scrollable).scrollToNext(); verify(appBar, never()).setExpanded(eq(false), anyBoolean()); }
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_SEARCH && (event.getFlags() & KeyEvent.FLAG_LONG_PRESS) == KeyEvent.FLAG_LONG_PRESS) { return true; } return super.onKeyDown(keyCode, event); }
/** * Calls from {@link Activity#onKeyUp(int, KeyEvent)} to delegate * * @param keyCode event key code * @param event key event * @return true if is intercepted as navigation, false otherwise */ boolean onKeyUp(int keyCode, KeyEvent event) { if (!mEnabled) { return false; } boolean notLongPress = (event.getFlags() & KeyEvent.FLAG_CANCELED_LONG_PRESS) == 0; if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && notLongPress) { shortPress(DIRECTION_UP); return true; } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN && notLongPress) { shortPress(DIRECTION_DOWN); return true; } return false; }
} else if(KeyEventUtils.isConfirmButton(event)){ View view = mRecyclerView.findViewHolderForAdapterPosition(mSelectedItem).itemView; if((event.getFlags() & KeyEvent.FLAG_LONG_PRESS)==KeyEvent.FLAG_LONG_PRESS) { view.performLongClick();
String text = "KeyCode=(" + keyCode + ") " + DebugInput.debugGetButtonName(keyCode)+" source="+keyEvent.getSource() + " fallback="+(keyEvent.getFlags() == KeyEvent.FLAG_FALLBACK); if (android.os.Build.VERSION.SDK_INT >= 19) { try {
@Override public boolean dispatchKeyEvent(@NonNull KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { if (event.getAction() == KeyEvent.ACTION_UP) { if (mIsMultiChoiceModeEnabled) { setMultiChoiceModeEnabled(false); setupOkButtonVisibility(); } else { if (isTopDirectory(mCurrentDirectory)) { finish(); } else { readUpDirectory(); } } } else if (event.getAction() == KeyEvent.ACTION_DOWN && (event.getFlags() & KeyEvent.FLAG_LONG_PRESS) == KeyEvent.FLAG_LONG_PRESS) { finish(); } return true; } return super.dispatchKeyEvent(event); }
@Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if ((boolean) XposedHelpers.callMethod(mPhoneWindowManager, "keyguardOn")) return; KeyEvent event = (KeyEvent) param.args[1]; int keyCode = event.getKeyCode(); boolean down = event.getAction() == KeyEvent.ACTION_DOWN; boolean isFromSystem = (event.getFlags() & KeyEvent.FLAG_FROM_SYSTEM) != 0; if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) { XposedHook.logD(TAG, "interceptKeyBeforeDispatching: keyCode= " + keyCode + "; keyCodeString=" + KeyEvent.keyCodeToString(keyCode) + "; down= " + down + "; repeatCount= " + event.getRepeatCount() + "; isInjected= " + (((Integer) param.args[2] & 0x01000000) != 0) + "; fromSystem= " + isFromSystem); if (isFromSystem && !isTaskLocked(mContext) && down && event.getRepeatCount() == 0) { if (!mWasPressed) { XposedHook.logD(TAG, "HW recents clicked"); mWasPressed = true; mHandler.postDelayed(resetPressedState, mDoubletapSpeed); } else { XposedHook.logD(TAG, "Double tap detected"); mHandler.removeCallbacks(resetPressedState); mWasPressed = false; switchToLastApp(mContext, mHandler); } param.setResult(-1); } } } };