package it.angelic.soulissclient.fragments; import android.Manifest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v7.widget.SwitchCompat; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.Button; import android.widget.FrameLayout; import android.widget.SeekBar; import android.widget.Spinner; import android.widget.TableRow; import android.widget.TextView; import com.pheelicks.visualizer.VisualizerView; import com.pheelicks.visualizer.renderer.BarGraphRenderer; import it.angelic.soulissclient.Constants; import it.angelic.soulissclient.R; import it.angelic.soulissclient.SoulissApp; import it.angelic.soulissclient.helpers.AlertDialogHelper; import it.angelic.soulissclient.model.SoulissTypical; import it.angelic.soulissclient.model.db.SoulissDBHelper; import it.angelic.soulissclient.model.typicals.SoulissTypical19AnalogChannel; import it.angelic.tagviewlib.SimpleTagRelativeLayout; import static junit.framework.Assert.assertTrue; public class T19SingleChannelLedFragment extends AbstractMusicVisualizerFragment { private SoulissDBHelper datasource; private SoulissTypical19AnalogChannel collected; private TextView eqText; private int intensity = 0; // Color change listener. private VisualizerView mVisualizerView; private boolean continueIncrementing; private boolean continueDecrementing; private TextView textviewHistoryTags; private SwitchCompat togMulticast; private TableRow tableRowVis; private TableRow tableRowChannel; private View tableRowLamp; private SeekBar seekChannelIntensity; private TextView singleChanabel; /** * Serve per poter tenuto il bottone brightness * * @param cmd */ private void startIncrementing(final Short cmd) { setIsIncrementing(true); new Thread(new Runnable() { public void run() { while (isIncrementing()) { intensity += 5; collected.issueSingleChannelCommand(Constants.Typicals.Souliss_T1n_BrightUp, togMulticast.isChecked()); try { Thread.sleep(250); } catch (InterruptedException e) { Log.e(Constants.TAG, "Error Thread.sleep:" + e.getMessage()); } } } }).start(); } synchronized private void stopIncrementing() { setIsIncrementing(false); collected.issueRefresh(); } synchronized private boolean isIncrementing() { return continueIncrementing; } /** * Serve per poter tenuto il bottone brightness * * @param cmd */ private void startDecrementing(final Short cmd) { setIsDecrementing(true); new Thread(new Runnable() { public void run() { while (isDecrementing() && intensity > 5) { intensity -= 5; collected.issueSingleChannelCommand(Constants.Typicals.Souliss_T1n_BrightDown, togMulticast.isChecked()); try { Thread.sleep(250); } catch (InterruptedException e) { Log.e(Constants.TAG, "Error Thread.sleep:" + e.getMessage()); } } } }).start(); } synchronized private void stopDecrementing() { setIsDecrementing(false); collected.issueRefresh(); } /** * Per gestire tasto premuto * * @param newSetting */ synchronized void setIsIncrementing(boolean newSetting) { continueIncrementing = newSetting; } synchronized private boolean isDecrementing() { return continueDecrementing; } synchronized void setIsDecrementing(boolean newSetting) { continueDecrementing = newSetting; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); opzioni = SoulissApp.getOpzioni(); // tema if (opzioni.isLightThemeSelected()) getActivity().setTheme(R.style.LightThemeSelector); else getActivity().setTheme(R.style.DarkThemeSelector); super.onCreate(savedInstanceState); setHasOptionsMenu(true); if (!opzioni.isDbConfigured()) { AlertDialogHelper.dbNotInitedDialog(getActivity()); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) return null; opzioni = SoulissApp.getOpzioni(); View ret = inflater.inflate(R.layout.frag_t19_singlechannel, container, false); datasource = new SoulissDBHelper(getActivity()); SoulissDBHelper.open(); Bundle extras = getActivity().getIntent().getExtras(); if (extras != null && extras.get("TIPICO") != null) { collected = (SoulissTypical19AnalogChannel) extras.get("TIPICO"); } else if (getArguments() != null) { collected = (SoulissTypical19AnalogChannel) getArguments().get("TIPICO"); } else { try { // try emergency Log.w(Constants.TAG, "Attempting emergency load"); collected = (SoulissTypical19AnalogChannel) datasource.getTypical(collected.getTypicalDTO() .getNodeId(), collected.getTypicalDTO().getSlot()); } catch (Exception e) { Log.e(Constants.TAG, "Error retriving node:" + e.getMessage()); return ret; } } super.setCollected(collected); collected.issueRefresh(); /*super.actionBar = ((ActionBarActivity) getActivity()).getSupportActionBar(); super.actionBar.setCustomView(R.layout.custom_actionbar); // load super.actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM); // show super.actionBar.setDisplayHomeAsUpEnabled(true); refreshStatusIcon();*/ assertTrue("TIPICO NULLO", collected instanceof SoulissTypical19AnalogChannel); collected.setPrefs(opzioni); Button buttPlus = (Button) ret.findViewById(R.id.buttonPlus); Button buttMinus = (Button) ret.findViewById(R.id.buttonMinus); togMulticast = (SwitchCompat) ret.findViewById(R.id.checkBoxMulticast); Button btOff = (Button) ret.findViewById(R.id.buttonTurnOff); Button btOn = (Button) ret.findViewById(R.id.buttonTurnOn); tableRowLamp = ret.findViewById(R.id.tableRowLamp); tableRowChannel = (TableRow) ret.findViewById(R.id.tableRowChannel); eqText = (TextView) ret.findViewById(R.id.textEqualizer); Button btFlash = (Button) ret.findViewById(R.id.flash); Button btSleep = (Button) ret.findViewById(R.id.sleep); Spinner modeSpinner = (Spinner) ret.findViewById(R.id.modeSpinner); tableRowVis = (TableRow) ret.findViewById(R.id.tableRowMusic); FrameLayout mVisualizerViewFrame = (FrameLayout) ret.findViewById(R.id.visualizerViewFrame); //permesso per la visualizer connessa all'audio o mic if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.RECORD_AUDIO}, Constants.MY_PERMISSIONS_RECORD_AUDIO); mVisualizerView = null; } else { inflater.inflate(R.layout.custom_visview, mVisualizerViewFrame); mVisualizerView = (VisualizerView) mVisualizerViewFrame.findViewById(R.id.visualizerView); //mVisualizerViewFrame.addView(mVisualizerView); mVisualizerView.setOpz(opzioni); } seekChannelIntensity = (SeekBar) ret.findViewById(R.id.channelRed); singleChanabel = (TextView) ret.findViewById(R.id.channelLabel); // buttLamp = (ImageView) ret.findViewById(R.id.buttonLamp); btOff.setTag(Constants.Typicals.Souliss_T1n_OffCmd); btOn.setTag(Constants.Typicals.Souliss_T1n_OnCmd); buttPlus.setTag(Constants.Typicals.Souliss_T1n_BrightUp); buttMinus.setTag(Constants.Typicals.Souliss_T1n_BrightDown); btFlash.setTag(Constants.Typicals.Souliss_T1n_Flash); btSleep.setTag(Constants.Typicals.Souliss_T_related); TableRow infoFavs = (TableRow) ret.findViewById(R.id.tableRowFavInfo); TableRow infoTags = (TableRow) ret.findViewById(R.id.tableRowTagInfo); tagView = (SimpleTagRelativeLayout) ret.findViewById(R.id.tag_group); refreshTagsInfo(); // CHANNEL Listeners seekChannelIntensity.setOnSeekBarChangeListener(new channelInputListener()); final OnItemSelectedListener lib = new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { if (pos == 0) {// channels tableRowVis.setVisibility(View.GONE); mVisualizerView.setVisibility(View.GONE); tableRowLamp.setVisibility(View.VISIBLE); tableRowChannel.setVisibility(View.VISIBLE); mVisualizerView.setEnabled(false); eqText.setVisibility(View.GONE); // TODO questi non vanno seekChannelIntensity.setProgress(intensity); } else {// music mVisualizerView.setFrag(T19SingleChannelLedFragment.this); mVisualizerView.link(togMulticast.isChecked()); addBarGraphRenderers(); tableRowLamp.setVisibility(View.GONE); mVisualizerView.setVisibility(View.VISIBLE); tableRowVis.setVisibility(View.VISIBLE); mVisualizerView.setEnabled(true); mVisualizerView.link(togMulticast.isChecked()); eqText.setVisibility(View.VISIBLE); tableRowChannel.setVisibility(View.GONE); } } public void onNothingSelected(AdapterView<?> parent) { } }; // avoid auto call upon Creation with runnable // modeSpinner.post(new Runnable() { // public void run() { modeSpinner.setOnItemSelectedListener(lib); // } // }); // Listener generico OnClickListener plus = new OnClickListener() { public void onClick(View v) { Short cmd = (Short) v.getTag(); assertTrue(cmd != null); collected.issueSingleChannelCommand(cmd, togMulticast.isChecked()); //collected.issueRefresh(); } }; // start thread x decremento OnTouchListener incListener = new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Short cmd = (Short) v.getTag(); assertTrue(cmd != null); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startIncrementing(cmd); v.setPressed(true); break; case MotionEvent.ACTION_UP: stopIncrementing(); v.setPressed(false); break; } v.performClick(); return true; } }; OnTouchListener decListener = new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Short cmd = (Short) v.getTag(); assertTrue(cmd != null); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startDecrementing(cmd); v.setPressed(true); break; case MotionEvent.ACTION_UP: stopDecrementing(); v.setPressed(false); break; } v.performClick(); return true; } }; buttPlus.setOnTouchListener(incListener); buttMinus.setOnTouchListener(decListener); btOff.setOnClickListener(plus); btOn.setOnClickListener(plus); btFlash.setOnClickListener(plus); btSleep.setOnClickListener(plus); String strDisease2Format = getResources().getString(R.string.Souliss_TRGB_eq); String strDisease2Msg = String.format(strDisease2Format, Constants.twoDecimalFormat.format(opzioni.getEqLow()), Constants.twoDecimalFormat.format(opzioni.getEqMed()), Constants.twoDecimalFormat.format(opzioni.getEqHigh())); eqText.setText(strDisease2Msg); return ret; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Rinomina nodo e scelta icona inflater.inflate(R.menu.t16_ctx_menu, menu); Log.i(Constants.TAG, "Inflated Equalizer menu"); super.onCreateOptionsMenu(menu, inflater); } // Methods for adding renderers to visualizer private void addBarGraphRenderers() { Paint paint = new Paint(); paint.setStrokeWidth(50f); paint.setAntiAlias(false); paint.setColor(Color.argb(255, 156, 138, 252)); BarGraphRenderer barGraphRendererBottom = new BarGraphRenderer(32, paint, false); mVisualizerView.addRenderer(barGraphRendererBottom); // TOP Paint paint2 = new Paint(); paint2.setStrokeWidth(12f); paint2.setAntiAlias(false); paint2.setColor(Color.argb(255, 181, 11, 233)); BarGraphRenderer barGraphRendererTop = new BarGraphRenderer(4, paint2, true); mVisualizerView.addRenderer(barGraphRendererTop); } public static T19SingleChannelLedFragment newInstance(int index, SoulissTypical content) { T19SingleChannelLedFragment f = new T19SingleChannelLedFragment(); // Supply index input as an argument. Bundle args = new Bundle(); args.putInt("index", index); // Ci metto il nodo dentro if (content != null) { args.putSerializable("TIPICO", content); } f.setArguments(args); return f; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.equalizer: AlertDialogHelper.equalizerDialog(getActivity(), eqText, this, getActivity()).show(); break; default: return super.onOptionsItemSelected(item); } return false; } @Override public void onResume() { super.onResume(); SoulissDBHelper.open(); if (collected != null) { collected = (SoulissTypical19AnalogChannel) datasource.getTypical(collected.getTypicalDTO() .getNodeId(), collected.getSlot()); collected.issueRefresh(); } IntentFilter filtere = new IntentFilter(); filtere.addAction(Constants.CUSTOM_INTENT_SOULISS_RAWDATA); getActivity().registerReceiver(datareceiver, filtere); } @Override public void onPause() { super.onPause(); getActivity().unregisterReceiver(datareceiver); } @Override public void onDestroy() { super.onDestroy(); // datasource.close(); if (mVisualizerView != null) mVisualizerView.release(); } // Aggiorna il feedback private BroadcastReceiver datareceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // SoulissNode coll = datasource.getSoulissNode(); collected = (SoulissTypical19AnalogChannel) datasource.getTypical(collected .getNodeId(), collected.getSlot()); // Bundle extras = intent.getExtras(); // Bundle vers = (Bundle) extras.get("NODES"); int intensityReal = collected.getIntensity(); Log.d(Constants.TAG, "Detected data arrival, intensity change to: " + intensityReal); singleChanabel.setText(getString(R.string.Souliss_T19_received) + " " + collected.getOutputDesc()); seekChannelIntensity.setProgress(intensityReal); refreshStatusIcon(); } }; /** * Inner class representing the intensity Channels. */ private class channelInputListener implements SeekBar.OnSeekBarChangeListener { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { // curva quadratica int val = seekChannelIntensity.getProgress(); /*int out = (int) (val * val * 255 / 100 / 100); if (out > 255) out = 255;*/ intensity = val; collected.issueSingleChannelCommand(Constants.Typicals.Souliss_T1n_Set, intensity, togMulticast.isChecked()); singleChanabel.setText(getString(R.string.Souliss_T19_set) + " " + val); } } public void onStartTrackingTouch(SeekBar seekBar) { } // solo per sicurezza public void onStopTrackingTouch(SeekBar seekBar) { //commented after https://github.com/souliss/soulissapp/issues/80 //collected.issueRefresh();// } } /** * Souliss RGB light command Souliss OUTPUT Data is: * <p/> * <p/> * INPUT data 'read' from GUI */ public void issueRGBCommand(final short val, final int r, final int g, final int b, final boolean multicast) { collected.issueSingleChannelCommand(val, (r + g + b) / 3, multicast); } }