package treehou.se.habit.ui.widgets.factories;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import com.google.gson.Gson;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.Subscription;
import rx.functions.Action1;
import se.treehou.ng.ohcommunicator.connector.GsonHelper;
import se.treehou.ng.ohcommunicator.connector.models.OHLinkedPage;
import se.treehou.ng.ohcommunicator.connector.models.OHServer;
import se.treehou.ng.ohcommunicator.connector.models.OHWidget;
import se.treehou.ng.ohcommunicator.services.Connector;
import se.treehou.ng.ohcommunicator.services.IServerHandler;
import treehou.se.habit.R;
import treehou.se.habit.connector.Constants;
import treehou.se.habit.ui.colorpicker.ColorpickerActivity;
import treehou.se.habit.ui.widgets.WidgetFactory;
public class ColorpickerWidgetFactory implements IWidgetFactory {
private static final String TAG = "ColorpickerWidget";
@Override
public WidgetFactory.IWidgetHolder build(final WidgetFactory widgetFactory, OHLinkedPage page, final OHWidget widget, final OHWidget parent) {
return ColorWidgetHolder.create(widgetFactory, widget, parent);
}
static class HoldListener implements View.OnTouchListener {
private static final int DEFAULT_TICK_TIME=200;
private int tick=0;
private Observable<Long> timer;
private Subscription subscribe = null;
private OnHoldListener listener;
private Action1<Long> touchSubject;
public HoldListener(@NotNull OnHoldListener listener) {
this(listener, DEFAULT_TICK_TIME);
}
public HoldListener(@NotNull final OnHoldListener listener, int tickTime) {
this.listener = listener;
timer = Observable.interval(tickTime, TimeUnit.MILLISECONDS);
touchSubject = time -> updateTick();
timer = Observable.interval(tickTime, TimeUnit.MILLISECONDS).doOnUnsubscribe(() -> listener.onRelease(tick));
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
subscribe = timer.subscribe(touchSubject);
} else if (event.getAction() == MotionEvent.ACTION_UP ||
event.getAction() == MotionEvent.ACTION_CANCEL ||
event.getAction() == MotionEvent.ACTION_OUTSIDE) {
if (!subscribe.isUnsubscribed()) {
subscribe.unsubscribe();
}
}
return true;
}
private void updateTick(){
tick++;
listener.onTick(tick);
}
interface OnHoldListener {
void onTick(int tick);
void onRelease(int tick);
}
}
/**
* Color widget
*/
public static class ColorWidgetHolder implements WidgetFactory.IWidgetHolder {
private static final String TAG = "PickerWidgetHolder";
private BaseWidgetFactory.BaseWidgetHolder baseHolder;
private int color;
private View clrView;
public static ColorWidgetHolder create(WidgetFactory widgetFactory, OHWidget widget, OHWidget parent){
return new ColorWidgetHolder(widget, parent, widgetFactory);
}
private ColorWidgetHolder(final OHWidget widget, OHWidget parent, final WidgetFactory widgetFactory) {
LayoutInflater inflater = widgetFactory.getInflater();
final Context context = widgetFactory.getContext();
View itemView = inflater.inflate(R.layout.item_widget_color, null);
clrView = itemView.findViewById(R.id.clr_color);
View btnIncrement = itemView.findViewById(R.id.btn_increment);
final OHServer server = widgetFactory.getServer();
final String itemName = widget.getItem().getName();
IServerHandler serverHandler = new Connector.ServerHandler(server, context);
btnIncrement.setOnTouchListener(new HoldListener(new HoldListener.OnHoldListener() {
@Override
public void onTick(int tick) {
if (tick > 0){
serverHandler.sendCommand(itemName, Constants.COMMAND_INCREMENT);
}
}
@Override
public void onRelease(int tick) {
if (tick <= 0){
serverHandler.sendCommand(itemName, Constants.COMMAND_ON);
}
}
}));
View btnDecrement = itemView.findViewById(R.id.btn_decrement);
btnDecrement.setOnTouchListener(new HoldListener(new HoldListener.OnHoldListener() {
@Override
public void onTick(int tick) {
if (tick > 0) {
serverHandler.sendCommand(itemName, Constants.COMMAND_DECREMENT);
}
}
@Override
public void onRelease(int tick) {
if (tick <= 0) {
serverHandler.sendCommand(itemName, Constants.COMMAND_OFF);
}
}
}));
baseHolder = new BaseWidgetFactory.BaseWidgetHolder.Builder(widgetFactory)
.setWidget(widget)
.setFlat(true)
.setShowLabel(true)
.setView(itemView)
.setParent(parent)
.build();
baseHolder.getView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (widget.getItem() != null) {
Intent intent = new Intent(context, ColorpickerActivity.class);
Gson gson = GsonHelper.createGsonBuilder();
intent.putExtra(ColorpickerActivity.EXTRA_SERVER, widgetFactory.getServerDB().getId());
intent.putExtra(ColorpickerActivity.EXTRA_WIDGET, gson.toJson(widget));
intent.putExtra(ColorpickerActivity.EXTRA_COLOR, color);
context.startActivity(intent);
} else {
Toast.makeText(context, context.getString(R.string.item_missing), Toast.LENGTH_SHORT).show();
Log.d(TAG, "Widget doesn't contain item");
}
}
});
update(widget);
}
private void setColor(int color){
clrView.setBackgroundColor(color);
clrView.setVisibility(View.GONE);
}
@Override
public void update(final OHWidget widget) {
Log.d(TAG, "update " + widget);
if (widget == null) {
return;
}
color = Color.TRANSPARENT;
if(widget.getItem() != null && widget.getItem().getState() != null) {
String[] sHSV = widget.getItem().getState().split(",");
if (sHSV.length == 3) {
float[] hSV = {
Float.valueOf(sHSV[0]),
Float.valueOf(sHSV[1]),
Float.valueOf(sHSV[2])};
color = Color.HSVToColor(hSV);
}
}
setColor(color);
baseHolder.update(widget);
}
@Override
public View getView() {
return baseHolder.getView();
}
}
}