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.