How to blink flash until the value in firebase is false

42 Views Asked by At

I want to keep blinking the flash forever until the value from firebase database is false. This is what I tried:

boolean mIsOn = false;
    CameraManager camManager;
    String cameraId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ha);
        camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        try {
            cameraId = camManager.getCameraIdList()[0];
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }

        FirebaseDatabase.getInstance("https://vehiclcocity-default-rtdb.asia-southeast1.firebasedatabase.app/").getReference().child("value").addValueEventListener(new ValueEventListener() {
            @SuppressLint("NewApi")
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                mIsOn = snapshot.getValue(boolean.class);
                Log.d("mIsOn", mIsOn + "");
                if (mIsOn){
                    try {
                        blink();
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }else {
                    try {
                        camManager.setTorchMode(cameraId,false); //Turn off
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(HA.this, "" + error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    @SuppressLint("NewApi")
    @Override
    protected void onPause() {
        try {
            camManager.setTorchMode(cameraId,false); //Turn off
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        super.onPause();
    }

    @SuppressLint("NewApi")
    @Override
    protected void onResume() {
        try {
            camManager.setTorchMode(cameraId,mIsOn); //Turn to last state
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        super.onResume();
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    public void blink() throws CameraAccessException {
        
        String str = "01010101010101010101010101010101010101010101";
        String str2 = str + str + str + str + str + str + str + str + str + str + str + str + str + str + str + str + str + str + str;
        String myString = str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2 + str2;
        long blinkDelay = 100; //Delay in ms
        for (int i = 0; i < myString.length(); i++) {
            Log.d("isOnTorch",mIsOn + "");
            if (myString.charAt(i) == '0') {
                camManager.setTorchMode(cameraId,true);
            } else {
                camManager.setTorchMode(cameraId,false);
            }
            try {
                Thread.sleep(blinkDelay);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

Problem:
This works as expected when the value in database is true. But, as soon as the value becomes false, the flash does not stop. It stops after the entire pattern has ended and that is not I want. I want to stop the blink effect as soon the value becomes false. I have surely missed something out.

0

There are 0 best solutions below