The Requirements: Ensure that itemLookup
is only performed if the button has been held for at least 1 second. Stop the button event when the button has been held for 3 seconds, so the recording used for the lookup will not contain unnecessary data.
- The Problem:
MotionEvent.ACTION_CANCEL
is never called even though debugging confirms thatTableLayoutForIntercept
'sonInterceptTouchEvent
is being called beforeMainActivity
'sOnTouchListener
event is called, as expected. Perhaps I am not understanding the purpose ofonInterceptTouchEvent
? I've looked at other posts about this matter, but all of them are dealing with swipe or drag events, not cancelling a button press. Perhaps this can't be done? The Code: Only the relevant parts of
MainActivity
are shown, along with the fullTableLayoutForIntercept
class, and of course<com.company.myapplication.TableLayoutForIntercept></com.company.myapplication.TableLayoutForIntercept>
tags surround my xml layout.public class MainActivity extends Activity { //... DateTime recordingStartedTime; DateTime recordingEndedTime; boolean buttonHeldLongEnough = false; PackageManager pm = getPackageManager(); boolean micPresent = pm.hasSystemFeature(PackageManager.FEATURE_MICROPHONE); if (micPresent) { recordBtn.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View recordView, MotionEvent recordEvent) { switch (recordEvent.getAction()) { case MotionEvent.ACTION_DOWN: // Try to record audio try { recordingOff.setVisibility(View.INVISIBLE); recordingOn.setVisibility(View.VISIBLE); recordingStartedTime = DateTime.now(); constructPrepareStartRecording(); } catch (Exception ex) { Log.e(MainActivity.class.getSimpleName(), "An unknown error occurred."); } return true; case MotionEvent.ACTION_UP: recordingOff.setVisibility(View.VISIBLE); recordingOn.setVisibility(View.INVISIBLE); recordingEndedTime = DateTime.now(); Seconds seconds = Seconds.secondsBetween(recordingStartedTime, recordingEndedTime); int secondsButtonHeld = seconds.getSeconds(); // Button must have been held at least 1 second before running itemLookup if (secondsButtonHeld > 0 ) { buttonHeldLongEnough = true; } else { buttonHeldLongEnough = false; } // Need to release resources regardless stopReleaseResetRecording(); if (buttonHeldLongEnough) { itemLookup(); } return true; case MotionEvent.ACTION_CANCEL: // I think this is the event I have to trigger to halt the button press boolean codeHasHitCancel = true; return codeHasHitCancel; } return false; } }); } else { toastTitle = "Unable To Record"; toastMessage = "Device microphone not found."; toast = new GenericCustomToast(); toast.show(toastTitle, toastMessage, MainActivity.this); } //... } public class TableLayoutForIntercept extends TableLayout { public TableLayoutForIntercept (Context context) { super(context); } public TableLayoutForIntercept (Context context, AttributeSet attrs) { super(context, attrs); } private CancelPressTask cancelPressTask = null; private boolean stopTouchEvent = false; @Override public boolean onInterceptTouchEvent (MotionEvent event) { final int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: stopTouchEvent = false; cancelPressTask = new CancelPressTask(); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: cancelPressTask.resetCancelPressTimer(); cancelPressTask.stopCancelPressTimer(); return stopTouchEvent; } return super.onInterceptTouchEvent(event); } @Override public boolean onTouchEvent (MotionEvent event) { if (!stopTouchEvent) { return super.onTouchEvent(event); } return true; } private class CancelPressTask { public final long CANCEL_PRESS_TIMEOUT = 3000; // 3 seconds private Handler cancelPressHandler = new Handler(){ public void handleMessage(Message msg) { } }; private Runnable cancelPressCallback = new Runnable() { @Override public void run() { stopTouchEvent = true; } }; public void resetCancelPressTimer(){ cancelPressHandler.removeCallbacks(cancelPressCallback); cancelPressHandler.postDelayed(cancelPressCallback, CANCEL_PRESS_TIMEOUT); } public void stopCancelPressTimer(){ cancelPressHandler.removeCallbacks(cancelPressCallback); } } }