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;
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);
}
}
}
- 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
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
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
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};
// 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;
@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();