From 33d8ea2f5634bd8609068bfd18186d4e385b24e6 Mon Sep 17 00:00:00 2001 From: Gergely Peidl Date: Fri, 17 Jun 2016 14:29:57 +0200 Subject: [PATCH 1/3] Hungarian translation added. :) --- app/src/main/res/values-hu/strings.xml | 242 +++++++++++++++++++++++++ app/src/main/res/values/arrays.xml | 2 + 2 files changed, 244 insertions(+) create mode 100644 app/src/main/res/values-hu/strings.xml diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml new file mode 100644 index 00000000..75ace991 --- /dev/null +++ b/app/src/main/res/values-hu/strings.xml @@ -0,0 +1,242 @@ + + + Gadgetbridge + HR: + (ismeretlen) + Aktivitás + Mély alvás + Könnyű alvás + Nem viselt + Hibakeresés + Új eszköz csatlakoztatása + Kilépés + Beállítások + Rólad + Nem + Magasság cm-ben + Preferált alvási idő órában + Testsúly kg-ban + Születési év + Aktivitásod és alvásod + Widget hozzáadása + Pén + Hét + Szo + Okos ébresztés + Vas + Csü + Ked + Sze + mindig + Használja az Android Bluetooth párosítás ablakot eszköz párosításához. + Beállítás + A következő alkalmazást fogod telepíteni:\n\n\n%1$s Version %2$s : %3$s\n + Telepítés + Aktiválás + Deaktiválás + Törlés + Törlés és eltávolítás a gyorsítótárból + Újratelepítés + %1$s by %2$s + Ébresztő beállítva: %1$02d:%2$02d + Zzz + hitelesítés + hitelesítés szükséges + A Bluetooth ki van kapcsolva. + A Bluetooth nem támogatott. + Aktivitási adatok lekérdezése. + Eszköz kép + Nem lehet kapcsolódni: %1$s + Nem lehet csatlakozni. Rossz Bluetooth cím? + Nincs adat. Szinkronizáltál? + Lépések + Pulzus + csatlakoztatva + csatlakozás + FW: %1$s + HW: %1$s FW: %2$s + A vibrálás leállításához: Mégse. + Elveszett eszköz keresése + Szétcsatlakoztatás + Szinkronálás + Elveszett eszköz keresése... + Aktivitásod (ALFA) + Ébresztők beállítása + Alvási adatok (ALFA) + Képernyőkép készítése + Hiba a futtatáskor: \'%1$s\' + FW: %1$s + HW: %1$s + Nincs csatlakoztatva. + %1$s (%2$s) + Engedélyezd a készüléked láthatóságát. A csatlakoztatott készülékek valószínűleg nem fognak megjelenni. Ha a készüléked nem jelenik meg 2 perc elteltével, próbáld újra, majd indítsd újra a telefonod. + Megjegyzés: + Keresés kezdése + Keresés leállítása + Hiba a könyvtár létrehozáskor a naplófájlok számára: %1$s + + FIRMWARE-T PRÓBÁLSZ TELEPÍTENI, CSAK SAJÁT FELELŐSSÉGRE TEDD!.\n\n\n Ez a firmware ehhez a hardware-verzióhoz tartozik: %s + Firmware-t fogsz telepíteni: %1$s és %2$s a mostani helyett a Mi Band-edre. + Firmware-t fogsz telepíteni: %s a mostani helyett a Mi Band-edre. + A fájlt nem lehet telepíteni, a készülék nincs készen. + Csatlakozás az eszközhöz: %1$s + Ez a firmware nem kompatibilis az eszközöddel. + A Gadgetbridge fut + inicializált + inicializálás + sikertelen telepítés! + sikeres telepítés + A telepítéshez szükséges segédfájl nem található. + Kérlek várj a telepítési státusz megállapításáig... + bináris telepítés %1$d/%2$d + bal + Jelenlegi lépés/perc + Pulzus + Aktivitás kezdése + Lépésnapló + Lépés/perc napló + Összes lépés + Aktuális aktivitás + férfi + Nincs találat a mac címre, nem lehet párosítani. + Ez a firmware tesztelt és ismerten kompatibilis a Gadgetbridge-el. + Ha ennek ellenére is telepíteni szeretnéd, és a dolgok jól működnek, utána kérlek jelezd a Gadgetbridge fejlesztőinek, hogy fehérlistára tehessék a + "Ez a firmware nincs tesztelve, lehetséges, hogy nem kompatibilis a Gadgetbridge-el.\n\nNem javasoljuk, hogy feltelepítsd a Mi Band-edre!" + Kompatibilis verzió + Nem kompatibilis firmware + Nem tesztelt verzió! + Mi Band Firmware %1$s + Párosítás: %s… + Amikor vibrálni kezd a Mi Band-ed, érintsd meg párszor egymás után. + Nem helyes felhasználói adatok vannak megadva, alapértelmezett adatokat fogok használni. + Név/Alias + Eszköz időeltolása órákban (Hogy az éjszakai műszakban dolgozók alvását is érzékelje.) + Napi céllépésszám + + Pulzus szenzor használata az alvás érzékelés javításához + + Rezgés + Melyik kezeden hordod? + N/A + soha + nincs csatlakozva + Utoljára töltve: %s \n + Töltések száma: %s + %1$s fennmaradó akkumulátor töltés: %2$s%% + Alacsony akkumulátorszint + egyéb + Sikertelen telepítés: a firmware nem kompatibilis a Pebble hardver verzióddal. + Nem sikerült telepíteni a fájlt: %1$s + Pebble Firmware %1$s + %1$s (%2$s) + Helyes hardververzió + Hardververzió eltérés! + Tiltott alkalmazások + Alapértelmezett + Aktivitásmérők + Dátum és idő + Fejlesztői beállítások + Általános beállítások + Helység + Értesítések + Rezgésszám + Rezgésbeállítások + Általános értesítések + Bejővő hívás értesítés + K9 E-Mail értesítés + Pebble értesítés + SMS értesítés + Rezgés profil + Idő szinkronizálása csatlakozásnál és Android idő- vagy időzónaváltoztatásnál. + + Az adatokat a Mi Band-en fogja tárolni szinkronizálás után is. Hasznos, ha a GadgetBridge-et együtt használod más alkalmazásokkal. + Ez segíthet, ha a firmware frissítés sikertelen. + Értesítések tiltása a Ne zavarj üzemmód használatakor. + Támogatás az alkalmazásoknak, amik értesítést küldenek a Pebble-nek Intent-en keresztül. Ez beszélgetésre használható. + Ez az opció erőlteti az utolsó értesítési protokollt a firmware verziótól függően. CSAK AKKOR ENGEDÉLYEZD, HA TUDOD MIT CSINÁLSZ! + Nem tesztelt funkciók engedélyezése. CSAK AKKOR ENGEDÉLYEZD, HA TUDOD MIT CSINÁLSZ! + A napkelte és napnyugta idejének küldése a Pebble idővonalra a hely és idő alapján + Sötét + Világos + Preferált zenelejátszó + Előre megírt válaszok + Közös előtag + Idő szinkronizálás + Mi Band cím + Harmadik féltől származó Android alkalmazások hozzáférésének engedélyezése + Kapcsolódjon az eszközhöz a Bluetooth bekapcsolásakor + Újracsatlakozás automatikusan + Aktivitásadatok eszközön hagyása + + Földrajzi hely + Szélesség + Hosszúság + Használja a low-latency módot a Firmware frissítésnél + Ne zavarj mód + Telefonhívások + Általános értesítési támogatás + K9-Mail + Pebble Üzenetek + Ismétlések + SMS + Preferált Aktivitásmérők + Erőltetett értesítés protokoll + Nem tesztelt funkciók engedélyezése + Újracsatlakozási kísérletek száma + Pebble beállítások + Pebble Health szinkronizálása + Misfit szinkronizálás + Morpheuz szinkronizálás + Napkelte és napnyugta + Téma + … és amikor a kijelző be van kapcsolva + Naplófájlok írása + Eszközspecifikus beállítások + MI Band beállítások + jobb + Ettől %1$s eddig %2$s + Az alvásod + Érintsd meg az eszközt a csatlakozáshoz + Érintsd meg az eszközt az aktivitáshoz + Érintsd meg az eszközt az alkalmazáskezelőhöz + Teszt + Teszt értesítés + Ez egy tesztértesítés a Gadgetbridge-től + Ébresztés részletek + Eszköz párosítása + Értesítés tiltólista + Alkalmazás kezelő + Aktivitásod + Gadgetbridge + Hibakeresés + Eszköz fellelhetőség + FW/Alkalmazás telepítő + Párosítsd a Mi Band-ed + Ébresztések beállítása + Beállítások + Alvástörténet + ismeretlen állapot + Nem küldött Firmware + Probléma volt a Firmware metaadatainak küldésekor + A Firmware telepítés kész + A Firmware telepítés kész, az eszköz újraindítása… + Firmware frissítés folyamatban + Probléma volt a firmware küldésekor. NE INDÍTSD ÚJRA a Mi Band-ed! + Firmware írási probléma + Firmware frissítése… + Mindegyik ébresztés tiltva van + Adatok fogadása: %1$s %2$s -tól + Hiba történt az ébresztések beállításakor, kérlek próbáld újra! + Ébresztések beállítva! + Ébresztőóra + Hosszú + Közepes + Csörgés + Rövid + Szaggatott + Vízcsepp + várakozás az újracsatlakozásra + Lépések ma, cél: %1$s + Lépések a héten + amikor a kijelző ki van kapcsolva + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 8cf1b287..830f7002 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -24,6 +24,7 @@ Українська 한국어 日本語 + Magyar @@ -39,6 +40,7 @@ uk ko ja + hu From fffeb876075c72db39739773d7e2289a6b434df9 Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Sat, 18 Jun 2016 18:33:35 +0200 Subject: [PATCH 2/3] Use constant instead of hardcoded string --- .../gadgetbridge/activities/AppManagerActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AppManagerActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AppManagerActivity.java index db758d3b..a6dae1b2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AppManagerActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AppManagerActivity.java @@ -30,6 +30,7 @@ import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.adapter.GBDeviceAppAdapter; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceApp; +import nodomain.freeyourgadget.gadgetbridge.model.DeviceService; import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.PebbleProtocol; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.PebbleUtils; @@ -255,7 +256,7 @@ public class AppManagerActivity extends GBActivity { GBApplication.deviceService().onAppStart(selectedApp.getUUID(), true); Intent startIntent = new Intent(getApplicationContext(), ExternalPebbleJSActivity.class); - startIntent.putExtra("app_uuid", selectedApp.getUUID()); + startIntent.putExtra(DeviceService.EXTRA_APP_UUID, selectedApp.getUUID()); startIntent.putExtra(GBDevice.EXTRA_DEVICE, mGBDevice); startActivity(startIntent); return true; From 966c3d4811bd6fcea8de1e190024c0dc49f0b223 Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Sat, 18 Jun 2016 18:40:57 +0200 Subject: [PATCH 3/3] Various improvements to the configuration page: - localstorage is now cleared at every launch: this prevents some clay configuration pages to send back to the watch a number of keys that were set by other configuration pages - only execute JS on document ready: this prevents some race conditions - added dummy getTimelineToken function to Pebble JS object - corrected (hopefully!) a few logic errors in the JS code (this referenced where it wasn't) - refactored the steps visualization in JS - lifecycle changes to the java activity: now the configuration page gets closed as soon as the settings have been sent, and there is only one instance of it --- app/src/main/AndroidManifest.xml | 1 + app/src/main/assets/app_config/configure.html | 18 ++++-- .../app_config/js/gadgetbridge_boilerplate.js | 64 ++++++++++++------- .../activities/ExternalPebbleJSActivity.java | 54 +++++++++++----- 4 files changed, 91 insertions(+), 46 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c72495ef..68536ab3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -261,6 +261,7 @@ diff --git a/app/src/main/assets/app_config/configure.html b/app/src/main/assets/app_config/configure.html index 87188f12..68edb92d 100644 --- a/app/src/main/assets/app_config/configure.html +++ b/app/src/main/assets/app_config/configure.html @@ -1,6 +1,6 @@ - + @@ -52,14 +52,16 @@ - -
+ +

Url of the configuration:

- +
-
+

In case of "network error" after saving settings in the wathchapp, copy the "network error" URL and paste it here:


@@ -67,9 +69,11 @@ configuration
-
+

Incoming configuration data:

- +
diff --git a/app/src/main/assets/app_config/js/gadgetbridge_boilerplate.js b/app/src/main/assets/app_config/js/gadgetbridge_boilerplate.js index a40bf2d7..7738e6f5 100644 --- a/app/src/main/assets/app_config/js/gadgetbridge_boilerplate.js +++ b/app/src/main/assets/app_config/js/gadgetbridge_boilerplate.js @@ -1,3 +1,6 @@ +//clay stores the values in the localStorage +localStorage.clear(); + function loadScript(url, callback) { // Adding the script tag to the head as suggested before var head = document.getElementsByTagName('head')[0]; @@ -29,46 +32,63 @@ function getURLVariable(variable, defaultValue) { return defaultValue || false; } +function showStep(desiredStep) { + var steps = document.getElementsByClassName("step"); + var testStep = null; + for (var i = 0; i < steps.length; i ++) { + if (steps[i].id == desiredStep) + testStep = steps[i].id; + } + if (testStep !== null) { + for (var i = 0; i < steps.length; i ++) { + steps[i].style.display = 'none'; + } + document.getElementById(desiredStep).style.display="block"; + } +} + function gbPebble() { this.configurationURL = null; this.configurationValues = null; + var self = this; this.addEventListener = function(e, f) { if(e == 'ready') { - this.ready = f; + self.ready = f; } if(e == 'showConfiguration') { - this.showConfiguration = f; + self.showConfiguration = f; } if(e == 'webviewclosed') { - this.parseconfig = f; + self.parseconfig = f; } if(e == 'appmessage') { - this.appmessage = f; + self.appmessage = f; } } this.removeEventListener = function(e, f) { if(e == 'ready') { - this.ready = null; + self.ready = null; } if(e == 'showConfiguration') { - this.showConfiguration = null; + self.showConfiguration = null; } if(e == 'webviewclosed') { - this.parseconfig = null; + self.parseconfig = null; } if(e == 'appmessage') { - this.appmessage = null; + self.appmessage = null; } } this.actuallyOpenURL = function() { - document.getElementById('step1compat').style.display="block"; - window.open(this.configurationURL.toString(), "config"); + showStep("step1compat"); + window.open(self.configurationURL.toString(), "config"); } this.actuallySendData = function() { - GBjs.sendAppMessage(this.configurationValues); + GBjs.sendAppMessage(self.configurationValues); + GBjs.closeActivity(); } //needs to be called like this because of original Pebble function name @@ -76,7 +96,7 @@ function gbPebble() { if (url.lastIndexOf("http", 0) === 0) { document.getElementById("config_url").innerHTML=url; var UUID = GBjs.getAppUUID(); - this.configurationURL = new Uri(url).addQueryParam("return_to", "gadgetbridge://"+UUID+"?config=true&json="); + self.configurationURL = new Uri(url).addQueryParam("return_to", "gadgetbridge://"+UUID+"?config=true&json="); } else { //TODO: add custom return_to location.href = url; @@ -90,7 +110,7 @@ function gbPebble() { this.sendAppMessage = function (dict, callbackAck, callbackNack){ try { - this.configurationValues = JSON.stringify(dict); + self.configurationValues = JSON.stringify(dict); document.getElementById("jsondata").innerHTML=this.configurationValues; return callbackAck; } @@ -108,6 +128,10 @@ function gbPebble() { return GBjs.getWatchToken(); } + this.getTimelineToken = function() { + return ''; + } + this.showSimpleNotificationOnPebble = function(title, body) { GBjs.gbLog("app wanted to show: " + title + " body: "+ body); } @@ -116,17 +140,14 @@ function gbPebble() { } this.parseReturnedPebbleJS = function() { - var str = document.getElementById('pastereturn').value; var needle = "pebblejs://close#"; if (str.split(needle)[1] !== undefined) { var t = new Object(); t.response = unescape(str.split(needle)[1]); - this.parseconfig(t); - document.getElementById('step1').style.display="none"; - document.getElementById('step1compat').style.display="none"; - document.getElementById('step2').style.display="block"; + self.parseconfig(t); + showStep("step2"); } else { console.error("No valid configuration found in the entered string."); } @@ -136,13 +157,11 @@ function gbPebble() { var Pebble = new gbPebble(); var jsConfigFile = GBjs.getAppConfigurationFile(); +document.addEventListener('DOMContentLoaded', function(){ if (jsConfigFile != null) { loadScript(jsConfigFile, function() { if (getURLVariable('config') == 'true') { - document.getElementById('step1').style.display="none"; - document.getElementById('step1compat').style.display="none"; - document.getElementById('step2').style.display="block"; - + showStep("step2"); var json_string = unescape(getURLVariable('json')); var t = new Object(); t.response = json_string; @@ -154,3 +173,4 @@ if (jsConfigFile != null) { } }); } +}, false); \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java index f2d30264..f756ecb5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java @@ -28,6 +28,7 @@ import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.model.DeviceService; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.PebbleUtils; @@ -37,7 +38,9 @@ public class ExternalPebbleJSActivity extends GBActivity { private static final Logger LOG = LoggerFactory.getLogger(ExternalPebbleJSActivity.class); private UUID appUuid; + private Uri confUri; private GBDevice mGBDevice = null; + private WebView myWebView; @Override protected void onCreate(Bundle savedInstanceState) { @@ -46,27 +49,15 @@ public class ExternalPebbleJSActivity extends GBActivity { Bundle extras = getIntent().getExtras(); if (extras != null) { mGBDevice = extras.getParcelable(GBDevice.EXTRA_DEVICE); + appUuid = (UUID) extras.getSerializable(DeviceService.EXTRA_APP_UUID); } else { throw new IllegalArgumentException("Must provide a device when invoking this activity"); } - String queryString = ""; - Uri uri = getIntent().getData(); - if (uri != null) { - //getting back with configuration data - try { - appUuid = UUID.fromString(uri.getHost()); - queryString = uri.getEncodedQuery(); - } catch (IllegalArgumentException e) { - Log.d("returned uri: ", uri.toString()); - } - } else { - appUuid = (UUID) getIntent().getSerializableExtra("app_uuid"); - } setContentView(R.layout.activity_external_pebble_js); - WebView myWebView = (WebView) findViewById(R.id.configureWebview); + myWebView = (WebView) findViewById(R.id.configureWebview); myWebView.clearCache(true); myWebView.setWebViewClient(new GBWebClient()); myWebView.setWebChromeClient(new GBChromeClient()); @@ -78,7 +69,32 @@ public class ExternalPebbleJSActivity extends GBActivity { JSInterface gbJSInterface = new JSInterface(); myWebView.addJavascriptInterface(gbJSInterface, "GBjs"); - myWebView.loadUrl("file:///android_asset/app_config/configure.html?" + queryString); + myWebView.loadUrl("file:///android_asset/app_config/configure.html"); + + } + + @Override + protected void onNewIntent(Intent incoming) { + super.onNewIntent(incoming); + confUri = incoming.getData(); + } + + @Override + protected void onResume() { + super.onResume(); + String queryString = ""; + + if (confUri != null) { + //getting back with configuration data + try { + appUuid = UUID.fromString(confUri.getHost()); + queryString = confUri.getEncodedQuery(); + } catch (IllegalArgumentException e) { + GB.toast("returned uri: " + confUri.toString(), Toast.LENGTH_LONG, GB.ERROR); + } + myWebView.loadUrl("file:///android_asset/app_config/configure.html?" + queryString); + } + } private JSONObject getAppConfigurationKeys() { @@ -112,8 +128,7 @@ public class ExternalPebbleJSActivity extends GBActivity { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("http://") || url.startsWith("https://")) { - Intent i = new Intent(Intent.ACTION_VIEW, - Uri.parse(url)); + Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(i); } else { url = url.replaceFirst("^pebblejs://close#", "file:///android_asset/app_config/configure.html?config=true&json="); @@ -222,6 +237,11 @@ public class ExternalPebbleJSActivity extends GBActivity { //specification says: A string that is is guaranteed to be identical for each Pebble device for the same app across different mobile devices. The token is unique to your app and cannot be used to track Pebble devices across applications. see https://developer.pebble.com/docs/js/Pebble/ return "gb" + appUuid.toString(); } + + @JavascriptInterface + public void closeActivity() { + finish(); + } } @Override