package treehou.se.habit.ui.widgets.factories;
import android.content.Context;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import io.realm.Realm;
import se.treehou.ng.ohcommunicator.connector.models.OHLinkedPage;
import se.treehou.ng.ohcommunicator.connector.models.OHWidget;
import treehou.se.habit.R;
import treehou.se.habit.core.db.settings.WidgetSettingsDB;
import treehou.se.habit.util.Util;
import treehou.se.habit.ui.widgets.WidgetFactory;
public class FrameWidgetFactory implements IWidgetFactory {
private static final String TAG = "FrameWidgetFactory";
@Override
public WidgetFactory.IWidgetHolder build(WidgetFactory widgetFactory, OHLinkedPage page, OHWidget widget, OHWidget parent) {
return FrameWidget.create(widgetFactory, widget);
}
public static class FrameWidget extends WidgetFactory.WidgetHolder {
private TextView lblName;
private View titleHolder;
private WidgetFactory widgetFactory;
private LinearLayout subView;
private boolean showLabel = true;
private List<WidgetFactory.IWidgetHolder> widgetHolders = new ArrayList<>();
private OHWidget widget;
private List<OHWidget> widgets = new ArrayList<>();
public static FrameWidget create(WidgetFactory factory, OHWidget widget){
View rootView = factory.getInflater().inflate(R.layout.widget_frame, null);
TextView lblTitle = (TextView) rootView.findViewById(R.id.lbl_widget_name);
View lblTitleHolder = rootView.findViewById(R.id.lbl_widget_name_holder);
LinearLayout louWidgetHolder = (LinearLayout) rootView.findViewById(R.id.lou_widget_frame_holder);
FrameWidget holder = new FrameWidget(factory.getContext(), rootView, louWidgetHolder, lblTitleHolder, lblTitle, widget, factory);
Log.d(TAG, "update " + widget.getLabel());
Realm realm = Realm.getDefaultInstance();
final WidgetSettingsDB settings = WidgetSettingsDB.loadGlobal(realm);
float percentage = Util.toPercentage(settings.getTextSize());
realm.close();
holder.lblName.setTextSize(TypedValue.COMPLEX_UNIT_PX, holder.lblName.getTextSize() * percentage);
holder.update(widget);
return holder;
}
private FrameWidget(Context context, View view, LinearLayout louWidgetHolder, View titleHolder, TextView lblName, OHWidget widget, WidgetFactory factory) {
super(view);
Log.d(TAG, "Crating frame " + widget.getLabel());
widgetFactory = factory;
this.lblName = lblName;
lblName.setText(widget.getLabel());
this.titleHolder = titleHolder;
if (widget.getLabel() == null || "".equals(widget.getLabel().trim())) {
titleHolder.setVisibility(View.GONE);
}
subView = louWidgetHolder;
}
@Override
public void update(final OHWidget widget) {
if(widget == null){
return;
}
if(widget.getLabel() != null) {
setName(widget.getLabel());
}
setName(widget.getLabel());
this.widget = widget;
updateWidgets(widget.getWidget());
}
private synchronized void updateWidgets(List<OHWidget> pageWidgets){
Log.d(TAG, "frame widgets update " + pageWidgets.size() + " : " + widgets.size());
boolean invalidate = pageWidgets.size() != widgets.size();
if(!invalidate){
for(int i=0; i < widgets.size(); i++) {
OHWidget currentWidget = widgets.get(i);
OHWidget newWidget = pageWidgets.get(i);
if(currentWidget.needUpdate(newWidget)){
invalidate = true;
break;
}
}
}
if(invalidate) {
Log.d(TAG, "Invalidating frame widgets " + pageWidgets.size() + " : " + widgets.size());
widgetHolders.clear();
subView.removeAllViews();
for (OHWidget widget : pageWidgets) {
try {
WidgetFactory.IWidgetHolder result = widgetFactory.createWidget(widget, this.widget);
widgetHolders.add(result);
subView.addView(result.getView());
}catch (Exception e){
Log.w(TAG, "Invalidate widget failed " + e);
}
}
widgets.clear();
widgets.addAll(pageWidgets);
}
else {
Log.d(TAG, "updating widgets");
for (int i=0; i < widgetHolders.size(); i++) {
try {
WidgetFactory.IWidgetHolder holder = widgetHolders.get(i);
OHWidget newWidget = pageWidgets.get(i);
holder.update(newWidget);
}catch (Exception e){
Log.w(TAG, "Update widget failed " + e);
}
}
}
}
/**
* Set name of widget
*
* @param showLabel
*/
private void setShowLabel(boolean showLabel){
if(this.showLabel != showLabel) {
this.showLabel = showLabel;
titleHolder.setVisibility(showLabel ? View.VISIBLE : View.GONE);
}
}
private void setName(String title){
lblName.setText(title);
}
/**
* Get previously stored widget.
*
* @return widget
*/
protected OHWidget getWidget(){
return widget;
}
public LinearLayout getSubView() {
return subView;
}
}
}