package treehou.se.habit.ui.widgets.factories; import android.content.Context; import android.text.Html; import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import org.greenrobot.eventbus.EventBus; import java.net.MalformedURLException; import java.net.URL; 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.connector.Communicator; import treehou.se.habit.core.db.settings.WidgetSettingsDB; import treehou.se.habit.util.Util; import treehou.se.habit.ui.widgets.WidgetFactory; public class BaseWidgetFactory { private static final String TAG = "BaseWidgetFactory"; public WidgetFactory.IWidgetHolder build(WidgetFactory widgetFactory, OHLinkedPage page, final OHWidget widget, final OHWidget parent) { return build(widgetFactory, page, widget, parent, false); } public WidgetFactory.IWidgetHolder build( WidgetFactory widgetFactory, final OHLinkedPage page, final OHWidget widget, final OHWidget parent, boolean flat) { final LayoutInflater inflater = widgetFactory.getInflater(); View rootView = flat ? inflater.inflate(R.layout.item_widget_base_flat, null) : inflater.inflate(R.layout.item_widget_base, null); // Put in dummy frame if not in frame if (parent == null) { View holderView = inflater.inflate(R.layout.widget_container, null); LinearLayout holder = (LinearLayout) holderView.findViewById(R.id.lou_widget_frame_holder); holder.addView(rootView); rootView = holderView; } BaseWidgetHolder holder = new BaseWidgetHolder(widgetFactory.getContext(), rootView, widget, widgetFactory); holder.update(widget); return holder; } public static class BaseWidgetHolder extends WidgetFactory.WidgetHolder { Context context; View rootView; View baseDataHolder; TextView lblName; View iconHolder; ImageView imgIcon; ImageButton btnNextPage; WidgetFactory widgetFactory; LinearLayout subView; boolean showLabel = true; private List<WidgetFactory.IWidgetHolder> widgetHolders = new ArrayList<>(); private List<OHWidget> widgets = new ArrayList<>(); private OHWidget widget; public static BaseWidgetHolder create(Builder builder){ final LayoutInflater inflater = builder.getFactory().getInflater(); View rootView = builder.getView(); if(rootView == null) { rootView = builder.isFlat() ? inflater.inflate(R.layout.item_widget_base_flat, null) : inflater.inflate(R.layout.item_widget_base, null); } // Put in dummy frame if not in frame if (builder.getParent() == null) { View holderView = inflater.inflate(R.layout.widget_container, null); LinearLayout holder = (LinearLayout) holderView.findViewById(R.id.lou_widget_frame_holder); holder.addView(rootView); rootView = holderView; } BaseWidgetHolder holder = new BaseWidgetHolder(builder.getFactory().getContext(), rootView, builder.getWidget(), builder.getFactory()); Realm realm = Realm.getDefaultInstance(); final WidgetSettingsDB settings = WidgetSettingsDB.loadGlobal(realm); float percentage = Util.toPercentage(settings.getTextSize()); // Set size of icon float imageSizePercentage = Util.toPercentage(settings.getIconSize()); realm.close(); holder.lblName.setTextSize(TypedValue.COMPLEX_UNIT_PX, holder.lblName.getTextSize() * percentage); ViewGroup.LayoutParams layoutParams = holder.imgIcon.getLayoutParams(); layoutParams.width = (int) (((float) layoutParams.width) * imageSizePercentage); holder.imgIcon.setLayoutParams(layoutParams); holder.update(builder.getWidget()); return holder; } BaseWidgetHolder(Context context, View view, OHWidget widget, WidgetFactory factory) { super(view); this.context = context; widgetFactory = factory; rootView = view; baseDataHolder = rootView.findViewById(R.id.lou_base_data_holder); iconHolder = rootView.findViewById(R.id.img_widget_icon_holder); lblName = (TextView) rootView.findViewById(R.id.lbl_widget_name); imgIcon = (ImageView) rootView.findViewById(R.id.img_widget_icon); btnNextPage = (ImageButton) rootView.findViewById(R.id.btn_next_page); subView = (LinearLayout) rootView.findViewById(R.id.lou_widget_holder); } @Override public void update(final OHWidget widget) { if(widget == null){ return; } Log.d(TAG, "update " + (widget.getItem() != null ? widget.getItem().getName() : "") + " " + widget.getLabel()); setName(widget.getLabel()); /*TODO implement*/ if (widget.getLinkedPage() != null) { btnNextPage.setVisibility(View.VISIBLE); rootView.setOnClickListener(v -> EventBus.getDefault().post(widget.getLinkedPage())); } else { btnNextPage.setVisibility(View.GONE); } loadIcon(widget); this.widget = widget; } 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) { WidgetFactory.IWidgetHolder result = widgetFactory.createWidget(widget, null); widgetHolders.add(result); subView.addView(result.getView()); } widgets.clear(); widgets.addAll(pageWidgets); } else { Log.d(TAG, "updating widgets"); for (int i=0; i < widgetHolders.size(); i++) { WidgetFactory.IWidgetHolder holder = widgetHolders.get(i); Log.d(TAG, "updating widget " + holder.getClass().getSimpleName()); OHWidget newWidget = pageWidgets.get(i); holder.update(newWidget); } } widgets.clear(); widgets.addAll(pageWidgets); } /** * Set name of widget * * @param name */ private void setName(String name){ Log.d(TAG, "setName " + name); name = name.replaceAll("(\\[)(.*)(\\])", "<font color='"+ String.format("#%06X", 0xFFFFFF & context.getResources().getColor(R.color.colorAccent)) +"'>$2</font>"); lblName.setText(Html.fromHtml(name)); if(baseDataHolder != null && "".equals(name.trim())) { baseDataHolder.setVisibility(View.GONE); } } /** * Set name of widget * * @param showLabel */ private void setShowLabel(boolean showLabel){ if(this.showLabel != showLabel) { this.showLabel = showLabel; baseDataHolder.setVisibility(showLabel ? View.VISIBLE : View.GONE); } } private void loadIcon(OHWidget widget) { if (widget.getIconPath() != null) { iconHolder.setVisibility(View.VISIBLE); imgIcon.setVisibility(View.GONE); try { Log.d(TAG, "widget.getIconPath " + widget.getIconPath() + " : " + widgetFactory.getPage().getBaseUrl()); URL imageUrl = new URL(widgetFactory.getPage().getBaseUrl() + widget.getIconPath()); Communicator communicator = Communicator.instance(widgetFactory.getContext()); communicator.loadImage(widgetFactory.getServer(), imageUrl, imgIcon); Log.d(TAG, "Loading image url " + imageUrl); } catch (MalformedURLException e) { e.printStackTrace(); } } else { imgIcon.setVisibility(View.GONE); if (baseDataHolder != null && (widget.getLabel() == null || "".equals(widget.getLabel().trim()))) { baseDataHolder.setVisibility(View.GONE); } } } /** * Get previously stored widget. * * @return widget */ protected OHWidget getWidget(){ return widget; } public LinearLayout getSubView() { return subView; } public static class Builder { private WidgetFactory factory; private OHWidget widget; private OHWidget parent; private View view; private boolean flat = false; private boolean showLabel = true; public Builder(WidgetFactory factory) { this.factory = factory; } public Builder setWidget(OHWidget widget) { this.widget = widget; return this; } public Builder setFlat(boolean flat) { this.flat = flat; return this; } public Builder setParent(OHWidget parent) { this.parent = parent; return this; } public Builder setView(View view) { this.view = view; return this; } public Builder setShowLabel(boolean showLabel) { this.showLabel = showLabel; return this; } public WidgetFactory getFactory() { return factory; } public OHWidget getWidget() { return widget; } public OHWidget getParent() { return parent; } public View getView() { return view; } public boolean isFlat() { return flat; } public boolean isShowLabel() { return showLabel; } public BaseWidgetHolder build(){ BaseWidgetHolder baseBuilderHolder = BaseWidgetHolder.create(this); baseBuilderHolder.setShowLabel(showLabel); return baseBuilderHolder; } } } }