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.v4.content.ContextCompat; 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.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.FrameLayout; import android.widget.RelativeLayout; 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 com.rtugeek.android.colorseekbar.ColorSeekBar; 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.helpers.SoulissPreferenceHelper; import it.angelic.soulissclient.model.SoulissTypical; import it.angelic.soulissclient.model.db.SoulissDBHelper; import it.angelic.soulissclient.model.typicals.SoulissTypical16AdvancedRGB; import it.angelic.tagviewlib.SimpleTagRelativeLayout; import static junit.framework.Assert.assertTrue; public class T16RGBAdvancedFragment extends AbstractMusicVisualizerFragment { private TextView blueChanabel; private Button btFeedBackPatern; private CheckBox checkBoxScatter; private SoulissTypical16AdvancedRGB collected; private int color = 0; private ColorSeekBar colorSeekBar; private ColorSeekBar colorSeekBarStop; private RelativeLayout colorSwitchRelativeLayout; // private Runnable senderThread; private boolean continueDecrementing; private boolean continueIncrementing; private ColorPickerView cpv; private SoulissDBHelper datasource = new SoulissDBHelper(getActivity()); // private SoulissTypical related; // Aggiorna il feedback private BroadcastReceiver datareceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // SoulissNode coll = datasource.getSoulissNode(); try { collected = (SoulissTypical16AdvancedRGB) datasource.getTypical(collected .getNodeId(), collected.getSlot()); // Bundle extras = intent.getExtras(); // Bundle vers = (Bundle) extras.get("NODES"); // color = collected.getColor(); if (collected.getOutput() == Constants.Typicals.Souliss_T1n_OffCoil) { cpv.setCenterColor(ContextCompat.getColor(getActivity(), R.color.black)); } else { Log.d(Constants.TAG, "RGB Out:" + collected.getOutput()); cpv.setCenterColor(Color.argb(255, Color.red(collected.getColor()), Color.green(collected.getColor()), Color.blue(collected.getColor()))); color = Color.argb(255, Color.red(collected.getColor()), Color.green(collected.getColor()), Color.blue(collected.getColor())); Log.d(Constants.TAG, "Detected data arrival, color change to: R" + Color.red(color) + " G" + Color.green(color) + " B" + Color.blue(color)); } cpv.invalidate(); } catch (Exception e) { Log.e(Constants.TAG, "Errore broadcast Receive! " + e.getMessage()); } } }; private TextView eqText; private TextView greenChanabel; // private CheckBox checkMusic; private VisualizerView mVisualizerView; private FrameLayout mVisualizerViewFrame; private Spinner modeSpinner; private SoulissPreferenceHelper opzioni; private PatternRunnerThread patternRunner; private TextView redChanabel; private SeekBar seekChannelBlue; private SeekBar seekChannelGreen; private SeekBar seekChannelRed; private SeekBar sliderSpeed; private TableRow tableRowChannel; private TableRow tableRowEq; private TableRow tableRowPatterns; private TableRow tableRowVis; private SwitchCompat togMulticast; public static T16RGBAdvancedFragment newInstance(int index, SoulissTypical content) { T16RGBAdvancedFragment f = new T16RGBAdvancedFragment(); // 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; } // 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); } synchronized private boolean isDecrementing() { return continueDecrementing; } synchronized private boolean isIncrementing() { return continueIncrementing; } /** * *********************************************************************** * 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.issueRGBCommand(val, r, g, b, multicast); } @Override public void onActivityCreated(Bundle savedInstanceState) { opzioni = SoulissApp.getOpzioni(); // tema if (opzioni.isLightThemeSelected()) getActivity().setTheme(R.style.LightThemeSelector); else getActivity().setTheme(R.style.DarkThemeSelector); super.onCreate(savedInstanceState); if (!opzioni.isDbConfigured()) { AlertDialogHelper.dbNotInitedDialog(getActivity()); } setHasOptionsMenu(true); patternRunner = new PatternRunnerThread(); super.onActivityCreated(savedInstanceState); } @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); } @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_t16_rgb, container, false); datasource = new SoulissDBHelper(getActivity()); SoulissDBHelper.open(); Bundle extras = getActivity().getIntent().getExtras(); if (extras != null && extras.get("TIPICO") != null) { collected = (SoulissTypical16AdvancedRGB) extras.get("TIPICO"); } else if (getArguments() != null) { collected = (SoulissTypical16AdvancedRGB) getArguments().get("TIPICO"); } else { Log.e(Constants.TAG, "Error retriving node!"); return ret; } assertTrue("TIPICO NULLO", collected != null); collected.setPrefs(opzioni); super.setCollected(collected); refreshStatusIcon(); Button buttPlus = (Button) ret.findViewById(R.id.buttonPlus); Button buttMinus = (Button) ret.findViewById(R.id.buttonMinus); togMulticast = (SwitchCompat) ret.findViewById(R.id.checkBoxMulticast); togMulticast.setChecked(opzioni.isRgbSendAllDefault()); Button btOff = (Button) ret.findViewById(R.id.buttonTurnOff); Button btOn = (Button) ret.findViewById(R.id.buttonTurnOn); Button btStartPattern = (Button) ret.findViewById(R.id.buttonStartPattern); Button btStopPattern = (Button) ret.findViewById(R.id.buttonStopPattern); btFeedBackPatern = (Button) ret.findViewById(R.id.buttonPatternFeedback); tableRowChannel = (TableRow) ret.findViewById(R.id.tableRowChannel); tableRowPatterns = (TableRow) ret.findViewById(R.id.tableRowPatterns); tableRowEq = (TableRow) ret.findViewById(R.id.tableRowEqualizer); Button btWhite = (Button) ret.findViewById(R.id.white); Button btFlash = (Button) ret.findViewById(R.id.flash); Button btSleep = (Button) ret.findViewById(R.id.sleep); modeSpinner = (Spinner) ret.findViewById(R.id.modeSpinner); tableRowVis = (TableRow) ret.findViewById(R.id.tableRowMusic); tagView = (SimpleTagRelativeLayout) ret.findViewById(R.id.tag_group); sliderSpeed = (SeekBar) ret.findViewById(R.id.sliderSpeed); checkBoxScatter = (CheckBox) ret.findViewById(R.id.checkBoxScatter); 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); } colorSwitchRelativeLayout = (RelativeLayout) ret.findViewById(R.id.colorSwitch); seekChannelRed = (SeekBar) ret.findViewById(R.id.channelRed); seekChannelGreen = (SeekBar) ret.findViewById(R.id.channelGreen); seekChannelBlue = (SeekBar) ret.findViewById(R.id.channelBlue); redChanabel = (TextView) ret.findViewById(R.id.channelRedLabel); blueChanabel = (TextView) ret.findViewById(R.id.channelBlueLabel); greenChanabel = (TextView) ret.findViewById(R.id.channelGreenLabel); colorSeekBar = (ColorSeekBar) ret.findViewById(R.id.colorSlider); colorSeekBarStop = (ColorSeekBar) ret.findViewById(R.id.colorSliderStop); 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); infoTags = (TableRow) ret.findViewById(R.id.tableRowTagInfo); eqText = (TextView) ret.findViewById(R.id.textEqualizer); // avoid auto call upon Creation with runnable seekChannelRed.post(new Runnable() { public void run() { // CHANNEL Listeners seekChannelRed.setOnSeekBarChangeListener(new channelInputListener()); seekChannelGreen.setOnSeekBarChangeListener(new channelInputListener()); seekChannelBlue.setOnSeekBarChangeListener(new channelInputListener()); } }); refreshTagsInfo(); final OnItemSelectedListener lib = new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { patternRunner.setPatternRunning(false); tableRowPatterns.setVisibility(View.GONE); tableRowVis.setVisibility(View.GONE); mVisualizerViewFrame.setVisibility(View.GONE); eqText.setVisibility(View.GONE); colorSwitchRelativeLayout.setVisibility(View.GONE); tableRowChannel.setVisibility(View.GONE); //potrebbe essere out of sync, lo resetto color = (Color.argb(255, Color.red(collected.getColor()), Color.green(collected.getColor()), Color.blue(collected.getColor()))); if (pos == 0) {// cerchio RGB tableRowEq.setVisibility(View.INVISIBLE); if (mVisualizerView != null) { mVisualizerView.setVisibility(View.GONE); mVisualizerView.setEnabled(false); } colorSwitchRelativeLayout.setVisibility(View.VISIBLE); cpv.setCenterColor(Color.argb(255, Color.red(color), Color.green(color), Color.blue(color))); } else if (pos == 1) {// channels if (mVisualizerView != null) { mVisualizerView.setVisibility(View.GONE); mVisualizerView.setEnabled(false); } tableRowChannel.setVisibility(View.VISIBLE); tableRowEq.setVisibility(View.INVISIBLE); // ok android 5 seekChannelRed.setProgress(0); seekChannelRed.invalidate(); seekChannelGreen.setProgress(0); seekChannelGreen.invalidate(); seekChannelBlue.setProgress(0); seekChannelBlue.invalidate(); seekChannelRed.setProgress(Color.red(color)); seekChannelGreen.setProgress(Color.green(color)); seekChannelBlue.setProgress(Color.blue(color)); Log.i(Constants.TAG, "channel mode, color=" + Color.red(color) + " " + Color.green(color) + " " + Color.blue(color)); tableRowChannel.invalidate(); } else if (pos == 2) {// music if (mVisualizerView != null) { mVisualizerView.setFrag(T16RGBAdvancedFragment.this); mVisualizerView.link(togMulticast.isChecked()); mVisualizerView.setVisibility(View.VISIBLE); mVisualizerView.setEnabled(true); addBarGraphRenderers(); } mVisualizerViewFrame.setVisibility(View.VISIBLE); tableRowVis.setVisibility(View.VISIBLE); eqText.setVisibility(View.VISIBLE); tableRowEq.setVisibility(View.VISIBLE); } else {// patterns tableRowPatterns.setVisibility(View.VISIBLE); patternRunner.setPatternRunning(true); if (mVisualizerView != null) { mVisualizerView.setVisibility(View.GONE); mVisualizerView.setEnabled(false); } tableRowEq.setVisibility(View.INVISIBLE); } } 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); issueRGBCommand(cmd, Color.red(color), Color.green(color), Color.blue(color), togMulticast.isChecked()); new Thread(new Runnable() { public void run() { while (isIncrementing()) { try { Thread.sleep(250); collected.issueRefresh(); } catch (InterruptedException e) { Log.e(Constants.TAG, "Error Thread.sleep:"); } } } }).start(); } }; togMulticast.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { opzioni.setRgbSendAllDefault(true); } else { opzioni.setRgbSendAllDefault(false); } } }); // 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); // bianco manuale btWhite.setOnClickListener(new OnClickListener() { public void onClick(View v) { issueRGBCommand(Constants.Typicals.Souliss_T1n_Set, 254, 254, 254, togMulticast.isChecked()); } }); OnColorChangedListener dialogColorChangedListener = new OnColorChangedListener() { /** * {@inheritDoc} */ public void colorChanged(int c) { // Log.i(Constants.TAG, "color changed:" + c); color = c; collected.issueRGBCommand(Constants.Typicals.Souliss_T1n_Set, Color.red(color), Color.green(color), Color.blue(color), togMulticast.isChecked()); Log.d(Constants.TAG, "dialogColorChangedListener, color change to: R" + Color.red(color) + " G" + Color.green(color) + " B" + Color.blue(color)); } }; colorSeekBar.setOnColorChangeListener(new ColorSeekBar.OnColorChangeListener() { @Override public void onColorChangeListener(int colorBarValue, int alphaBarValue, int color) { patternRunner.setColorFrom(colorSeekBar.getColor()); } }); colorSeekBarStop.setOnColorChangeListener(new ColorSeekBar.OnColorChangeListener() { @Override public void onColorChangeListener(int colorBarValue, int alphaBarValue, int color) { patternRunner.setColorTo(colorSeekBarStop.getColor()); } }); sliderSpeed.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { patternRunner.setSliderSpeed(sliderSpeed.getProgress()); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); //PATTERN animator btStartPattern.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { patternRunner = new PatternRunnerThread(getActivity(), collected, btFeedBackPatern); patternRunner.setColorFrom(colorSeekBar.getColor()); patternRunner.setColorTo(colorSeekBarStop.getColor()); patternRunner.setMulticastMode(togMulticast.isChecked()); patternRunner.setScatterMode(checkBoxScatter.isChecked()); patternRunner.setSliderSpeed(sliderSpeed.getProgress()); patternRunner.setPatternRunning(true); patternRunner.start(); } }); btStopPattern.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { patternRunner.setPatternRunning(false); } }); //la prima volta prendo il colore dal typ color = (Color.argb(255, Color.red(collected.getColor()), Color.green(collected.getColor()), Color.blue(collected.getColor()))); cpv = new ColorPickerView(getActivity(), dialogColorChangedListener, color, colorSwitchRelativeLayout, collected); colorSwitchRelativeLayout.addView(cpv); return ret; } @Override public void onDestroy() { super.onDestroy(); if (mVisualizerView != null) mVisualizerView.release(); } @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 onPause() { super.onPause(); getActivity().unregisterReceiver(datareceiver); //if (mVisualizerView != null) // mVisualizerView.setEnabled(false); } @Override public void onResume() { super.onResume(); SoulissDBHelper.open(); IntentFilter filtere = new IntentFilter(); filtere.addAction(Constants.CUSTOM_INTENT_SOULISS_RAWDATA); getActivity().registerReceiver(datareceiver, filtere); refreshStatusIcon(); } synchronized void setIsDecrementing(boolean newSetting) { continueDecrementing = newSetting; } /** * Per gestire tasto premuto * * @param newSetting */ synchronized void setIsIncrementing(boolean newSetting) { continueIncrementing = newSetting; } /** * 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()) { issueRGBCommand(cmd, Color.red(color), Color.green(color), Color.blue(color), togMulticast.isChecked()); try { Thread.sleep(500); } catch (InterruptedException e) { Log.e(Constants.TAG, "Error Thread.sleep:"); } } } }).start(); } /** * 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()) { issueRGBCommand(cmd, Color.red(color), Color.green(color), Color.blue(color), togMulticast.isChecked()); try { Thread.sleep(500); } catch (InterruptedException e) { Log.e(Constants.TAG, "Error Thread.sleep:"); } } } }).start(); } synchronized private void stopDecrementing() { setIsDecrementing(false); collected.issueRefresh(); } synchronized private void stopIncrementing() { setIsIncrementing(false); collected.issueRefresh(); } /** * Interface describing a color change listener. */ public interface OnColorChangedListener { /** * Method colorChanged is called when a new color is selected. * * @param color new color. */ void colorChanged(int color); } /** * Inner class representing the color Channels. */ private class channelInputListener implements SeekBar.OnSeekBarChangeListener { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { Log.d(Constants.TAG, "onProgressChanged, color change to: R" + seekChannelRed.getProgress() + " G" + seekChannelGreen.getProgress() + " B" + seekChannelBlue.getProgress() + " from user:" + fromUser); redChanabel.setText(getString(R.string.red) + " - " + Color.red(color)); greenChanabel.setText(getString(R.string.green) + " - " + Color.green(color)); blueChanabel.setText(getString(R.string.blue) + " - " + Color.blue(color)); color = Color.argb(255, seekChannelRed.getProgress(), seekChannelGreen.getProgress(), seekChannelBlue.getProgress()); issueRGBCommand(Constants.Typicals.Souliss_T1n_Set, Color.red(color), Color.green(color), Color.blue(color), togMulticast.isChecked()); } } public void onStartTrackingTouch(SeekBar seekBar) { } // solo per sicurezza public void onStopTrackingTouch(SeekBar seekBar) { collected.issueRefresh(); } } }