]> hydra-www.ietfng.org Git - acmetensortoys-watchviz/commitdiff
Push SharedPreferences into Renderings, test
authorNathaniel Wesley Filardo <nwf@cs.jhu.edu>
Mon, 4 Jul 2016 22:11:24 +0000 (18:11 -0400)
committerNathaniel Wesley Filardo <nwf@cs.jhu.edu>
Mon, 4 Jul 2016 22:11:24 +0000 (18:11 -0400)
Maybe not the right approach, but hey.  Test functionality with a settings
fragment that can be added to our grid adapter.

app/src/main/java/com/acmetensortoys/watchviz/MainGridViewAdapter.java
vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/Rendering.java
vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/rendering/Grid.java
vizlib/src/main/java/com/acmetensortoys/watchviz/vizlib/rendering/WholeMax.java
vizlib/src/main/res/xml/pref_grid.xml [new file with mode: 0644]

index eed0c38223b53588626a7977bb664f815493ecee..d24e635a0bf747dbd47a3ca6b00728db70cbc50c 100644 (file)
 
 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<? extends Rendering> re;
-        public RendererPage(Class<? extends Rendering> r) {
+        private final Class<? extends Rendering> re;
+        private final SharedPreferences lsp;
+        public RendererPage(Class<? extends Rendering> 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
index f59b4994524bde17c0a46a8f768610755b0b61b8..dadefe85835a34a92cbd66b229af95801824e3b9 100644 (file)
@@ -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
index 1ccc53a0011ff8b8b82569800ba0ed2d6d7c45b4..89dd120b85bf9fab962a0b3beb62ca95482947d7 100644 (file)
@@ -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();
index 30b8c6dab57a2e15a31fab23f0f08b8c1fdde1d1..eb4df80a17cb644473be6a8c5310bd90393cf988 100644 (file)
@@ -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 (file)
index 0000000..4aeb7d8
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <CheckBoxPreference
+        android:key="cycle"
+        android:defaultValue="true"
+        android:title="Cycle colors"
+        />
+    <CheckBoxPreference
+        android:key="debug"
+        android:defaultValue="false"
+        android:title="Show values"
+        />
+</PreferenceScreen>
\ No newline at end of file