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.Looper;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.SwitchCompat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.NumberPicker;
import android.widget.SeekBar;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import com.dacer.androidcharts.ClockPieView;
import com.pheelicks.visualizer.VisualizerView;
import java.util.Date;
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.helpers.TimeHourSpinnerUtils;
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.SoulissTypical11DigitalOutput;
import it.angelic.soulissclient.model.typicals.SoulissTypical12DigitalOutputAuto;
import it.angelic.soulissclient.net.UDPHelper;
import it.angelic.soulissclient.util.SoulissUtils;
import it.angelic.tagviewlib.SimpleTagRelativeLayout;
import static it.angelic.soulissclient.Constants.Typicals.Souliss_T1n_AutoCmd;
import static it.angelic.soulissclient.Constants.Typicals.Souliss_T1n_OffCmd;
import static it.angelic.soulissclient.Constants.Typicals.Souliss_T1n_OffCoil;
import static it.angelic.soulissclient.Constants.Typicals.Souliss_T1n_OffCoil_Auto;
import static it.angelic.soulissclient.Constants.Typicals.Souliss_T1n_OnCmd;
import static it.angelic.soulissclient.Constants.Typicals.Souliss_T1n_OnCoil;
import static it.angelic.soulissclient.Constants.Typicals.Souliss_T1n_OnCoil_Auto;
import static it.angelic.soulissclient.Constants.Typicals.Souliss_T1n_Timed;
import static junit.framework.Assert.assertTrue;
public class T1nGenericLightFragment extends AbstractTypicalFragment implements NumberPicker.OnValueChangeListener {
private ClockPieView clockPieView;
private SoulissDBHelper datasource = new SoulissDBHelper(SoulissApp.getAppContext());
private SoulissPreferenceHelper opzioni;
private Button buttPlus;
private NumberPicker warner;
private CheckBox warnerCheck;
private SoulissTypical collected;
// private SoulissTypical related;
private SeekBar timer;
// Color change listener.
private VisualizerView mVisualizerView;
private TextView timerInfo;
private TextView autoInfo;
private TextView infoTyp;
private SwitchCompat togMassive;
private TextView infoHistory;
public static T1nGenericLightFragment newInstance(int index, SoulissTypical content) {
T1nGenericLightFragment f = new T1nGenericLightFragment();
// 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;
}
/**
* 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);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
opzioni = SoulissApp.getOpzioni();
opzioni.reload();
// 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 void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(false);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (container == null)
return null;
opzioni = SoulissApp.getOpzioni();
opzioni.reload();
View ret = inflater.inflate(R.layout.frag_t1n, container, false);
datasource = new SoulissDBHelper(getActivity());
SoulissDBHelper.open();
Bundle extras = getActivity().getIntent().getExtras();
if (extras != null && extras.get("TIPICO") != null) {
collected = (SoulissTypical) extras.get("TIPICO");
} else if (getArguments() != null) {
collected = (SoulissTypical) getArguments().get("TIPICO");
} else {
Log.e(Constants.TAG, "Error retriving node:");
return ret;
}
assertTrue("TIPICO NULLO", collected instanceof SoulissTypical);
collected.setPrefs(opzioni);
super.setCollected(collected);
warnerCheck = (CheckBox) ret.findViewById(R.id.checkBoxWarn);
warner = (NumberPicker) ret.findViewById(R.id.warnTimer);
buttPlus = (Button) ret.findViewById(R.id.buttonPlus);
Button buttAuto = (Button) ret.findViewById(R.id.buttonAuto);
timer = (SeekBar) ret.findViewById(R.id.sleepBar);
timerInfo = (TextView) ret.findViewById(R.id.textviewTimerInfo);
autoInfo = (TextView) ret.findViewById(R.id.textviewAutoInfo);
Button btSleep = (Button) ret.findViewById(R.id.sleep);
infoTyp = (TextView) ret.findViewById(R.id.textView1nInfo);
infoTags = (TableRow) ret.findViewById(R.id.tableRowTagInfo);
infoHistory = (TextView) ret.findViewById(R.id.textviewHistoryInfo);
togMassive = (SwitchCompat) ret.findViewById(R.id.buttonMassive);
mVisualizerView = (VisualizerView) ret.findViewById(R.id.visualizerView);
tagView = (SimpleTagRelativeLayout) ret.findViewById(R.id.tag_group);
clockPieView = (ClockPieView) ret.findViewById(R.id.pie_view);
buttPlus.setTag(Constants.Typicals.Souliss_T1n_BrightUp);
infoTyp.setText(collected.getParentNode().getNiceName() + " - Slot " + collected.getSlot() + " - Out: 0x" + Integer.toHexString(collected.getOutput().intValue()));
refreshTagsInfo();
refreshHistoryInfo();
String nums[]= {getString(R.string.hours),"1/4","1/2","3/4","1","2","3","4","5","6","8","12","24"};
warner.setMaxValue(nums.length-1);
warner.setMinValue(0);
warner.setWrapSelectorWheel(false);
warner.setDisplayedValues(nums);
warner.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
warner.setOnValueChangedListener(this);
warnerCheck.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(warnerCheck.isChecked()){
if (!opzioni.isDataServiceEnabled()) {
AlertDialogHelper.serviceNotActiveDialog(getActivity());
}
Log.d(Constants.TAG, "Spinner VAL: " + TimeHourSpinnerUtils.getTimeArrayValMsec(warner.getValue()));
collected.getTypicalDTO().setWarnDelayMsec(TimeHourSpinnerUtils.getTimeArrayValMsec(warner.getValue()));
collected.getTypicalDTO().persist();
}else{
System.out.println("Un-Checked");
collected.getTypicalDTO().setWarnDelayMsec(0);
collected.getTypicalDTO().persist();
// salvo il warn
}
Log.d(Constants.TAG, "SAVED warn timer: " + collected.getTypicalDTO().getWarnDelayMsec());
}
});
btSleep.setTag(Constants.Typicals.Souliss_T_related);
// Listener generico
OnClickListener plus = new OnClickListener() {
public void onClick(View v) {
Short cmd = (Short) v.getTag();
if (collected.getOutput() == Souliss_T1n_OnCoil || collected.getOutput() == Souliss_T1n_OnCoil_Auto) {
shutoff();
} else if (collected.getOutput() == Souliss_T1n_OffCoil || collected.getOutput() == Souliss_T1n_OffCoil_Auto) {
turnOn(0);
} else {
Log.e(Constants.TAG, "OUTPUT Error");
}
assertTrue(cmd != null);
}
};
buttPlus.setOnClickListener(plus);
buttAuto.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Thread t = new Thread() {
public void run() {
if (togMassive.isChecked())
UDPHelper.issueMassiveCommand("" + collected.getTypical(), opzioni,
String.valueOf(Souliss_T1n_AutoCmd));
else
UDPHelper.issueSoulissCommand("" + collected.getNodeId(), ""
+ collected.getSlot(), opzioni,
String.valueOf(Souliss_T1n_AutoCmd));
}
};
t.start();
Toast.makeText(
getActivity(),
getActivity().getString(R.string.Souliss_AutoCmd_desc) + " "
+ getActivity().getString(R.string.command_sent), Toast.LENGTH_SHORT).show();
}
});
OnClickListener plusSlip = new OnClickListener() {
public void onClick(View v) {
// Il timer parte da 10...
turnOn(timer.getProgress() + 0x30);
return;
}
};
btSleep.setOnClickListener(plusSlip);
if (collected instanceof SoulissTypical12DigitalOutputAuto) {
btSleep.setVisibility(View.GONE);
timer.setVisibility(View.GONE);
timerInfo.setVisibility(View.GONE);
// Check AUTO mode
if (collected.getOutput() == Souliss_T1n_OnCoil || collected.getOutput() == Souliss_T1n_OnCoil_Auto)
autoInfo.setText(getString(R.string.Souliss_Auto_mode) + " ON");
else
autoInfo.setText(getString(R.string.Souliss_Auto_mode) + " OFF");
} else if (collected instanceof SoulissTypical11DigitalOutput) {
buttAuto.setVisibility(View.GONE);
autoInfo.setVisibility(View.GONE);
}
// sfondo bottone
if (collected.getOutput() == Souliss_T1n_OnCoil
|| collected.getOutput() == Souliss_T1n_OnCoil_Auto)
buttPlus.setBackgroundResource(R.drawable.bulb_on);
else if (collected.getOutput() == Souliss_T1n_OffCoil
|| collected.getOutput() == Souliss_T1n_OffCoil_Auto)
buttPlus.setBackgroundResource(R.drawable.bulb_off);
return ret;
}
private void refreshHistoryInfo() {
if (!opzioni.isLogHistoryEnabled()) {
//nascondi roba
infoHistory.setVisibility(View.GONE);
clockPieView.setVisibility(View.GONE);
return;
}
try {
StringBuilder str = new StringBuilder();
int msecOn = datasource.getTypicalOnDurationMsec(collected, TimeRangeEnum.LAST_WEEK);
if (collected.getOutput() != 0) {
Date when = collected.getTypicalDTO().getLastStatusChange();
long swap = new Date().getTime() - when.getTime();
msecOn += swap;
String strMeatFormat = getResources().getString(R.string.manual_litfrom);
String strMeatMsg = String.format(strMeatFormat, SoulissUtils.getDuration(swap));
str.append(strMeatMsg);
}
str.append("\n");
String strMeatFormat = getResources().getString(R.string.manual_tyinf);
String strMeatMsg = String.format(strMeatFormat, SoulissUtils.getDuration(msecOn));
str.append(strMeatMsg);
infoHistory.setText(str.toString());
//bella questa eh
clockPieView.setDate(datasource.getTypicalOnClockPie(collected, TimeRangeEnum.LAST_WEEK));
}catch (Exception ie){
Log.e(Constants.TAG,"cant refresh history:"+ie.getMessage());
}
}
private void shutoff() {
Thread t = new Thread() {
public void run() {
Looper.prepare();
if (togMassive.isChecked())
UDPHelper.issueMassiveCommand("" + collected.getTypical(), opzioni, ""
+ (Souliss_T1n_OffCmd));
else
UDPHelper.issueSoulissCommand("" + collected.getParentNode().getNodeId(), ""
+ collected.getSlot(), opzioni,""
+ (Souliss_T1n_OffCmd));
}
};
t.start();
Toast.makeText(getActivity(),
getActivity().getString(R.string.TurnOFF) + " " + getActivity().getString(R.string.command_sent),
Toast.LENGTH_SHORT).show();
return;
}
private void turnOn(final int i) {
Thread t = new Thread() {
public void run() {
Looper.prepare();
if (togMassive.isChecked())
UDPHelper.issueMassiveCommand("" + collected.getTypical(), opzioni, ""
+ (Souliss_T1n_OnCmd + i));
else
UDPHelper.issueSoulissCommand("" + collected.getParentNode().getNodeId(), ""
+ collected.getSlot(), opzioni, ""
+ (Souliss_T1n_OnCmd + i));
}
};
t.start();
if (i > 0)
Toast.makeText(
getActivity(),
getActivity().getString(R.string.Souliss_TRGB_sleep) + " "
+ getActivity().getString(R.string.command_sent), Toast.LENGTH_SHORT).show();
else
Toast.makeText(getActivity(),
getActivity().getString(R.string.TurnON) + " " + getActivity().getString(R.string.command_sent),
Toast.LENGTH_SHORT).show();
return;
}
@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.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();
/*getActivity().supportFinishAfterTransition();
if (opzioni.isAnimationsEnabled())
getActivity().overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);*/
}
return true;
}
return super.onOptionsItemSelected(item);
}
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
//disabilita la checkbox cosi da forzare il refresh
warnerCheck.setChecked(false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.d(Constants.TAG, "Injecting warn timer: " + collected.getTypicalDTO().getWarnDelayMsec());
warner.setValue(TimeHourSpinnerUtils.getTimeArrayPos(collected.getTypicalDTO().getWarnDelayMsec()));
if (collected.getTypicalDTO().getWarnDelayMsec() > 0){
warnerCheck.setChecked(true);
Log.d(Constants.TAG, "Injecting warn timer: "+ collected.getTypicalDTO().getWarnDelayMsec());
}
}
@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);
}
@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) {
try {
Log.i(Constants.TAG, "Broadcast received, intent" + intent.toString());
SoulissDBHelper.open();
SoulissNode coll = datasource.getSoulissNode(collected.getNodeId());
collected = coll.getTypical(collected.getSlot());
if (collected.getOutput() == Souliss_T1n_OnCoil || collected.getOutput() == Souliss_T1n_OnCoil_Auto)
buttPlus.setBackgroundResource(R.drawable.bulb_on);
else if (collected.getOutput() == Souliss_T1n_OffCoil || collected.getOutput() == Souliss_T1n_OffCoil_Auto)
buttPlus.setBackgroundResource(R.drawable.bulb_off);
else if (collected.getOutput() >= Souliss_T1n_Timed) {
timer.setProgress(collected.getOutput().intValue());
buttPlus.setBackgroundResource(R.drawable.bulb_on);
timerInfo.setText("Cycles to shutoff: " + collected.getOutput());
} else {
Log.w(Constants.TAG, "Unknown status");
}
//refresh "acceso da" info
if (opzioni.isLogHistoryEnabled()) {
refreshHistoryInfo();
}
refreshStatusIcon();
if (collected.getOutput() == Souliss_T1n_OffCoil_Auto || collected.getOutput() == Souliss_T1n_OnCoil_Auto)
autoInfo.setText(getString(R.string.Souliss_Auto_mode) + " ON");
else
autoInfo.setText(getString(R.string.Souliss_Auto_mode) + " OFF");
// datasource.close();
infoTyp.setText(collected.getParentNode().getNiceName() + ", slot " + collected.getSlot() + "Val: 0x" + Integer.toHexString(collected.getOutput().intValue()));
} catch (Exception e) {
Log.e(Constants.TAG, "Error receiving data. Fragment disposed?", e);
}
}
};
}