mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-07-16 18:34:03 +02:00
Fossil Hybrid: added translation handling
This commit is contained in:
parent
7ecb5543f7
commit
be2f8aaedc
|
@ -70,6 +70,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fos
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileLookupRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileLookupRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayCallNotificationRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayCallNotificationRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayTextNotificationRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayTextNotificationRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.activity.ActivityFilesGetRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.async.ConfirmAppStatusRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.async.ConfirmAppStatusRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.authentication.VerifyPrivateKeyRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.authentication.VerifyPrivateKeyRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.buttons.ButtonConfiguration;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.buttons.ButtonConfiguration;
|
||||||
|
@ -88,6 +89,9 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fos
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.music.MusicControlRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.music.MusicControlRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.music.MusicInfoSetRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.music.MusicInfoSetRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.notification.NotificationFilterPutHRRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.notification.NotificationFilterPutHRRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.translation.TranslationData;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.translation.TranslationsGetRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.translation.TranslationsPutRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.CustomBackgroundWidgetElement;
|
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.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;
|
||||||
|
@ -836,25 +840,19 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTestNewFunction() {
|
public void onTestNewFunction() {
|
||||||
/*queueWrite(new ActivityFilesGetRequest(this){
|
queueWrite(new TranslationsGetRequest(this){
|
||||||
@Override
|
@Override
|
||||||
public void handleFileData(byte[] fileData) {
|
public void handleTranslations(TranslationData translationData) {
|
||||||
super.handleFileData(fileData);
|
translationData.replaceByOriginal("ON", "oi m8");
|
||||||
File activityDir = new File(getContext().getExternalFilesDir(null), "activity_hr");
|
translationData.replaceByOriginal("OFF", "nah go away");
|
||||||
activityDir.mkdir();
|
translationData.replaceByOriginal("Device is about to reset.", "oh frick no no no");
|
||||||
File f = new File(activityDir, String.valueOf(System.currentTimeMillis()));
|
translationData.replaceByOriginal("Release button to stop reset.", "please don't let me die like that");
|
||||||
try {
|
translationData.replaceByOriginal("Serial number", "Gadgetbridge :)");
|
||||||
f.createNewFile();
|
translationData.replaceByOriginal("Dial Info", "Widgets");
|
||||||
FileOutputStream fos = new FileOutputStream(f);
|
TranslationsPutRequest request = new TranslationsPutRequest(translationData, FossilHRWatchAdapter.this);
|
||||||
fos.write(fileData);
|
queueWrite(request);
|
||||||
fos.close();
|
|
||||||
GB.toast("saved file data", Toast.LENGTH_SHORT, GB.INFO);
|
|
||||||
} catch (IOException e) {
|
|
||||||
GB.log("activity file error", GB.ERROR, e);
|
|
||||||
}
|
}
|
||||||
queueWrite(new FileDeleteRequest((short) 0x0101));
|
});
|
||||||
}
|
|
||||||
});*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.translation;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.Transaction;
|
||||||
|
|
||||||
|
public class TranslationData {
|
||||||
|
private String locale;
|
||||||
|
private TranslationItem[] translations;
|
||||||
|
|
||||||
|
public TranslationData(String locale, TranslationItem[] translations) {
|
||||||
|
this.locale = locale;
|
||||||
|
this.translations = translations;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLocale() {
|
||||||
|
return locale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocale(String locale) {
|
||||||
|
this.locale = locale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TranslationItem[] getTranslations() {
|
||||||
|
return translations;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTranslations(TranslationItem[] translations) {
|
||||||
|
this.translations = translations;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void replaceByOriginal(String originalKey, String translated){
|
||||||
|
for(TranslationItem translationItem : this.translations){
|
||||||
|
if(translationItem.getOriginal().equals(originalKey)){
|
||||||
|
translationItem.setTranslated(translated);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void replaceByTranslated(String translatedOld, String translatedNew){
|
||||||
|
for(TranslationItem translationItem : this.translations){
|
||||||
|
if(translationItem.getTranslated().equals(translatedOld)){
|
||||||
|
translationItem.setTranslated(translatedNew);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.translation;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
public class TranslationItem {
|
||||||
|
private String originalTranslation;
|
||||||
|
private String translated;
|
||||||
|
|
||||||
|
public TranslationItem(String originalTranslation, String translated) {
|
||||||
|
this.originalTranslation = originalTranslation;
|
||||||
|
this.translated = translated;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOriginal() {
|
||||||
|
return originalTranslation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOriginalTranslation(String originalTranslation) {
|
||||||
|
this.originalTranslation = originalTranslation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTranslated() {
|
||||||
|
return translated;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTranslated(String translated) {
|
||||||
|
this.translated = translated;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.originalTranslation + " => " + this.translated;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.translation;
|
||||||
|
|
||||||
|
import java.nio.BufferUnderflowException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileGetRequest;
|
||||||
|
|
||||||
|
public abstract class TranslationsGetRequest extends FileGetRequest {
|
||||||
|
public TranslationsGetRequest(FossilWatchAdapter adapter) {
|
||||||
|
super((short) 0x0702, adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleFileData(byte[] fileData) {
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(fileData);
|
||||||
|
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
|
||||||
|
buffer.position(12);
|
||||||
|
|
||||||
|
byte[] localeBytes = new byte[5];
|
||||||
|
buffer.get(localeBytes);
|
||||||
|
String locale = new String(localeBytes);
|
||||||
|
|
||||||
|
buffer.get(); // locale null byte
|
||||||
|
|
||||||
|
ArrayList<TranslationItem> translations = new ArrayList<>();
|
||||||
|
|
||||||
|
while(buffer.remaining() > 4){
|
||||||
|
int originalLength = buffer.getShort() - 1; // subtracting null terminator
|
||||||
|
byte[] originalBytes = new byte[originalLength];
|
||||||
|
buffer.get(originalBytes);
|
||||||
|
buffer.get(); // should always return null terminator
|
||||||
|
int translatedLength = buffer.getShort() - 1;
|
||||||
|
byte[] translatedBytes = new byte[translatedLength];
|
||||||
|
buffer.get(translatedBytes);
|
||||||
|
buffer.get(); // should always return null terminator
|
||||||
|
|
||||||
|
String original = new String(originalBytes);
|
||||||
|
String translated = new String(translatedBytes);
|
||||||
|
|
||||||
|
translations.add(new TranslationItem(original, translated));
|
||||||
|
}
|
||||||
|
|
||||||
|
handleTranslations(
|
||||||
|
new TranslationData(
|
||||||
|
locale,
|
||||||
|
translations.toArray(new TranslationItem[0])
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void handleTranslations(TranslationData translationDate);
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.translation;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FilePutRequest;
|
||||||
|
|
||||||
|
public class TranslationsPutRequest extends FilePutRequest {
|
||||||
|
public TranslationsPutRequest(TranslationData translationData, FossilWatchAdapter adapter) {
|
||||||
|
super((short) 0x0702, createPayload(translationData), (short) 0x0d02, adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] createPayload(TranslationData translationData){
|
||||||
|
TranslationItem[] translations = translationData.getTranslations();
|
||||||
|
int fileLength = 6 + translations.length * 6; // locale + one null-byte per translation + lengths per translation
|
||||||
|
for(TranslationItem translation : translations){
|
||||||
|
fileLength += translation.getOriginal().getBytes().length + translation.getTranslated().getBytes().length;
|
||||||
|
}
|
||||||
|
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(fileLength);
|
||||||
|
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
|
||||||
|
buffer.put(translationData.getLocale().getBytes())
|
||||||
|
.put((byte)0);
|
||||||
|
|
||||||
|
for(TranslationItem translation : translations){
|
||||||
|
byte[] originalBytes = translation.getOriginal().getBytes();
|
||||||
|
byte[] translatedBytes = translation.getTranslated().getBytes();
|
||||||
|
buffer.putShort((short)(originalBytes.length + 1))
|
||||||
|
.put(originalBytes)
|
||||||
|
.put((byte)0) // null terminator
|
||||||
|
.putShort((short)(translatedBytes.length + 1))
|
||||||
|
.put(translatedBytes)
|
||||||
|
.put((byte)0); // null terminator
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer.array();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user