Как после удержания кнопки n-ое количество времени и ввода после этого определенной комбинации кнопок вызвать вторую активити?

Я не могу понять как вызвать вторую активити после удержания кнопки "=" 4 секунды, и ввода комбинации "1,2,3" после этого в течение 5 последующих секунд в моём мини-калькуляторе. Проблема сводится к тому можно ли одновременно запустить OnClickListener с методом OnTouch или нет? На данный момент я уже несколько раз пробовал решить эту задачу, но пока не получается. Метод OnTouch почему-то не работает как обработчик события кнопки "=". Она просто не нажимается. Вот то, что у меня есть: Интерфейс моего приложения

    package com.demo.calculator;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.text.InputFilter;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;

public class MainActivity extends AppCompatActivity {

    /********* Объявление переменных **********/

    Button btnClear;
    TextView tvProcessor, tvResult;

    Button btnOne, btnTwo, btnThree, btnFour, btnFive, btnSix, btnSeven, btnEight,
    btnNine, btnZero;
    String processor;
    Button btnDot, btnDel, btnEqual, btnDivide, btnMultiply, btnMinus, btnPlus;
    Button btnLeftScope, btnRightScope;
    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnClear = (Button) findViewById(R.id.btnClear);
        tvProcessor = (TextView) findViewById(R.id.tv_process);
        tvResult = (TextView) findViewById(R.id.tv_result);

        tvProcessor.setText("");
        tvResult.setText("");

        btnOne = (Button) findViewById(R.id.btnOne);
        btnTwo = (Button) findViewById(R.id.btnTwo);
        btnThree = (Button) findViewById(R.id.btnThree);
        btnFour = (Button) findViewById(R.id.btnFour);
        btnFive = (Button) findViewById(R.id.btnFive);
        btnSix = (Button) findViewById(R.id.btnSix);
        btnSeven = (Button) findViewById(R.id.btnSeven);
        btnEight = (Button) findViewById(R.id.btnEight);
        btnNine = (Button) findViewById(R.id.btnNine);
        btnZero = (Button) findViewById(R.id.btnZero);


        btnDot = (Button) findViewById(R.id.btnDot);
        btnEqual = (Button) findViewById(R.id.btn_equal);
        btnDel = (Button) findViewById(R.id.btnDel);
        btnLeftScope = (Button) findViewById(R.id.btnLeftScope);
        btnRightScope = (Button) findViewById(R.id.btnRightScope);


        btnDivide = (Button) findViewById(R.id.btn_divide);
        btnMultiply = (Button) findViewById(R.id.btn_multiply);
        btnMinus = (Button) findViewById(R.id.btn_minus);
        btnPlus = (Button) findViewById(R.id.btn_plus);


        /***************************************************
         Обработчики на цифры на калькуляторе
         ***************************************************/

        btnClear.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                tvProcessor.setText("");
                tvResult.setText("");
            }
        });

        btnOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "1");
            }
        });

        btnTwo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "2");
            }
        });

        btnThree.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "3");
            }
        });

        btnFour.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "4");
            }
        });

        btnFive.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "5");
            }
        });

        btnSix.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "6");
            }
        });

        btnSeven.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "7");
            }
        });

        btnEight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "8");
            }
        });

        btnNine.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "9");
            }
        });

        btnZero.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "0");
            }
        });

        /***************************************************
         Обработчики на арифметические операции на калькуляторе
         ***************************************************/
        btnMultiply.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "×");
            }
        });

        btnMinus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "-");
            }
        });

        btnPlus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "+");
            }
        });

        btnDivide.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "÷");
            }
        });

        /***************************************************
         Обработчики на функциональные операции на калькуляторе
         ***************************************************/
        btnDot.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + ".");
            }
        });

        btnDel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                if (processor.length() > 0) {
                    processor = processor.substring(0, processor.length()-1);
                    tvProcessor.setText(processor);
                }
            }
        });


        btnLeftScope.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + "(");
            }
        });


        btnRightScope.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();
                tvProcessor.setText(processor + ")");
            }
        });

        btnEqual.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                processor = tvProcessor.getText().toString();

                processor = processor.replaceAll("×", "*");
                processor = processor.replaceAll("÷", "/");

                Context rhino = Context.enter();
                rhino.setOptimizationLevel(-1);
                String result = "";

                try {
                    Scriptable scope = rhino.initStandardObjects();
                    result = rhino.evaluateString(scope, processor, "JavaScript",1, null).toString();
                } catch (Exception e) {
                    result = "Error";
                }

                tvResult.setText(result);
            }
        });

        /*btnEqual.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(getApplicationContext(), "Yes", Toast.LENGTH_SHORT).show();
                return false;
            }
        });*/


        btnEqual.setOnTouchListener(new View.OnTouchListener() {
            long startTime;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN: // нажатие
                        startTime = System.currentTimeMillis();
                        break;
                    case MotionEvent.ACTION_MOVE: // движение
                        break;
                    case MotionEvent.ACTION_UP: // отпускание
                    case MotionEvent.ACTION_CANCEL:
                        long totalTime = System.currentTimeMillis() - startTime;
                        long totalSecunds = totalTime / 1000;
                        if( totalSecunds >= 3 )
                        {
                            Toast.makeText(getApplicationContext(), "Yes", Toast.LENGTH_SHORT);
                        }
                        break;
                }
                return true;
            }
        });
    }
}

Ответы (1 шт):

Автор решения: Tiarait

Идея брать currentTimeMillis не совсем правильная, я бы посоветовал через Handler, для этого создаем переменные

//ключ что бы показать что можно вводить секретную комбинацию (ключ)
boolean canEnterKey = false; 
// наш Handler
Handler handler; 
// наш <таймер> в нем обрабатываем что будет через N время
Runnable timer = new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getApplicationContext(), "Enter Secret KEY", Toast.LENGTH_SHORT).show();
        canEnterKey = true;
        //после 5 сек <запрещаем> вводить ключ
        handler.removeCallbacks(blockEnterKey);
        handler.postDelayed(blockEnterKey, 5000);
    }
};
// выкл разрешение для ввода ключа
Runnable blockEnterKey = new Runnable() {
        @Override
        public void run() {
            canEnterKey = false;
            Toast.makeText(getApplicationContext(), "Time out", Toast.LENGTH_SHORT).show();
        }
    };

Дальше в onCreate меняем btnEqual.setOnTouchListener

    btnEqual.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: // нажатие
                    //удаляем наш timer (на всякий случай)
                    handler.removeCallbacks(timer);
                    //запускаем через 4сек *1000
                    handler.postDelayed(timer, 4000);
                    break;
                case MotionEvent.ACTION_MOVE: // движение
                    break;
                case MotionEvent.ACTION_UP: // отпускание
                case MotionEvent.ACTION_CANCEL:
                    //удаляем наш timer, на случай если кнопку держали меньше 4сек
                    handler.removeCallbacks(timer);
                    break;
            }
            return v.onTouchEvent(event);
        }
    });

Объявляем наш Handler

    handler = new Handler(Looper.getMainLooper());

Вешаем слушатель на tvProcessor

    tvProcessor.addTextChangedListener(new TextWatcher() {

        @Override
        public void afterTextChanged(Editable s) {}

        @Override
        public void beforeTextChanged(CharSequence s, int start,
                                      int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start,
                                  int before, int count) {
            //НЕ ТЕСТИРОВАЛ условие
            if ((s.toString().equals("1") || s.toString().equals("12")) && canEnterKey) {
                canEnterKey = true;
            } else if (s.toString().equals("123") && canEnterKey) {
                //вызваем вторую активити
                canEnterKey = false;
            } else {
                canEnterKey = false;
            }
        }
    });
→ Ссылка