1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-11-29 05:16:51 +01:00

customized widgets

This commit is contained in:
dakhnod 2020-01-11 09:26:03 +01:00
parent ea6e617d50
commit 4a9bd67101
5 changed files with 87 additions and 20 deletions

View File

@ -4,6 +4,7 @@ import android.bluetooth.BluetoothGattCharacteristic;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
@ -23,6 +24,7 @@ import java.util.Random;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.UUID; import java.util.UUID;
import cyanogenmod.app.CustomTile;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.Widget; import nodomain.freeyourgadget.gadgetbridge.Widget;
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.HRConfigActivity; import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.HRConfigActivity;
@ -57,6 +59,8 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fos
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.notification.NotificationImage; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.notification.NotificationImage;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.notification.NotificationImagePutRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.notification.NotificationImagePutRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.notification.PlayNotificationHRRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.notification.PlayNotificationHRRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.CustomBackgroundWidgetElement;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.CustomTextWidgetElement;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.CustomWidget; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.CustomWidget;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.CustomWidgetElement; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.CustomWidgetElement;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.utils.StringUtils; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.utils.StringUtils;
@ -145,7 +149,7 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
overwriteButtons(null); overwriteButtons(null);
loadWidgets(); loadWidgets();
// renderWidgets(); renderWidgets();
// dunno if there is any point in doing this at start since when no watch is connected the QHybridSupport will not receive any intents anyway // dunno if there is any point in doing this at start since when no watch is connected the QHybridSupport will not receive any intents anyway
queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZED)); queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZED));
@ -158,17 +162,29 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
} }
private void loadWidgets() { private void loadWidgets() {
CustomWidget ethWidget = new CustomWidget(0, 63); CustomWidget ethWidget = new CustomWidget(90, 63);
ethWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "date", "wtf", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_UPPER_HALF)); // ethWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "date", "-", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_UPPER_HALF));
ethWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "eth", "", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF)); ethWidget.addElement(new CustomTextWidgetElement("ETH", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_UPPER_HALF));
ethWidget.addElement(new CustomTextWidgetElement("eth", "-", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF));
CustomWidget btcWidget = new CustomWidget(90, 63); CustomWidget btcWidget = new CustomWidget(270, 63);
btcWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "", "BTC", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_UPPER_HALF)); btcWidget.addElement(new CustomTextWidgetElement("BTC", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_UPPER_HALF));
btcWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "btc", "", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF)); btcWidget.addElement(new CustomTextWidgetElement("btc", "-", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF));
CustomWidget dateWidget = new CustomWidget(0, 63);
dateWidget.addElement(new CustomTextWidgetElement("Time", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_UPPER_HALF));
dateWidget.addElement(new CustomTextWidgetElement("date", "-", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF));
CustomWidget helloWidget = new CustomWidget(180, 63);
helloWidget.addElement(new CustomTextWidgetElement("Hello", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_UPPER_HALF));
helloWidget.addElement(new CustomTextWidgetElement("Reddit", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF));
// helloWidget.addElement(new CustomBackgroundWidgetElement("/sdcard/reddit.png"));
this.widgets = new CustomWidget[]{ this.widgets = new CustomWidget[]{
ethWidget, ethWidget,
btcWidget, btcWidget,
dateWidget,
helloWidget
}; };
} }
@ -200,6 +216,27 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
textPaint.setTextAlign(Paint.Align.CENTER); textPaint.setTextAlign(Paint.Align.CENTER);
widgetCanvas.drawText(element.getValue(), element.getX(), element.getY() - (textPaint.descent() + textPaint.ascent()) / 2f, textPaint); widgetCanvas.drawText(element.getValue(), element.getX(), element.getY() - (textPaint.descent() + textPaint.ascent()) / 2f, textPaint);
}else if(element.getWidgetElementType() == CustomWidgetElement.WidgetElementType.TYPE_IMAGE) {
Bitmap imageBitmap = BitmapFactory.decodeFile(element.getValue());
widgetCanvas.drawBitmap(imageBitmap, element.getX() - imageBitmap.getWidth() / 2f, element.getY() - imageBitmap.getHeight() / 2f, null);
}else if(element.getWidgetElementType() == CustomWidgetElement.WidgetElementType.TYPE_BACKGROUND) {
Bitmap imageBitmap = BitmapFactory.decodeFile(element.getValue());
imageBitmap.setConfig(Bitmap.Config.ARGB_4444);
Paint paint = new Paint();
paint.setColor(Color.WHITE);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(imageBitmap, 76, 76, false);
// new Canvas(scaledBitmap).drawColor(Color.GRAY);
widgetCanvas.drawBitmap(
scaledBitmap,
0,
0,
paint);
} }
} }
widgetImages[i] = AssetImageFactory.createAssetImage( widgetImages[i] = AssetImageFactory.createAssetImage(
@ -239,11 +276,7 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
public void setWidgetContent(String widgetID, String content, boolean renderOnWatch) { public void setWidgetContent(String widgetID, String content, boolean renderOnWatch) {
boolean update = false; boolean update = false;
for (CustomWidget widget : this.widgets) { for (CustomWidget widget : this.widgets) {
CustomWidgetElement element = widget.getElement(widgetID); if(widget.updateElementValue(widgetID, content)) update = true;
if (element == null) continue;
element.setValue(content);
update = true;
} }
if (renderOnWatch && update) renderWidgets(); if (renderOnWatch && update) renderWidgets();

View File

@ -0,0 +1,11 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget;
public class CustomBackgroundWidgetElement extends CustomWidgetElement{
public CustomBackgroundWidgetElement(String id, String value) {
super(WidgetElementType.TYPE_BACKGROUND, id, value, 0, 0);
}
public CustomBackgroundWidgetElement(String value) {
super(WidgetElementType.TYPE_BACKGROUND, null, value, 0, 0);
}
}

View File

@ -0,0 +1,11 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget;
public class CustomTextWidgetElement extends CustomWidgetElement{
public CustomTextWidgetElement(String id, String value, int x, int y) {
super(WidgetElementType.TYPE_TEXT, id, value, x, y);
}
public CustomTextWidgetElement(String value, int x, int y) {
super(WidgetElementType.TYPE_TEXT, null, value, x, y);
}
}

View File

@ -6,7 +6,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
public class CustomWidget { public class CustomWidget {
private HashMap<String, CustomWidgetElement> elements = new HashMap<>(); private ArrayList<CustomWidgetElement> elements = new ArrayList<>();
private int angle, distance; private int angle, distance;
public CustomWidget(int angle, int distance) { public CustomWidget(int angle, int distance) {
@ -23,18 +23,30 @@ public class CustomWidget {
} }
public Collection<CustomWidgetElement> getElements(){ public Collection<CustomWidgetElement> getElements(){
return this.elements.values(); return this.elements;
} }
public void addElement(CustomWidgetElement element){ public void addElement(CustomWidgetElement element){
this.elements.put(element.getId(), element); this.elements.add(element);
} }
public CustomWidgetElement getElement(String id){ public boolean updateElementValue(String id, String value){
return elements.get(id); boolean updatedValue = false;
for(CustomWidgetElement element : this.elements){
String elementId = element.getId();
if(elementId != null && elementId.equals(id)){
element.setValue(value);
updatedValue = true;
}
}
return updatedValue;
} }
public CustomWidgetElement removeElement(String id){ private CustomWidgetElement getElement(String id){
return elements.remove(id); for(CustomWidgetElement element : this.elements){
String elementId = element.getId();
if(elementId != null && elementId.equals(id)) return element;
}
return null;
} }
} }

View File

@ -15,7 +15,7 @@ public class CustomWidgetElement {
private String id, value; private String id, value;
private int x, y; private int x, y;
public CustomWidgetElement(WidgetElementType widgetElementType, String id, String value, int x, int y) { protected CustomWidgetElement(WidgetElementType widgetElementType, String id, String value, int x, int y) {
this.widgetElementType = widgetElementType; this.widgetElementType = widgetElementType;
this.id = id; this.id = id;
this.value = value; this.value = value;