package br.carinha.rosto; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; /** * Sensor de luz do celular (lux). A página decide o que fazer (apagaram a luz: sono; acenderam de * repente: aperta os olhos). Manda no máximo a cada INTERVALO e só quando muda de verdade. */ final class Luz implements SensorEventListener { interface Ouvinte { void luz(float lux); } private static final long INTERVALO = 700; // ms private final SensorManager gerente; private final Sensor sensor; private final Ouvinte ouvinte; private long enviadoEm; private float enviado = -1; Luz(Context c, Ouvinte ouvinte) { gerente = (SensorManager) c.getSystemService(Context.SENSOR_SERVICE); sensor = gerente == null ? null : gerente.getDefaultSensor(Sensor.TYPE_LIGHT); this.ouvinte = ouvinte; } void ligar() { if (sensor != null) gerente.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); } void desligar() { if (sensor != null) gerente.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent e) { float lux = e.values[0]; long agora = System.currentTimeMillis(); boolean mudou = enviado < 0 || Math.abs(lux - enviado) > Math.max(2f, enviado * 0.15f); if (!mudou || agora - enviadoEm < INTERVALO) return; enviado = lux; enviadoEm = agora; ouvinte.luz(lux); } @Override public void onAccuracyChanged(Sensor s, int precisao) { } }