diff --git a/app/src/main/java/protect/babymonitor/VolumeView.java b/app/src/main/java/protect/babymonitor/VolumeView.java index 48ac866..2e48f1d 100644 --- a/app/src/main/java/protect/babymonitor/VolumeView.java +++ b/app/src/main/java/protect/babymonitor/VolumeView.java @@ -3,45 +3,66 @@ package protect.babymonitor; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.Paint; import android.support.annotation.Nullable; import android.util.AttributeSet; +import android.util.Log; import android.view.View; +import java.util.LinkedList; + public class VolumeView extends View { + private static final int MAX_HISTORY = 10_000; private double volume = 0; private double maxVolume = 0; + private Paint paint = new Paint(); + private LinkedList volumeHistory = new LinkedList<>(); public VolumeView(Context context) { super(context); + init(); } public VolumeView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); + init(); } public VolumeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + paint.setColor(Color.rgb(255, 127, 0)); } public void onAudioData(byte[] data) { double sum = 0; for (int i = 0; i < data.length; i++) { - double rel = Math.abs(data[i]) / (double)32767f; + double rel = data[i] / (double)32767f; sum+=Math.pow(rel, 4); } volume = sum/data.length; if (volume > maxVolume) { maxVolume = volume; } + volumeHistory.addLast(volume); + while (volumeHistory.size() > MAX_HISTORY) { + volumeHistory.removeFirst(); + } invalidate(); } @Override protected void onDraw(Canvas canvas) { + int height = canvas.getHeight(); + int width = canvas.getWidth(); + Log.d("VOLUME_VIEW", "height: " + height +" width: "+ width); double relativeBrightness = 0; if (maxVolume > 0) { - relativeBrightness = volume / (float) maxVolume; - relativeBrightness = Math.max(0.3, relativeBrightness); + double normalizedVolume = volume / (float) maxVolume; + relativeBrightness = Math.max(0.3, normalizedVolume); } int blue; int rest; @@ -54,5 +75,25 @@ public class VolumeView extends View { } int rgb = Color.rgb(rest, rest, blue); canvas.drawColor(rgb); + if (maxVolume > 0) { + double margins = height * 0.1; + double graphHeight = height - 2*margins; + int yPrev = (int) margins; + int leftMost = Math.max(0, volumeHistory.size() - width); + for (int i = leftMost; i < volumeHistory.size() && i - leftMost < width; i++) { + int xNext = i - leftMost; + int yNext = (int) (margins + graphHeight - volumeHistory.get(i) / maxVolume * (graphHeight)); + int xPrev; + if (i == leftMost) { + xPrev = xNext; + } else { + xPrev = xNext - 1; + } + canvas.drawLine(xPrev, yPrev, xNext, yNext, paint); + yPrev = yNext; + + } + } + } }