package it.angelic.soulissclient.fragments; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.FragmentTransaction; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.NumberPicker; import android.widget.Spinner; import android.widget.TableRow; import android.widget.TextView; import it.angelic.soulissclient.Constants; import it.angelic.soulissclient.HalfFloatUtils; 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.SoulissNode; import it.angelic.soulissclient.model.SoulissTypical; import it.angelic.soulissclient.model.db.SoulissDBHelper; import it.angelic.soulissclient.model.typicals.SoulissTypical31Heating; import it.angelic.soulissclient.net.UDPHelper; import it.angelic.soulissclient.views.NumberPickerT6; import it.angelic.tagviewlib.SimpleTagRelativeLayout; import static it.angelic.soulissclient.Constants.Typicals.Souliss_T31; import static it.angelic.soulissclient.Constants.Typicals.Souliss_T3n_AsMeasured; import static it.angelic.soulissclient.Constants.Typicals.Souliss_T3n_Cooling; import static it.angelic.soulissclient.Constants.Typicals.Souliss_T3n_FanAuto; import static it.angelic.soulissclient.Constants.Typicals.Souliss_T3n_FanHigh; import static it.angelic.soulissclient.Constants.Typicals.Souliss_T3n_FanLow; import static it.angelic.soulissclient.Constants.Typicals.Souliss_T3n_FanMed; import static it.angelic.soulissclient.Constants.Typicals.Souliss_T3n_Heating; import static it.angelic.soulissclient.Constants.Typicals.Souliss_T3n_Set; import static it.angelic.soulissclient.Constants.Typicals.Souliss_T3n_ShutOff; import static junit.framework.Assert.assertTrue; public class T31HeatingFragment extends AbstractTypicalFragment implements NumberPicker.OnValueChangeListener { private SoulissTypical31Heating collected; private SoulissDBHelper datasource = new SoulissDBHelper(SoulissApp.getAppContext()); private Spinner fanSpiner; private Spinner functionSpinner; private FrameLayout hvacChart; private ImageView imageFan1; private ImageView imageFan2; private ImageView imageFan3; private EditText incrementText; private SoulissPreferenceHelper opzioni; private NumberPickerT6 tempSlider; private TextView textviewStatus; // Aggiorna il feedback private BroadcastReceiver datareceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { try { Log.i(Constants.TAG, "Broadcast received, TODO change Spinners status intent" + intent.toString()); SoulissDBHelper.open(); SoulissNode coll = datasource.getSoulissNode(collected.getTypicalDTO().getNodeId()); collected = (SoulissTypical31Heating) coll.getTypical(collected.getTypicalDTO().getSlot()); refreshStatusIcon(); //refreshTagsInfo(); textviewStatus.setText(collected.getTypedOutputValue()); Log.e(Constants.TAG, "Setting Temp Slider:" + collected.getTemperatureSetpointVal()); if (collected.isFannTurnedOn(1)) imageFan1.setVisibility(View.VISIBLE); else imageFan1.setVisibility(View.INVISIBLE); if (collected.isFannTurnedOn(2)) imageFan2.setVisibility(View.VISIBLE); else imageFan2.setVisibility(View.INVISIBLE); if (collected.isFannTurnedOn(3)) imageFan3.setVisibility(View.VISIBLE); else imageFan3.setVisibility(View.INVISIBLE); } catch (Exception e) { Log.e(Constants.TAG, "Error receiving data. Fragment disposed?", e); } } }; public static T31HeatingFragment newInstance(int index, SoulissTypical content) { T31HeatingFragment f = new T31HeatingFragment(); // 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 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); setHasOptionsMenu(true); if (!opzioni.isDbConfigured()) { AlertDialogHelper.dbNotInitedDialog(getActivity()); } super.onActivityCreated(savedInstanceState); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // inflater.inflate(R.menu.queue_options, 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_t31, container, false); datasource = new SoulissDBHelper(getActivity()); SoulissDBHelper.open(); Bundle extras = getActivity().getIntent().getExtras(); if (extras != null && extras.get("TIPICO") != null) { collected = (SoulissTypical31Heating) extras.get("TIPICO"); } else if (getArguments() != null) { collected = (SoulissTypical31Heating) getArguments().get("TIPICO"); } else { Log.e(Constants.TAG, "Error retriving node:"); return ret; } //refresh forzato final SoulissNode coll = datasource.getSoulissNode(collected.getTypicalDTO().getNodeId()); collected = (SoulissTypical31Heating) coll.getTypical(collected.getTypicalDTO().getSlot()); assertTrue("TIPICO NULLO", collected instanceof SoulissTypical31Heating); collected.setPrefs(opzioni); super.setCollected(collected); refreshStatusIcon(); Button buttOn = (Button) ret.findViewById(R.id.buttonTurnOn); Button buttOff = (Button) ret.findViewById(R.id.buttonTurnOff); textviewStatus = (TextView) ret.findViewById(R.id.textviewStatus); TextView textViewTagDescgroup = (TextView) ret.findViewById(R.id.TextViewTagDescgroup); View viewTagDescgroup = ret.findViewById(R.id.TagDiv); tempSlider = (NumberPickerT6) ret.findViewById(R.id.tempSlider); functionSpinner = (Spinner) ret.findViewById(R.id.spinnerFunction); fanSpiner = (Spinner) ret.findViewById(R.id.spinnerFan); Button asMeasuredButton = (Button) ret.findViewById(R.id.asMeasuredButton); infoTags = (TableRow) ret.findViewById(R.id.tableRowTagInfo); imageFan1 = (ImageView) ret.findViewById(R.id.ImageFan1); imageFan2 = (ImageView) ret.findViewById(R.id.ImageFan2); imageFan3 = (ImageView) ret.findViewById(R.id.ImageFan3); incrementText = (EditText) ret.findViewById(R.id.editTextIncrement); tagView = (SimpleTagRelativeLayout) ret.findViewById(R.id.tag_group); //hvacChart = (FrameLayout) ret.findViewById(R.id.hvacChart); final android.support.v4.app.FragmentManager manager = getActivity().getSupportFragmentManager(); //Fragment details = manager.findFragmentById(R.id.hvacChart); Handler mHandler = new Handler(); mHandler.postDelayed(new Runnable() { @Override public void run() { ChartFragment NewFrag = ChartFragment.newInstance(collected); FragmentTransaction ft = manager.beginTransaction(); ft.replace(R.id.hvacChart, NewFrag); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.commit(); } }, 1000); if (!collected.getTypicalDTO().isTagged()) { textViewTagDescgroup.setVisibility(View.GONE); viewTagDescgroup.setVisibility(View.GONE); } refreshTagsInfo(); /** * LISTENER SPINNER DESTINATARIO, IN TESTATA */ final OnItemSelectedListener lit = new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { if (pos == 0) {//fa cagare collected.issueCommand(Souliss_T3n_Cooling, null); } else if (pos == 1) { collected.issueCommand(Souliss_T3n_Heating, null); } else { collected.issueCommand(Souliss_T3n_ShutOff, null); } } public void onNothingSelected(AdapterView<?> parent) { } }; final OnItemSelectedListener lib = new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { if (pos == 0) {//fa cagare collected.issueCommand(Souliss_T3n_FanAuto, null); } else if (pos == 1) { collected.issueCommand(Souliss_T3n_FanHigh, null); } else if (pos == 2) { collected.issueCommand(Souliss_T3n_FanMed, null); } else if (pos == 3) { collected.issueCommand(Souliss_T3n_FanLow, null); } } public void onNothingSelected(AdapterView<?> parent) { } }; // avoid auto call upon Creation with runnable functionSpinner.post(new Runnable() { public void run() { if (!collected.isTurnedOn()) functionSpinner.setSelection(2); else functionSpinner.setSelection(collected.isCoolMode() ? 0 : 1, false); functionSpinner.setOnItemSelectedListener(lit); fanSpiner.setOnItemSelectedListener(lib); } }); tempSlider.setModel(Souliss_T31); incrementText.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { tempSlider.invalidate(); // visto che non fa lui, faccio io new Thread(new Runnable() { @Override public void run() { UDPHelper.pollRequest(opzioni, 1, coll.getNodeId()); } }).start(); } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { try { if (Float.valueOf(s.toString()) < 0.1f || Float.valueOf(s.toString()) > 10f) throw new Exception(); tempSlider.setIncrement(Float.valueOf(s.toString())); int sel = tempSlider.generateDisplayValues(tempSlider.getRealVal()); tempSlider.setValue(sel); tempSlider.invalidate(); } catch (Exception er) { incrementText.setError(getContext().getString(R.string.increment_input_err)); } } }); // int sel = tempSlider.generateDisplayValues(collected.getTemperatureSetpointVal()); tempSlider.setRealVal(collected.getTemperatureSetpointVal()); // tempSlider.setValue(( collected.getTemperatureSetpointVal())); tempSlider.setWrapSelectorWheel(false); //tempSlider.setDisplayedValues(nums); tempSlider.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); tempSlider.setOnValueChangedListener(this); // Listener generico OnClickListener asMeasuredListener = new OnClickListener() { public void onClick(View v) { collected.issueCommand(Souliss_T3n_AsMeasured, null); return; } }; asMeasuredButton.setOnClickListener(asMeasuredListener); buttOn.setOnClickListener(new OnClickListener() { public void onClick(View v) { //int act = Integer.parseInt(textviewTemperature.getText().toString()); if (functionSpinner.getSelectedItemPosition() == 0) collected.issueCommand(Souliss_T3n_Cooling, Float.valueOf(tempSlider.getValue())); else if (functionSpinner.getSelectedItemPosition() == 1) collected.issueCommand(Souliss_T3n_Heating, Float.valueOf(tempSlider.getValue())); //else OFF, non fare nulla } }); buttOff.setOnClickListener(new OnClickListener() { public void onClick(View v) { collected.issueCommand(Souliss_T3n_ShutOff, null); } }); return ret; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { NodeDetailFragment details = NodeDetailFragment.newInstance(collected.getTypicalDTO().getNodeId(), collected.getParentNode()); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager().beginTransaction(); if (opzioni.isAnimationsEnabled()) ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); ft.replace(R.id.detailPane, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); ft.commit(); } else { Log.i(Constants.TAG, "Close fragment"); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.remove(getFragmentManager().findFragmentById(R.id.detailPane)).commit(); } return true; } return super.onOptionsItemSelected(item); } @Override public void onPause() { super.onPause(); getActivity().unregisterReceiver(datareceiver); } @Override public void onResume() { super.onResume(); SoulissDBHelper.open(); IntentFilter filtere = new IntentFilter(); filtere.addAction("it.angelic.soulissclient.GOT_DATA"); filtere.addAction(Constants.CUSTOM_INTENT_SOULISS_RAWDATA); getActivity().registerReceiver(datareceiver, filtere); refreshTagsInfo(); //tempSlider.setValue(((int) collected.getTemperatureSetpointVal())); //Ask first refresh collected.issueRefresh(); } @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { Thread t = new Thread() { public void run() { // collected.issueCommand(Souliss_T3n_Set, Float.valueOf(tempSlider.getValue())); Float work = Float.parseFloat(tempSlider.getDisplayedValues()[tempSlider.getValue()]); int re = HalfFloatUtils.fromFloat(work); String first, second; String pars = Long.toHexString(re); Log.i(Constants.TAG, "PARSED SETPOINT TEMP: 0x" + pars); try { second = Integer.toString(Integer.parseInt(pars.substring(0, 2), 16)); } catch (StringIndexOutOfBoundsException sie) { second = "0"; } try { first = Integer.toString(Integer.parseInt(pars.substring(2, 4), 16)); } catch (StringIndexOutOfBoundsException sie) { first = "0"; } //INVERTITI? Occhio final String[] cmd = {"" + Souliss_T3n_Set, "0", "0", first, second}; //verifyCommand(temp, first, second); UDPHelper.issueSoulissCommand("" + collected.getNodeId(), "" + collected.getSlot(), SoulissApp.getOpzioni(), cmd); } }; t.start(); } }