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"