From 5c1db10fda4450898167519b2c1b9bea41f24937 Mon Sep 17 00:00:00 2001 From: Nathaniel Wesley Filardo Date: Thu, 9 Jun 2016 13:31:35 -0400 Subject: [PATCH] Visualizers as classes, not objects Visualizers out in their own files Now reflect to invoke constructors --- .../acmetensortoys/watchviz/MainActivity.java | 114 +++--------------- .../com/acmetensortoys/watchviz/RenderCB.java | 8 ++ .../acmetensortoys/watchviz/RenderGrid.java | 44 +++++++ .../watchviz/RenderWholeScreenMax.java | 47 ++++++++ 4 files changed, 118 insertions(+), 95 deletions(-) create mode 100644 app/src/main/java/com/acmetensortoys/watchviz/RenderCB.java create mode 100644 app/src/main/java/com/acmetensortoys/watchviz/RenderGrid.java create mode 100644 app/src/main/java/com/acmetensortoys/watchviz/RenderWholeScreenMax.java diff --git a/app/src/main/java/com/acmetensortoys/watchviz/MainActivity.java b/app/src/main/java/com/acmetensortoys/watchviz/MainActivity.java index f4d1fbf..d1d947b 100644 --- a/app/src/main/java/com/acmetensortoys/watchviz/MainActivity.java +++ b/app/src/main/java/com/acmetensortoys/watchviz/MainActivity.java @@ -61,105 +61,24 @@ public class MainActivity extends WearableActivity private SurfaceView cyclersv; private Thread cycler; - public abstract static class RenderCB { - boolean doDebug = false; - - abstract public void render(Canvas c, float[] a); - public void setDebug(boolean b) { doDebug = b; } - public final void toggleDebug() { setDebug(!doDebug); } - } - private final RenderCB renderWholeScreenMax = new RenderCB() { - private float[] hsv = new float[]{0.0f, 1.0f, 1.0f}; - - public void setDebug(boolean d) { - super.setDebug(d); - if(!d) { - mDebugView.post(new Runnable() { - public void run() { - mDebugView.setVisibility(View.GONE); - } - } ); - } else { - mDebugView.post(new Runnable() { - public void run() { - mDebugView.setVisibility(View.VISIBLE); - } - } ); - } - } - - public void render(Canvas cv, float[] samples) { - float msamp = 0.0f; - int mix = -1; - for (int i = 0; i < samples.length/2; i += 2) { - if (samples[i] > msamp) { - msamp = samples[i]; - mix = i; - } - } - if (doDebug) { - final float fmsamp = msamp; - final int fmix = mix; - mDebugView.post(new Runnable() { - public void run() { - mDebugView.setText(String.format(Locale.US, "%1$8.1E @ %2$d", fmsamp, fmix)); - } - }); - } - int canvalpha = msamp > 3 ? 255 : (int) (msamp * 64) + 63; // XXX wtf scale? - - int c = Color.HSVToColor(hsv); - hsv[0] = hsv[0] >= 359 ? 0.0f : hsv[0] + 1.0f; - - cv.drawColor(c); - cv.drawColor(Color.rgb(canvalpha, canvalpha, canvalpha), PorterDuff.Mode.MULTIPLY); - } - }; - private final RenderCB renderGrid = new RenderCB() { - final Paint p = new Paint(); - final Paint dbp = new Paint(); - float[] hsv = new float[]{0.0f, 1.0f, 1.0f}; - - // Ahahaha; anonymous classes of course have anonymous constructors. How do you like that? - { - dbp.setColor(Color.WHITE); - } - - public void render(Canvas cv, float[] samples) { - int c = Color.HSVToColor(hsv); - hsv[0] = hsv[0] >= 359 ? 0.0f : hsv[0] + 1.0f; - p.setColor(c); - - int rxs = cv.getWidth() / 8; - int rys = cv.getHeight() / 8; - for (int rx = 0; rx < 8; rx++) { - for (int ry = 0; ry < 8; ry++) { - int ix = (rx * 8 + ry) * 4; - float x = (Math.abs(samples[ix]) + Math.abs(samples[ix+2])) * 32; - int b = x > 255 ? 255 : (int)x; - p.setAlpha(b > 223 ? 255 : b + 32); - cv.drawRect(rx * rxs, ry * rys, (rx + 1) * rxs - 1, (ry + 1) * rys - 1, p); - if(doDebug) { - cv.drawText(Integer.toHexString(b), rx*rxs + rxs/2, ry*rys + rys/2, dbp); - } - } - } - } - }; - private RenderCB cyclercb; - private Queue cyclercbq = new ArrayDeque<>(); - { - cyclercbq.add(renderGrid); - cyclercb = renderWholeScreenMax; - } + private Queue> cyclercbq = new ArrayDeque<>(); private void nextCyclerCB() { synchronized(this) { - cyclercb.setDebug(false); - cyclercbq.add(cyclercb); - cyclercb = cyclercbq.remove(); + Class next = cyclercbq.remove(); + cyclercbq.add(next); + try { + cyclercb = next.getConstructor().newInstance(); + } catch (Exception e) { + throw new RuntimeException(e); + } + mDebugView.setText(cyclercb.getClass().getSimpleName().substring(0,10)); } } + { + cyclercbq.add(RenderWholeScreenMax.class); + cyclercbq.add(RenderGrid.class); + } // The surface to which this callback is bound is created only after audio permissions // have been checked. We therefore can simply start in the created callback. Stopping @@ -229,6 +148,9 @@ public class MainActivity extends WearableActivity private void createSurface() { Log.d("createSurface", "top"); + + nextCyclerCB(); + cyclersv = new SurfaceView(this); cyclersv.getHolder().addCallback(shc); cyclersv.setOnClickListener(new View.OnClickListener(){ @@ -238,7 +160,7 @@ public class MainActivity extends WearableActivity synchronized(this) { rcb = cyclercb; } - rcb.toggleDebug(); + rcb.onClick(); } }); cyclersv.setOnLongClickListener(new View.OnLongClickListener() { @@ -344,10 +266,12 @@ public class MainActivity extends WearableActivity mOuterContainer.setBackgroundColor(black); mTextView.setTextColor(white); mClockView.setTextColor(white); + mDebugView.setTextColor(white); } else { mOuterContainer.setBackground(null); mTextView.setTextColor(black); mClockView.setTextColor(black); + mDebugView.setTextColor(black); } } diff --git a/app/src/main/java/com/acmetensortoys/watchviz/RenderCB.java b/app/src/main/java/com/acmetensortoys/watchviz/RenderCB.java new file mode 100644 index 0000000..8cae582 --- /dev/null +++ b/app/src/main/java/com/acmetensortoys/watchviz/RenderCB.java @@ -0,0 +1,8 @@ +package com.acmetensortoys.watchviz; + +import android.graphics.Canvas; + +public abstract class RenderCB { + abstract public void render(Canvas c, float[] a); + public void onClick() { } +} \ No newline at end of file diff --git a/app/src/main/java/com/acmetensortoys/watchviz/RenderGrid.java b/app/src/main/java/com/acmetensortoys/watchviz/RenderGrid.java new file mode 100644 index 0000000..254067d --- /dev/null +++ b/app/src/main/java/com/acmetensortoys/watchviz/RenderGrid.java @@ -0,0 +1,44 @@ +package com.acmetensortoys.watchviz; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; + +public final class RenderGrid extends RenderCB { + private boolean doDebug; + private final Paint p = new Paint(); + private final Paint dbp = new Paint(); + private float[] hsv = new float[]{0.0f, 1.0f, 1.0f}; + + public RenderGrid() + { + dbp.setColor(Color.WHITE); + } + + @Override + public void onClick() { + doDebug = !doDebug; + } + + @Override + public void render(Canvas cv, float[] samples) { + int c = Color.HSVToColor(hsv); + hsv[0] = hsv[0] >= 359 ? 0.0f : hsv[0] + 1.0f; + p.setColor(c); + + int rxs = cv.getWidth() / 8; + int rys = cv.getHeight() / 8; + for (int rx = 0; rx < 8; rx++) { + for (int ry = 0; ry < 8; ry++) { + int ix = (rx * 8 + ry) * 4; + float x = (Math.abs(samples[ix]) + Math.abs(samples[ix+2])) * 32; + int b = x > 255 ? 255 : (int)x; + p.setAlpha(b > 223 ? 255 : b + 32); + cv.drawRect(rx * rxs, ry * rys, (rx + 1) * rxs - 1, (ry + 1) * rys - 1, p); + if(doDebug) { + cv.drawText(Integer.toHexString(b), rx*rxs + rxs/2, ry*rys + rys/2, dbp); + } + } + } + } +}; diff --git a/app/src/main/java/com/acmetensortoys/watchviz/RenderWholeScreenMax.java b/app/src/main/java/com/acmetensortoys/watchviz/RenderWholeScreenMax.java new file mode 100644 index 0000000..fb84033 --- /dev/null +++ b/app/src/main/java/com/acmetensortoys/watchviz/RenderWholeScreenMax.java @@ -0,0 +1,47 @@ +package com.acmetensortoys.watchviz; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; + +import java.util.Locale; + +public final class RenderWholeScreenMax extends RenderCB { + private boolean doDebug; + private final Paint dbp = new Paint(); + private float[] hsv = new float[]{0.0f, 1.0f, 1.0f}; + + public RenderWholeScreenMax() + { + dbp.setColor(Color.WHITE); + } + + @Override + public void onClick() { + doDebug = !doDebug; + } + + @Override + public void render(Canvas cv, float[] samples) { + float msamp = 0.0f; + int mix = -1; + /* Restrict search to lowest half in agreement with RenderGrid */ + for (int i = 0; i < samples.length/2; i += 2) { + if (samples[i] > msamp) { + msamp = samples[i]; + mix = i; + } + } + int canvalpha = msamp > 3 ? 255 : (int) (msamp * 64) + 63; // XXX wtf scale? + + int c = Color.HSVToColor(hsv); + hsv[0] = hsv[0] >= 359 ? 0.0f : hsv[0] + 1.0f; + + cv.drawColor(c); + cv.drawColor(Color.rgb(canvalpha, canvalpha, canvalpha), PorterDuff.Mode.MULTIPLY); + if (doDebug) { + cv.drawText(String.format(Locale.US, "%1$8.1E @ %2$d", msamp, mix), 30, 30, dbp); + } + } +}; \ No newline at end of file -- 2.50.1