diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceDesignerActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceDesignerActivity.java index dd1c834be..f817765b5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceDesignerActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceDesignerActivity.java @@ -566,8 +566,8 @@ public class HybridHRWatchfaceDesignerActivity extends AbstractGBActivity implem timezoneLayout.setVisibility(View.GONE); ArrayAdapter widgetTZAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, timezonesList); tzSpinner.setAdapter(widgetTZAdapter); - if ((widget != null) && (Arrays.asList(timezonesList).contains(widget.getTimezone()))) { - tzSpinner.setSelection(Arrays.asList(timezonesList).indexOf(widget.getTimezone())); + if (widget != null) { + tzSpinner.setSelection(Arrays.asList(timezonesList).indexOf(widget.getExtraConfigString("tzName", "Etc/UTC"))); } else { tzSpinner.setSelection(Arrays.asList(timezonesList).indexOf("Etc/UTC")); } @@ -575,16 +575,16 @@ public class HybridHRWatchfaceDesignerActivity extends AbstractGBActivity implem final LinearLayout updateTimeoutLayout = layout.findViewById(R.id.watchface_widget_update_timeout_layout); updateTimeoutLayout.setVisibility(View.GONE); final EditText updateTimeout = layout.findViewById(R.id.watchface_widget_update_timeout); - if ((widget != null) && (widget.getUpdateTimeout() >= 0)) { - updateTimeout.setText(Integer.toString(widget.getUpdateTimeout())); + if ((widget != null) && (widget.getExtraConfigInt("update_timeout", -1) > 0)) { + updateTimeout.setText(Integer.toString(widget.getExtraConfigInt("update_timeout", -1))); } final CheckBox timeoutHideText = layout.findViewById(R.id.watchface_widget_timeout_hide_text); - if ((widget != null) && (widget.getTimeoutHideText())) { - timeoutHideText.setChecked(widget.getTimeoutHideText()); + if (widget != null) { + timeoutHideText.setChecked(widget.getExtraConfigBoolean("timeout_hide_text", true)); } final CheckBox timeoutShowCircle = layout.findViewById(R.id.watchface_widget_timeout_show_circle); - if ((widget != null) && (widget.getTimeoutShowCircle())) { - timeoutShowCircle.setChecked(widget.getTimeoutShowCircle()); + if (widget != null) { + timeoutShowCircle.setChecked(widget.getExtraConfigBoolean("timeout_show_circle", true)); } // Show certain input fields only when the relevant TZ widget is selected typeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @@ -658,11 +658,25 @@ public class HybridHRWatchfaceDesignerActivity extends AbstractGBActivity implem boolean selectedTimeoutShowCircle = timeoutShowCircle.isChecked(); HybridHRWatchfaceWidget widgetConfig; if (selectedType.equals("widget2ndTZ")) { - widgetConfig = new HybridHRWatchfaceWidget(selectedType, selectedPosX, selectedPosY, 76, 76, colorSpinner.getSelectedItemPosition(), selectedTZ); + JSONObject extraConfig = new JSONObject(); + try { + extraConfig.put("tzName", selectedTZ); + } catch (JSONException e) { + LOG.warn("JSON error", e); + } + widgetConfig = new HybridHRWatchfaceWidget(selectedType, selectedPosX, selectedPosY, 76, 76, colorSpinner.getSelectedItemPosition(), extraConfig); } else if (selectedType.equals("widgetCustom")) { - widgetConfig = new HybridHRWatchfaceWidget(selectedType, selectedPosX, selectedPosY, selectedWidth, 76, colorSpinner.getSelectedItemPosition(), selectedUpdateTimeout, selectedTimeoutHideText, selectedTimeoutShowCircle); + JSONObject extraConfig = new JSONObject(); + try { + extraConfig.put("update_timeout", selectedUpdateTimeout); + extraConfig.put("timeout_hide_text", selectedTimeoutHideText); + extraConfig.put("timeout_show_circle", selectedTimeoutShowCircle); + } catch (JSONException e) { + LOG.warn("JSON error", e); + } + widgetConfig = new HybridHRWatchfaceWidget(selectedType, selectedPosX, selectedPosY, selectedWidth, 76, colorSpinner.getSelectedItemPosition(), extraConfig); } else { - widgetConfig = new HybridHRWatchfaceWidget(selectedType, selectedPosX, selectedPosY, 76, 76, colorSpinner.getSelectedItemPosition()); + widgetConfig = new HybridHRWatchfaceWidget(selectedType, selectedPosX, selectedPosY, 76, 76, colorSpinner.getSelectedItemPosition(), null); } if (index >= 0) { widgets.set(index, widgetConfig); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceFactory.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceFactory.java index 463fb562e..eec2d3407 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceFactory.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceFactory.java @@ -81,11 +81,11 @@ public class HybridHRWatchfaceFactory { widget.put("name", widgetDesc.getWidgetType()); widget.put("goal_ring", false); widget.put("color", widgetDesc.getColor() == HybridHRWatchfaceWidget.COLOR_WHITE ? "white" : "black"); - if (widgetDesc.getUpdateTimeout() >= 0) { + if (widgetDesc.getExtraConfigInt("update_timeout", -1) >= 0) { JSONObject data = new JSONObject(); - data.put("update_timeout", widgetDesc.getUpdateTimeout()); - data.put("timeout_hide_text", widgetDesc.getTimeoutHideText()); - data.put("timeout_show_circle", widgetDesc.getTimeoutShowCircle()); + data.put("update_timeout", widgetDesc.getExtraConfigInt("update_timeout", -1)); + data.put("timeout_hide_text", widgetDesc.getExtraConfigBoolean("timeout_hide_text", true)); + data.put("timeout_show_circle", widgetDesc.getExtraConfigBoolean("timeout_show_circle", true)); widget.put("data", data); } break; @@ -94,12 +94,12 @@ public class HybridHRWatchfaceFactory { widget.put("name", widgetDesc.getWidgetType()); widget.put("goal_ring", false); widget.put("color", widgetDesc.getColor() == HybridHRWatchfaceWidget.COLOR_WHITE ? "white" : "black"); - if (widgetDesc.getTimezone() != null) { + if (widgetDesc.getExtraConfigString("tzName", null) != null) { JSONObject data = new JSONObject(); - TimeZone tz = TimeZone.getTimeZone(widgetDesc.getTimezone()); - String tzShortName = widgetDesc.getTimezone().replaceAll(".*/", ""); + TimeZone tz = TimeZone.getTimeZone(widgetDesc.getExtraConfigString("tzName", null)); + String tzShortName = widgetDesc.getExtraConfigString("tzName", null).replaceAll(".*/", ""); int tzOffsetMins = tz.getRawOffset() / 1000 / 60; - data.put("tzName", widgetDesc.getTimezone()); + data.put("tzName", widgetDesc.getExtraConfigString("tzName", null)); data.put("loc", tzShortName); data.put("utc", tzOffsetMins); widget.put("data", data); @@ -299,45 +299,20 @@ public class HybridHRWatchfaceFactory { widgetName = "widget2ndTZ"; break; } - int widgetColor = widgetJSON.getString("color").equals("white") ? HybridHRWatchfaceWidget.COLOR_WHITE : HybridHRWatchfaceWidget.COLOR_BLACK; if (widgetName.startsWith("widget2ndTZ")) { - try { - widgetName = "widget2ndTZ"; - JSONObject widgetData = widgetJSON.getJSONObject("data"); - widgetTimezone = widgetData.getString("tzName"); - parsedWidget = new HybridHRWatchfaceWidget(widgetName, - widgetJSON.getJSONObject("pos").getInt("x"), - widgetJSON.getJSONObject("pos").getInt("y"), - widgetJSON.getJSONObject("size").getInt("w"), - widgetJSON.getJSONObject("size").getInt("h"), - widgetColor, - widgetTimezone); - } catch (JSONException e) { - LOG.error("Couldn't determine tzName!", e); - } + widgetName = "widget2ndTZ"; } else if (widgetName.startsWith("widgetCustom")) { widgetName = "widgetCustom"; - JSONObject widgetData = widgetJSON.getJSONObject("data"); - widgetUpdateTimeout = widgetData.getInt("update_timeout"); - widgetTimeoutHideText = widgetData.getBoolean("timeout_hide_text"); - widgetTimeoutShowCircle = widgetData.getBoolean("timeout_show_circle"); - parsedWidget = new HybridHRWatchfaceWidget(widgetName, - widgetJSON.getJSONObject("pos").getInt("x"), - widgetJSON.getJSONObject("pos").getInt("y"), - widgetJSON.getJSONObject("size").getInt("w"), - widgetJSON.getJSONObject("size").getInt("h"), - widgetColor, - widgetUpdateTimeout, - widgetTimeoutHideText, - widgetTimeoutShowCircle); - } else { - parsedWidget = new HybridHRWatchfaceWidget(widgetName, - widgetJSON.getJSONObject("pos").getInt("x"), - widgetJSON.getJSONObject("pos").getInt("y"), - widgetJSON.getJSONObject("size").getInt("w"), - widgetJSON.getJSONObject("size").getInt("h"), - widgetColor); } + int widgetColor = widgetJSON.getString("color").equals("white") ? HybridHRWatchfaceWidget.COLOR_WHITE : HybridHRWatchfaceWidget.COLOR_BLACK; + JSONObject widgetData = widgetJSON.optJSONObject("data"); + parsedWidget = new HybridHRWatchfaceWidget(widgetName, + widgetJSON.getJSONObject("pos").getInt("x"), + widgetJSON.getJSONObject("pos").getInt("y"), + widgetJSON.getJSONObject("size").getInt("w"), + widgetJSON.getJSONObject("size").getInt("h"), + widgetColor, + widgetData); return parsedWidget; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceWidget.java index c76461534..cd2f879e3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HybridHRWatchfaceWidget.java @@ -27,6 +27,9 @@ import nodomain.freeyourgadget.gadgetbridge.R; import static nodomain.freeyourgadget.gadgetbridge.util.BitmapUtil.invertBitmapColors; +import org.json.JSONException; +import org.json.JSONObject; + public class HybridHRWatchfaceWidget { private String widgetType; private int posX; @@ -34,33 +37,20 @@ public class HybridHRWatchfaceWidget { private int width; private int height; private int color; - private String timezone; - private int updateTimeout = -1; - private boolean timeoutHideText = true; - private boolean timeoutShowCircle = true; + private JSONObject extraConfig; public static int COLOR_WHITE = 0; public static int COLOR_BLACK = 1; - public HybridHRWatchfaceWidget(String widgetType, int posX, int posY, int width, int height, int color) { + public HybridHRWatchfaceWidget(String widgetType, int posX, int posY, int width, int height, int color, JSONObject extraConfig) { this.widgetType = widgetType; this.posX = posX; this.posY = posY; this.width = width; this.height = height; this.color = color; + this.extraConfig = extraConfig; } - public HybridHRWatchfaceWidget(String widgetType, int posX, int posY, int width, int height, int color, String timezone) { - this(widgetType, posX, posY, width, height, color); - this.timezone = timezone; - } - public HybridHRWatchfaceWidget(String widgetType, int posX, int posY, int width, int height, int color, int updateTimeout, boolean timeoutHideText, boolean timeoutShowCircle) { - this(widgetType, posX, posY, width, height, color); - this.updateTimeout = updateTimeout; - this.timeoutHideText = timeoutHideText; - this.timeoutShowCircle = timeoutShowCircle; - } - public static LinkedHashMap getAvailableWidgetTypes(Context context) { LinkedHashMap widgetTypes = new LinkedHashMap<>(); @@ -125,16 +115,25 @@ public class HybridHRWatchfaceWidget { this.color = color; } - public String getTimezone() { - return timezone; + public int getExtraConfigInt(String name, int fallback) { + if (extraConfig == null) { + return fallback; + } else { + return extraConfig.optInt(name, fallback); + } } - public int getUpdateTimeout() { - return updateTimeout; + public String getExtraConfigString(String name, String fallback) { + if (extraConfig == null) { + return fallback; + } else { + return extraConfig.optString(name, fallback); + } } - public boolean getTimeoutHideText() { - return timeoutHideText; - } - public boolean getTimeoutShowCircle() { - return timeoutShowCircle; + public Boolean getExtraConfigBoolean(String name, Boolean fallback) { + if (extraConfig == null) { + return fallback; + } else { + return extraConfig.optBoolean(name, fallback); + } } }