From c0d896f533a7756b393446794c5a2e0caaa02133 Mon Sep 17 00:00:00 2001 From: Nathaniel Wesley Filardo Date: Mon, 4 Jul 2016 18:11:24 -0400 Subject: [PATCH] Push SharedPreferences into Renderings, test Maybe not the right approach, but hey. Test functionality with a settings fragment that can be added to our grid adapter. --- .../watchviz/MainGridViewAdapter.java | 150 ++++++++++++++---- .../watchviz/vizlib/Rendering.java | 2 + .../watchviz/vizlib/rendering/Grid.java | 41 ++++- .../watchviz/vizlib/rendering/WholeMax.java | 6 +- vizlib/src/main/res/xml/pref_grid.xml | 14 ++ 5 files changed, 176 insertions(+), 37 deletions(-) create mode 100644 vizlib/src/main/res/xml/pref_grid.xml diff --git a/app/src/main/java/com/acmetensortoys/watchviz/MainGridViewAdapter.java b/app/src/main/java/com/acmetensortoys/watchviz/MainGridViewAdapter.java index eed0c38..d24e635 100644 --- a/app/src/main/java/com/acmetensortoys/watchviz/MainGridViewAdapter.java +++ b/app/src/main/java/com/acmetensortoys/watchviz/MainGridViewAdapter.java @@ -23,7 +23,14 @@ package com.acmetensortoys.watchviz; +import android.app.Activity; +import android.app.Fragment; +import android.app.FragmentTransaction; import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceFragment; +import android.support.wearable.view.FragmentGridPagerAdapter; import android.support.wearable.view.GridPagerAdapter; import android.support.wearable.view.GridViewPager; import android.util.Log; @@ -42,34 +49,64 @@ public class MainGridViewAdapter extends GridPagerAdapter implements GridViewPager.OnPageChangeListener { + private final Activity mAct; // Also a Context + private final AudioProvider mAp; + private final TextView mDv; + private final Page[][] pages; + + public MainGridViewAdapter(Activity a, AudioProvider ap, TextView dv) { + mAct = a; + mAp = ap; + mDv = dv; + + Page gridPage = new RendererPage(Grid.class, + mAct.getSharedPreferences("grid",Context.MODE_PRIVATE)); + Page wholePage = new RendererPage(WholeMax.class, + mAct.getSharedPreferences("whole",Context.MODE_PRIVATE)); + + pages = new Page[][]{ + {gridPage, new FragmentPage(ProgrammablePreferenceFragment + .newInstance(R.xml.pref_grid, "grid"))}, + {wholePage } + }; + } + /* All returned Objects are actually Pages so we know what to do with them later */ private abstract static class InstantiatedPage { abstract public boolean ownsview(View v); abstract public void deinstantiate(MainGridViewAdapter m, ViewGroup g); }; + private abstract static class Page { + public String title; + abstract public InstantiatedPage instantiate(MainGridViewAdapter m, ViewGroup g, int r, int c); + } + + /* Some Pages just contain View objects directly */ private static class ViewInstantiatedPage extends InstantiatedPage { - public View v; + private final View v; public ViewInstantiatedPage(View v) { this.v = v; } @Override - public boolean ownsview(View v2) { return v.equals(v2); } + public boolean ownsview(View v2) { return v == v2; } @Override public void deinstantiate(MainGridViewAdapter m, ViewGroup g) { g.removeView(v); } } - private abstract static class Page { - public String title; - abstract public InstantiatedPage instantiate(MainGridViewAdapter m, ViewGroup g, int r, int c); - } private static class RendererPage extends Page { - private Class re; - public RendererPage(Class r) { + private final Class re; + private final SharedPreferences lsp; + public RendererPage(Class r, SharedPreferences lsp) { this.re = r; + this.lsp = lsp; this.title = r.getSimpleName(); } public InstantiatedPage instantiate(MainGridViewAdapter mgva, ViewGroup g, int r, int c) { - SurfaceView sv = new SurfaceView(mgva.mCtx); - AudioCanvas ac = new AudioCanvas(r+"x"+c, sv, mgva.mAp); + final SurfaceView sv = new SurfaceView(mgva.mAct); + final AudioCanvas ac = new AudioCanvas(r+"x"+c, sv, mgva.mAp); + final Rendering rend; try { - ac.setRendering(re.getConstructor().newInstance()); + rend = re.getConstructor(SharedPreferences.class, SharedPreferences.class) + .newInstance(lsp, + mgva.mAct.getPreferences(Context.MODE_PRIVATE)); + ac.setRendering(rend); } catch (Exception e) { throw new RuntimeException(e); } @@ -81,21 +118,54 @@ public class MainGridViewAdapter } } - private Page gridPage = new RendererPage(Grid.class); - private Page wholePage = new RendererPage(WholeMax.class); - private final Page[][] pages = { - {gridPage, gridPage}, - {wholePage } - }; + /* And some manage Fragments; note that these require assistance from finishUpdate below */ + private FragmentTransaction mFT = null; + private static class FragmentInstantedPage extends InstantiatedPage { + private final Fragment f; - private final Context mCtx; - private final AudioProvider mAp; - private final TextView mDv; + public FragmentInstantedPage(Fragment f) { this.f = f; } - public MainGridViewAdapter(Context c, AudioProvider ap, TextView dv) { - mCtx = c; - mAp = ap; - mDv = dv; + @Override + public boolean ownsview(View v) { + return v == f.getView(); + } + + @Override + public void deinstantiate(MainGridViewAdapter m, ViewGroup g) { + m.startFragmentTransaction().remove(f); + } + } + private static class FragmentPage extends Page { + private final Fragment f; + public FragmentPage(Fragment f) { this.f = f; } + + @Override + public InstantiatedPage instantiate(MainGridViewAdapter m, ViewGroup g, int r, int c) { + m.startFragmentTransaction().add(g.getId(),f); + return new FragmentInstantedPage(f); + } + } + + public static class ProgrammablePreferenceFragment extends PreferenceFragment { + private final static String ARG_RES_IX = "res"; + private final static String ARG_PREF_IX = "pref"; + + public static ProgrammablePreferenceFragment newInstance(int res, String pref) { + ProgrammablePreferenceFragment f = new ProgrammablePreferenceFragment(); + Bundle args = new Bundle(); + args.putInt(ARG_RES_IX,res); + args.putString(ARG_PREF_IX,pref); + f.setArguments(args); + return f; + } + + @Override + public void onCreate(Bundle sis) { + super.onCreate(sis); + getPreferenceManager().setSharedPreferencesName(getArguments().getString(ARG_PREF_IX)); + Log.d("PPF", "sp="+getPreferenceManager().getSharedPreferences().toString()); + addPreferencesFromResource(getArguments().getInt(ARG_RES_IX)); + } } @Override @@ -136,10 +206,24 @@ public class MainGridViewAdapter super.startUpdate(container); } + FragmentTransaction startFragmentTransaction() { + if(mFT != null) { return mFT; } + return (mFT = mAct.getFragmentManager().beginTransaction()); + } + @Override public void finishUpdate(ViewGroup container) { - // super.finishUpdate(container); - Log.d("MGVA", "finishUpdate bottom"); + if (mAct.getFragmentManager().isDestroyed()) { + mFT = null; + } else if (mFT != null) { + mFT.commitAllowingStateLoss(); + mFT = null; + mAct.getFragmentManager().executePendingTransactions(); + container.postInvalidate(); // TODO: does this help and if so why? + } + + super.finishUpdate(container); + //Log.d("MGVA", "finishUpdate bottom"); } @Override @@ -151,12 +235,14 @@ public class MainGridViewAdapter public void onPageSelected(int row, int col) { // Log.d("MGVA", "selected"); final String name = pages[row][col].title; - mDv.post(new Runnable() { - @Override - public void run() { - mDv.setText(name.substring(0, Math.min(10, name.length()))); - } - }); + if (name != null) { + mDv.post(new Runnable() { + @Override + public void run() { + mDv.setText(name.substring(0, Math.min(10, name.length()))); + } + }); + } } @Override diff --git a/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/Rendering.java b/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/Rendering.java index f59b499..dadefe8 100644 --- a/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/Rendering.java +++ b/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/Rendering.java @@ -1,8 +1,10 @@ package com.acmetensortoys.watchviz.vizlib; +import android.content.SharedPreferences; import android.graphics.Canvas; public abstract class Rendering { + public Rendering(SharedPreferences lsp, SharedPreferences gsp) {} abstract public void render(Canvas c, float[] audio, float[] fft); public void onClick() { ; } } \ No newline at end of file diff --git a/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/rendering/Grid.java b/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/rendering/Grid.java index 1ccc53a..89dd120 100644 --- a/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/rendering/Grid.java +++ b/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/rendering/Grid.java @@ -1,14 +1,18 @@ package com.acmetensortoys.watchviz.vizlib.rendering; +import android.content.SharedPreferences; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.Typeface; +import android.util.Log; import com.acmetensortoys.watchviz.vizlib.Rendering; import com.acmetensortoys.watchviz.vizlib.meta.Avg; public final class Grid extends Rendering { private boolean doDebug; + private boolean doCycle; private final Paint p = new Paint(); private final Paint dbp = new Paint(); private float[] hsv = new float[]{0.0f, 1.0f, 1.0f}; @@ -17,11 +21,39 @@ public final class Grid extends Rendering { // to six seconds, which seems fine. private Avg meta = new Avg(7); - public Grid() + // Need to hold on to this explicitly because the SharedPreference object only hold + // on to it weakly. That's great, thanks and all, but it's somewhat unexpected. + private SharedPreferences.OnSharedPreferenceChangeListener ospcl + = new SharedPreferences.OnSharedPreferenceChangeListener() { + @Override + public void onSharedPreferenceChanged(SharedPreferences sp, String key) { + Log.d("GridOSPCL", key); + switch(key) { + case "debug": debugByPref(sp); break; + case "cycle": cycleByPref(sp); break; + } + } + }; + + public Grid(SharedPreferences lsp, SharedPreferences gsp) { + super(lsp,gsp); dbp.setColor(Color.WHITE); + dbp.setTypeface(Typeface.MONOSPACE); + + lsp.registerOnSharedPreferenceChangeListener(ospcl); + debugByPref(lsp); + cycleByPref(lsp); } + private void debugByPref(SharedPreferences sp) { + doDebug = sp.getBoolean("debug", false); + } + private void cycleByPref(SharedPreferences sp) { + doCycle = sp.getBoolean("cycle", true); + } + + @Override public void onClick() { doDebug = !doDebug; @@ -29,9 +61,10 @@ public final class Grid extends Rendering { @Override public void render(Canvas cv, float[] au, float[] fft) { - int c = Color.HSVToColor(hsv); - hsv[0] = hsv[0] >= 359 ? 0.0f : hsv[0] + 1.0f; - p.setColor(c); + p.setColor(Color.HSVToColor(hsv)); + if(doCycle) { + hsv[0] = hsv[0] >= 359 ? 0.0f : hsv[0] + 1.0f; + } float thisFrameSum = 0f; final float winAvg = meta.get(); diff --git a/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/rendering/WholeMax.java b/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/rendering/WholeMax.java index 30b8c6d..eb4df80 100644 --- a/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/rendering/WholeMax.java +++ b/vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/rendering/WholeMax.java @@ -1,9 +1,11 @@ package com.acmetensortoys.watchviz.vizlib.rendering; +import android.content.SharedPreferences; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; +import android.graphics.Typeface; import com.acmetensortoys.watchviz.vizlib.Rendering; @@ -14,9 +16,11 @@ public final class WholeMax extends Rendering { private final Paint dbp = new Paint(); private float[] hsv = new float[]{0.0f, 1.0f, 1.0f}; - public WholeMax() + public WholeMax(SharedPreferences lsp, SharedPreferences gsp) { + super(lsp,gsp); dbp.setColor(Color.WHITE); + dbp.setTypeface(Typeface.MONOSPACE); } @Override diff --git a/vizlib/src/main/res/xml/pref_grid.xml b/vizlib/src/main/res/xml/pref_grid.xml new file mode 100644 index 0000000..4aeb7d8 --- /dev/null +++ b/vizlib/src/main/res/xml/pref_grid.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file -- 2.50.1