diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 8c8d7336e..093fa108e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -72,7 +72,7 @@ jobs:
run: |
rm -rf ./app/src/main/assets/firmware
mkdir -p ./app/src/main/assets/firmware
- unzip -qq ./firmware.zip 'spiffs-*.bin' 'firmware-heltec*.bin' 'firmware-tbeam*.bin' 'firmware-tlora*.bin' -d ./app/src/main/assets/firmware
+ unzip -qq ./firmware.zip 'littlefs-*.bin' 'firmware-heltec*.bin' 'firmware-tbeam*.bin' 'firmware-tlora*.bin' -d ./app/src/main/assets/firmware
rm ./firmware.zip
- name: Validate Gradle wrapper
diff --git a/app/build.gradle b/app/build.gradle
index 9dcd3403e..db1b4ff14 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -43,8 +43,8 @@ android {
applicationId "com.geeksville.mesh"
minSdkVersion 21 // The oldest emulator image I have tried is 22 (though 21 probably works)
targetSdkVersion 30 // 30 can't work until an explicit location permissions dialog is added
- versionCode 20258 // format is Mmmss (where M is 1+the numeric major number
- versionName "1.2.58"
+ versionCode 20303 // format is Mmmss (where M is 1+the numeric major number
+ versionName "1.3.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// per https://developer.android.com/studio/write/vector-asset-studio
@@ -122,8 +122,6 @@ protobuf {
dependencies {
- def room_version = '2.4.1'
-
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'androidx.core:core-ktx:1.7.0'
@@ -134,13 +132,12 @@ dependencies {
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.viewpager2:viewpager2:1.0.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
- implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0'
+ implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1'
implementation "androidx.room:room-runtime:$room_version"
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "androidx.room:room-compiler:$room_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"
-
// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"
@@ -161,14 +158,14 @@ dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
// For now I'm not using javalite, because I want JSON printing
- implementation('com.google.protobuf:protobuf-java:3.15.8')
+ implementation 'com.google.protobuf:protobuf-java:3.15.8'
// For UART access
// implementation 'com.google.android.things:androidthings:1.0'
implementation 'com.github.mik3y:usb-serial-for-android:3.4.3'
// mapbox
- implementation('com.mapbox.maps:android:10.2.0')
+ implementation 'com.mapbox.maps:android:10.2.0'
// mapbox specifies a really old version of okhttp3 which causes lots of API warnings. trying a newer version
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
index 7691c8e8f..f3da61bb1 100644
--- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
+++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
@@ -105,7 +105,7 @@ class MeshService : Service(), Logging {
/** The minimmum firmware version we know how to talk to. We'll still be able to talk to 1.0 firmwares but only well enough to ask them to firmware update
*/
- val minFirmwareVersion = DeviceVersion("1.2.0")
+ val minFirmwareVersion = DeviceVersion("1.3.0")
}
enum class ConnectionState {
@@ -1304,13 +1304,14 @@ class MeshService : Service(), Logging {
myInfo.myNodeNum // Note: can't use the normal property because myNodeInfo not yet setup
val ni = nodeDBbyNodeNum[nodeNum] // can't use toNodeInfo because too early
val hwModelStr = ni?.user?.hwModelString
+ setFirmwareUpdateFilename(hwModelStr)
val mi = with(myInfo) {
MyNodeInfo(
myNodeNum,
hasGps,
hwModelStr,
firmwareVersion,
- firmwareUpdateFilename != null,
+ firmwareUpdateFilename?.appLoad != null && firmwareUpdateFilename?.littlefs != null,
isBluetoothInterface && SoftwareUpdateService.shouldUpdate(
this@MeshService,
DeviceVersion(firmwareVersion)
@@ -1323,9 +1324,7 @@ class MeshService : Service(), Logging {
airUtilTx
)
}
-
newMyNodeInfo = mi
- setFirmwareUpdateFilename(mi)
}
}
@@ -1531,7 +1530,7 @@ class MeshService : Service(), Logging {
try {
val mi = myNodeInfo
if (mi != null) {
- debug("Sending our position/time to=$destNum lat=$lat, lon=$lon, alt=$alt")
+ debug("Sending our position/time to=$destNum lat=${lat.anonymize}, lon=${lon.anonymize}, alt=$alt")
val position = MeshProtos.Position.newBuilder().also {
it.longitudeI = Position.degI(lon)
@@ -1641,12 +1640,12 @@ class MeshService : Service(), Logging {
/***
* Return the filename we will install on the device
*/
- private fun setFirmwareUpdateFilename(info: MyNodeInfo) {
+ private fun setFirmwareUpdateFilename(model: String?) {
firmwareUpdateFilename = try {
- if (info.firmwareVersion != null && info.model != null)
+ if (model != null)
SoftwareUpdateService.getUpdateFilename(
this,
- info.model
+ model
)
else
null
diff --git a/app/src/main/java/com/geeksville/mesh/service/SoftwareUpdateService.kt b/app/src/main/java/com/geeksville/mesh/service/SoftwareUpdateService.kt
index 8326a5168..0eba401eb 100644
--- a/app/src/main/java/com/geeksville/mesh/service/SoftwareUpdateService.kt
+++ b/app/src/main/java/com/geeksville/mesh/service/SoftwareUpdateService.kt
@@ -70,7 +70,7 @@ fun toNetworkByteArray(value: Int, formatType: Int): ByteArray {
}
-data class UpdateFilenames(val appLoad: String?, val spiffs: String?)
+data class UpdateFilenames(val appLoad: String?, val littlefs: String?)
/**
* typical flow
@@ -172,7 +172,7 @@ class SoftwareUpdateService : JobIntentService(), Logging {
private val SW_UPDATE_RESULT_CHARACTER =
UUID.fromString("5e134862-7411-4424-ac4a-210937432c77") // read|notify result code, readable but will notify when the OTA operation completes
private val SW_UPDATE_REGION_CHARACTER =
- UUID.fromString("5e134862-7411-4424-ac4a-210937432c67") // write - used to set the region we are setting (appload vs spiffs)
+ UUID.fromString("5e134862-7411-4424-ac4a-210937432c67") // write - used to set the region we are setting (appload vs littlefs)
private val SW_VERSION_CHARACTER = longBLEUUID("2a28")
private val MANUFACTURE_CHARACTER = longBLEUUID("2a29")
@@ -208,11 +208,11 @@ class SoftwareUpdateService : JobIntentService(), Logging {
/**
* Update our progress indication for GUIs
*
- * @param isAppload if false, we don't report failure indications (because we consider spiffs non critical for now). But do report to analytics
+ * @param isAppload if false, we don't report failure indications (because we consider littlefs non critical for now). But do report to analytics
*/
fun sendProgress(context: Context, p: Int, isAppload: Boolean) {
if (!isAppload && p < 0)
- errormsg("Error while writing spiffs $p") // treat errors writing spiffs as non fatal for now (user partition probably missized and most people don't need it)
+ errormsg("Error while writing littlefs $p") // treat errors writing littlefs as non fatal for now (user partition probably missized and most people don't need it)
else
if (progress != p) {
progress = p
@@ -243,7 +243,7 @@ class SoftwareUpdateService : JobIntentService(), Logging {
false // If we fail parsing our update info
}
- /** Return a Pair of apploadfilename, spiffs filename this device needs to use as an update (or null if no update needed)
+ /** Return a Pair of appload filename, littlefs filename this device needs to use as an update (or null if no update needed)
*/
fun getUpdateFilename(
context: Context,
@@ -255,15 +255,15 @@ class SoftwareUpdateService : JobIntentService(), Logging {
val firmwareFiles = context.assets.list("firmware") ?: arrayOf()
val appLoad = "firmware-$mfg-$curVer.bin"
- val spiffs = "spiffs-$curVer.bin"
+ val littlefs = "littlefs-$curVer.bin"
return UpdateFilenames(
if (firmwareFiles.contains(appLoad))
"firmware/$appLoad"
else
null,
- if (firmwareFiles.contains(spiffs))
- "firmware/$spiffs"
+ if (firmwareFiles.contains(littlefs))
+ "firmware/$littlefs"
else
null
)
@@ -290,24 +290,30 @@ class SoftwareUpdateService : JobIntentService(), Logging {
* you can use it for the software update.
*/
fun doUpdate(context: Context, sync: SafeBluetooth, assets: UpdateFilenames) {
- // we must attempt spiffs first, because if we update the appload the device will reboot afterwards
+ // calculate total firmware size (littlefs + appLoad)
+ var totalFirmwareSize = 0
+ if (assets.appLoad != null && assets.littlefs != null) {
+ totalFirmwareSize += context.assets.open(assets.appLoad).available()
+ totalFirmwareSize += context.assets.open(assets.littlefs).available()
+ }
+ // we must attempt littlefs first, because if we update the appload the device will reboot afterwards
try {
- assets.spiffs?.let { doUpdate(context, sync, it, FLASH_REGION_SPIFFS) }
+ assets.littlefs?.let { doUpdate(context, sync, it, FLASH_REGION_LITTLEFS, totalFirmwareSize) }
} catch (_: BLECharacteristicNotFoundException) {
- // If we can't update spiffs (because not supported by target), do not fail
- errormsg("Ignoring failure to update spiffs on old appload")
+ // If we can't update littlefs (because not supported by target), do not fail
+ errormsg("Ignoring failure to update littlefs on old appload")
} catch (_: DeviceRejectedException) {
// the spi filesystem of this device is malformatted, fail silently because most users don't need the web server
- errormsg("Device rejected invalid spiffs partition")
+ errormsg("Device rejected invalid littlefs partition")
}
- assets.appLoad?.let { doUpdate(context, sync, it, FLASH_REGION_APPLOAD) }
+ assets.appLoad?.let { doUpdate(context, sync, it, FLASH_REGION_APPLOAD, totalFirmwareSize) }
sendProgress(context, ProgressSuccess, true)
}
// writable region codes in the ESP32 update code
private val FLASH_REGION_APPLOAD = 0
- private val FLASH_REGION_SPIFFS = 100
+ private val FLASH_REGION_LITTLEFS = 100
/**
* A public function so that if you have your own SafeBluetooth connection already open
@@ -317,7 +323,8 @@ class SoftwareUpdateService : JobIntentService(), Logging {
context: Context,
sync: SafeBluetooth,
assetName: String,
- flashRegion: Int = FLASH_REGION_APPLOAD
+ flashRegion: Int = FLASH_REGION_APPLOAD,
+ totalFirmwareSize: Int = 0
) {
val isAppload = flashRegion == FLASH_REGION_APPLOAD
@@ -341,9 +348,9 @@ class SoftwareUpdateService : JobIntentService(), Logging {
val crc32Desc = getCharacteristic(SW_UPDATE_CRC32_CHARACTER)
val updateResultDesc = getCharacteristic(SW_UPDATE_RESULT_CHARACTER)
- /// Try to set the destination region for programming (spiffs vs appload etc)
+ /// Try to set the destination region for programming (littlefs vs appload etc)
/// Old apploads don't have this feature, but we only fail if the user was trying to set a
- /// spiffs - otherwise we assume appload.
+ /// littlefs - otherwise we assume appload.
try {
val updateRegionDesc = getCharacteristic(SW_UPDATE_REGION_CHARACTER)
sync.writeCharacteristic(
@@ -378,13 +385,15 @@ class SoftwareUpdateService : JobIntentService(), Logging {
// Send all the blocks
var oldProgress = -1 // used to limit # of log spam
while (firmwareNumSent < firmwareSize) {
- // If we are doing the spiffs partition, we limit progress to a max of 50%, so that the user doesn't think we are done
- // yet
- val maxProgress = if (flashRegion != FLASH_REGION_APPLOAD)
- 50 else 100
+ // If we are doing the littlefs partition, we limit progress to a max of maxProgress
+ // when updating the appload partition, progress from (100 - maxProgress) to 100%
+ // maxProgress = littlefs% = 100% - appLoad%; (int * 10 + 5) / 10 used for rounding
+ val maxProgress = ((firmwareSize * 1000 / totalFirmwareSize) + 5) / 10
+ val minProgress = if (flashRegion != FLASH_REGION_APPLOAD)
+ 0 else (100 - maxProgress)
sendProgress(
context,
- firmwareNumSent * maxProgress / firmwareSize,
+ minProgress + firmwareNumSent * maxProgress / firmwareSize,
isAppload
)
if (progress != oldProgress) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt
index 89717f296..83fd0561f 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt
@@ -24,6 +24,7 @@ import android.widget.*
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
+import com.geeksville.analytics.DataPair
import com.geeksville.android.GeeksvilleApplication
import com.geeksville.android.Logging
import com.geeksville.android.hideKeyboard
@@ -474,6 +475,10 @@ class SettingsFragment : ScreenFragment("Settings"), Logging {
model.meshService?.let { service ->
debug("User started firmware update")
+ GeeksvilleApplication.analytics.track(
+ "firmware_update",
+ DataPair("content_type", "start")
+ )
binding.updateFirmwareButton.isEnabled = false // Disable until things complete
binding.updateProgressBar.visibility = View.VISIBLE
binding.updateProgressBar.progress = 0 // start from scratch
@@ -515,6 +520,10 @@ class SettingsFragment : ScreenFragment("Settings"), Logging {
} else
when (progress) {
ProgressSuccess -> {
+ GeeksvilleApplication.analytics.track(
+ "firmware_update",
+ DataPair("content_type", "success")
+ )
binding.scanStatusText.setText(R.string.update_successful)
binding.updateProgressBar.visibility = View.GONE
}
@@ -523,6 +532,10 @@ class SettingsFragment : ScreenFragment("Settings"), Logging {
binding.updateProgressBar.visibility = View.GONE
}
else -> {
+ GeeksvilleApplication.analytics.track(
+ "firmware_update",
+ DataPair("content_type", "failure")
+ )
binding.scanStatusText.setText(R.string.update_failed)
binding.updateProgressBar.visibility = View.VISIBLE
}
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index d29c99100..23fb43959 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -48,7 +48,7 @@
Sdílet
Odpojeno
Zařízení spí
- Pripojeno: %s z %s je online
+ Pripojeno: %1$s z %2$s je online
Seznam vysílačů v síti
Aktualizace softwaru
Připojeno k vysílači (%s)
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 0c474b602..b5743c54a 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -48,7 +48,7 @@
Κοινοποίηση
Αποσυνδεδεμένο
Συσκευή σε ύπνωση
- Συνδεδεμένος: %s από %s online
+ Συνδεδεμένος: %1$s από %2$s online
Λίστα κόμβων δικτύου
Αναβάθμιση Firmware
Συνδεδεμένο στο radio
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index fc04f199b..24e1c10b2 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -45,7 +45,7 @@
Compartir
Desconectado
Dispositivo en reposo
- Conectado: %s de %s en línea
+ Conectado: %1$s de %2$s en línea
Una lista de nodos en la red
Actualizar el firmware
Conectado a la radio
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index c903c8ed7..8af1f7007 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -49,7 +49,7 @@
Partager
Déconnecté
Appareil en veille
- Connecté: %s sur %s en ligne
+ Connecté: %1$s sur %2$s en ligne
Une liste de nœuds dans le réseau
Mise à jour du Firmware
Connecté à une radio
diff --git a/app/src/main/res/values-ht/strings.xml b/app/src/main/res/values-ht/strings.xml
index 2b1ff45e2..02236b315 100644
--- a/app/src/main/res/values-ht/strings.xml
+++ b/app/src/main/res/values-ht/strings.xml
@@ -46,7 +46,7 @@
Pataje
Dekonekte
Aparèy ap dòmi
- Konekte: %s nan %s disponib
+ Konekte: %1$s nan %2$s disponib
Yon lis ne elektwonik nan rezo a
Mete ajou mikrolojisyèl
Konekte ak radyo
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index bfec87450..04710ba72 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -47,7 +47,7 @@
Megosztás
Szétkapcsolva
Az eszköz alszik
- Kapcsolódva: %s a %s-ból(ből) elérhető
+ Kapcsolódva: %1$s a %2$s-ból(ből) elérhető
Hálózati állomások listája
Firmware frissítés
Kapcsolódva a rádióhoz
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index bc1d039f6..b38ebb5aa 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -48,7 +48,7 @@ mapboxの有償プラン(または代替地図プロバイダ)を検討さ
シェア
切断
スリープ
- 接続済み:%s人オンライン%s人中
+ 接続済み:%1$s人オンライン%2$s人中
ネットワーク内のノードリスト
ファームウェアアップデート
Meshtasticデバイスに接続しました。(%s)
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index 654b61d98..e96773a02 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -46,7 +46,7 @@
공유
연결 해제
장치 잠자기
- 연결: %s 온라인( 전체 %s)
+ 연결: %1$s 온라인( 전체 %2$s)
네트워크안은 모든 노드의 목록
펌웨어 업데이트
라디오로 연결됨
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 29cb57db9..5b8653401 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -48,7 +48,7 @@
Deel
Niet verbonden
Apparaat in slaapstand
- Verbonden: %s van %s online
+ Verbonden: %1$s van %2$s online
Een lijst van de aansluitpunten in het netwerk
Programma Updaten
Verbonden met een radio
diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml
index 50bbe97a9..9155ecc4a 100644
--- a/app/src/main/res/values-no/strings.xml
+++ b/app/src/main/res/values-no/strings.xml
@@ -48,7 +48,7 @@
Del
Frakoblet
Enhet sover
- Tilkoblet: %s av %s på nett
+ Tilkoblet: %1$s av %2$s på nett
En liste over noder i nettverket
Oppdater Firmware
Tilkoblet radio
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 866ba1e83..d552b1686 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -53,7 +53,7 @@
Udostępnij
Rozłączone
Urządzenie uśpione.
- Połączono: %s of %s online
+ Połączono: %1$s of %2$s online
Lista użytkowników w sieci
Aktualizuj oprogramowanie.
Połączony z urządzeniem
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 55c5c231a..fc18bb8ce 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -48,7 +48,7 @@
Compartilhar
Desconectado
Dispositivo em suspensão (sleep)
- Conectado: %s de %s online
+ Conectado: %1$s de %2$s online
Lista de dispositivos na rede
Atualizar Firmware
Conectado ao rádio
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 962ba9b12..13521d704 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -47,7 +47,7 @@
Partilha
Desconectado
Dispositivo a dormir
- Conectado: %s de %s online
+ Conectado: %1$s de %2$s online
Lista de nós na rede
Atualizar Firmware
Conectado ao rádio
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 8a09fd425..61085a5d8 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -48,7 +48,7 @@
Distribuie
Deconectat
Dispozitiv în sleep mode
- Connectat: %s din %s online
+ Connectat: %1$s din %2$s online
O lista cu nodurile din rețea
Updateaza firmware-ul
Connectat la dispozitiv
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index cc344cf00..9a06917ae 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -48,7 +48,7 @@
Zdieľať
Odpojené
Vysielač uspatý
- Pripojený: %s z %s je online
+ Pripojený: %1$s z %2$s je online
Zoznam vysielačov v sieti
Aktualizácia firmvéru
Pripojené k vysielaču
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index b7bf0dace..1520b3344 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -46,7 +46,7 @@
Deliti
Prekinjeno
Naprava je v "spanju"
- Povezano: %s od %s je na mreži
+ Povezano: %1$s od %2$s je na mreži
Seznam vozlišč v omrežju
Posodobite vdelano programsko opremo
Povezana z radiem
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 5cdc4f91d..80346d790 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -48,7 +48,7 @@
Paylaş
Bağlantı sonlandı
Cihaz uyku durumunda
- Bağlandı: %s / %s online
+ Bağlandı: %1$s / %2$s online
Ağdaki node listesi
Yazılım güncelle
Radyoya bağlandı
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 2d9628fe3..8ea70c221 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -48,7 +48,7 @@
分享
断开连接
设备休眠中
- 连接: %s 中 %s 在线
+ 连接: %1$s 中 %2$s 在线
网络中节点列表
更新固件
连接设备
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e0e11c9d8..d23dca3ec 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -52,7 +52,7 @@
Share
Disconnected
Device sleeping
- Connected: %s of %s online
+ Connected: %1$s of %2$s online
A list of nodes in the network
Update Firmware
Connected to radio
diff --git a/build.gradle b/build.gradle
index c4e902af7..968e895bf 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,7 +2,8 @@
buildscript {
ext.kotlin_version = '1.6.10'
- ext.coroutines_version = "1.5.2"
+ ext.coroutines_version = '1.6.0'
+ ext.room_version = '2.4.2'
ext.hilt_version = '2.40.5'
repositories {
@@ -10,7 +11,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:7.1.1'
+ classpath 'com.android.tools.build:gradle:7.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"