1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-12-25 10:05:49 +01:00

Fossil Hybrid HR: Support widget color inversion

This commit is contained in:
Arjan Schrijver 2021-07-16 15:11:45 +02:00 committed by Gitea
parent 3645e36ab6
commit 6000dd525e
6 changed files with 74 additions and 9 deletions

View File

@ -274,9 +274,11 @@ public class HybridHRWatchfaceDesignerActivity extends AbstractGBActivity implem
break;
}
int widgetColor = layoutItem.getString("color").equals("white") ? HybridHRWatchfaceWidget.COLOR_WHITE_ON_BLACK : HybridHRWatchfaceWidget.COLOR_BLACK_ON_WHITE;
widgets.add(new HybridHRWatchfaceWidget(widgetName,
layoutItem.getJSONObject("pos").getInt("x"),
layoutItem.getJSONObject("pos").getInt("y")));
layoutItem.getJSONObject("pos").getInt("y"),
widgetColor));
}
}
} catch (JSONException e) {
@ -373,6 +375,13 @@ public class HybridHRWatchfaceDesignerActivity extends AbstractGBActivity implem
if ((widget != null) && (widgetTypesArray.contains(widget.getWidgetType()))) {
typeSpinner.setSelection(widgetTypesArray.indexOf(widget.getWidgetType()));
}
// Configure widget color dropdown
final Spinner colorSpinner = layout.findViewById(R.id.watchface_widget_color_spinner);
ArrayAdapter<String> widgetColorAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, new String[]{getString(R.string.watchface_dialog_widget_color_white), getString(R.string.watchface_dialog_widget_color_black)});
colorSpinner.setAdapter(widgetColorAdapter);
if (widget != null) {
colorSpinner.setSelection(widget.getColor());
}
// Set X coordinate
final EditText posX = layout.findViewById(R.id.watchface_widget_pos_x);
if (widget != null) {
@ -446,9 +455,9 @@ public class HybridHRWatchfaceDesignerActivity extends AbstractGBActivity implem
if (selectedPosY > 240) selectedPosY = 240;
String selectedType = widgetTypesArray.get(typeSpinner.getSelectedItemPosition());
if (index >= 0) {
widgets.set(index, new HybridHRWatchfaceWidget(selectedType, selectedPosX, selectedPosY));
widgets.set(index, new HybridHRWatchfaceWidget(selectedType, selectedPosX, selectedPosY, colorSpinner.getSelectedItemPosition()));
} else {
widgets.add(new HybridHRWatchfaceWidget(selectedType, selectedPosX, selectedPosY));
widgets.add(new HybridHRWatchfaceWidget(selectedType, selectedPosX, selectedPosY, colorSpinner.getSelectedItemPosition()));
}
renderWatchfacePreview();
}

View File

@ -61,28 +61,28 @@ public class HybridHRWatchfaceFactory {
widget.put("type", "comp");
widget.put("name", widgetDesc.getWidgetType());
widget.put("goal_ring", false);
widget.put("color", "white");
widget.put("color", widgetDesc.getColor() == HybridHRWatchfaceWidget.COLOR_WHITE_ON_BLACK ? "white" : "black");
widget.put("bg", "_00.rle");
break;
case "widgetWeather":
widget.put("type", "comp");
widget.put("name", widgetDesc.getWidgetType());
widget.put("goal_ring", false);
widget.put("color", "white");
widget.put("color", widgetDesc.getColor() == HybridHRWatchfaceWidget.COLOR_WHITE_ON_BLACK ? "white" : "black");
widget.put("bg", "_01.rle");
break;
case "widgetSteps":
widget.put("type", "comp");
widget.put("name", widgetDesc.getWidgetType());
widget.put("goal_ring", false);
widget.put("color", "white");
widget.put("color", widgetDesc.getColor() == HybridHRWatchfaceWidget.COLOR_WHITE_ON_BLACK ? "white" : "black");
widget.put("bg", "_02.rle");
break;
case "widgetHR":
widget.put("type", "comp");
widget.put("name", widgetDesc.getWidgetType());
widget.put("goal_ring", false);
widget.put("color", "white");
widget.put("color", widgetDesc.getColor() == HybridHRWatchfaceWidget.COLOR_WHITE_ON_BLACK ? "white" : "black");
widget.put("bg", "_03.rle");
break;
default:

View File

@ -25,15 +25,22 @@ import java.util.LinkedHashMap;
import nodomain.freeyourgadget.gadgetbridge.R;
import static nodomain.freeyourgadget.gadgetbridge.util.BitmapUtil.invertBitmapColors;
public class HybridHRWatchfaceWidget {
private String widgetType;
private int posX;
private int posY;
private int color = 0;
public HybridHRWatchfaceWidget(String widgetType, int posX, int posY) {
public static int COLOR_WHITE_ON_BLACK = 0;
public static int COLOR_BLACK_ON_WHITE = 1;
public HybridHRWatchfaceWidget(String widgetType, int posX, int posY, int color) {
this.widgetType = widgetType;
this.posX = posX;
this.posY = posY;
this.color = color;
}
public static LinkedHashMap<String, String> getAvailableWidgetTypes(Context context) {
@ -50,7 +57,12 @@ public class HybridHRWatchfaceWidget {
}
public Bitmap getPreviewImage(Context context) throws IOException {
return BitmapFactory.decodeStream(context.getAssets().open("fossil_hr/" + widgetType + "_preview.png"));
Bitmap preview = BitmapFactory.decodeStream(context.getAssets().open("fossil_hr/" + widgetType + "_preview.png"));
if (color == COLOR_WHITE_ON_BLACK) {
return preview;
} else {
return invertBitmapColors(preview);
}
}
public int getPosX() {
@ -68,4 +80,8 @@ public class HybridHRWatchfaceWidget {
public void setPosY(int posY) {
this.posY = posY;
}
public int getColor() {
return color;
}
}

View File

@ -118,6 +118,33 @@ public class BitmapUtil {
}
/**
* Invert the colors of a Bitmap
*
* @param bmp input bitmap
* @return new bitmap
*/
public static Bitmap invertBitmapColors(Bitmap bmp)
{
ColorMatrix colorMatrix_Inverted =
new ColorMatrix(new float[] {
-1, 0, 0, 0, 255,
0, -1, 0, 0, 255,
0, 0, -1, 0, 255,
0, 0, 0, 1, 0});
Bitmap ret = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
Canvas canvas = new Canvas(ret);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix_Inverted));
canvas.drawBitmap(bmp, 0, 0, paint);
return ret;
}
/**
* Crops a circular image from the center of the provided Bitmap.
* From: https://www.tutorialspoint.com/android-how-to-crop-circular-area-from-bitmap

View File

@ -14,6 +14,16 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/watchface_dialog_widget_color" />
<Spinner
android:id="@+id/watchface_widget_color_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -1227,4 +1227,7 @@
<string name="watchface_dialog_widget_preset_left">Left</string>
<string name="watchface_dialog_widget_preset_right">Right</string>
<string name="qhybrid_title_watchface_designer">Watchface designer</string>
<string name="watchface_dialog_widget_color">Color:</string>
<string name="watchface_dialog_widget_color_white">White on black</string>
<string name="watchface_dialog_widget_color_black">Black on white</string>
</resources>