From cec2b7d56c9f97ce00ed71c4a2bc0c1ecbfccbe8 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Tue, 31 Aug 2021 17:44:45 +0300 Subject: [PATCH 01/33] ISSUE #448 Remove claimed and shared sensors when on logging out --- .../station/dashboard/ui/DashboardActivity.kt | 8 +++-- .../ui/DashboardActivityViewModel.kt | 4 ++- .../station/database/domain/LocalDatabase.kt | 10 +++++- .../domain/SensorSettingsRepository.kt | 3 +- .../station/database/domain/TagRepository.kt | 16 +++++++--- .../station/database/tables/SensorSettings.kt | 5 ++- .../network/di/NetworkInjectionModule.kt | 2 +- .../network/domain/NetworkTokenRepository.kt | 31 ++++++++++++++----- .../network/domain/RuuviNetworkInteractor.kt | 13 ++++++-- .../tagdetails/ui/TagDetailsActivity.kt | 9 +++--- .../tagdetails/ui/TagDetailsViewModel.kt | 4 ++- .../domain/TagSettingsInteractor.kt | 2 +- .../tagsettings/ui/TagSettingsActivity.kt | 2 +- app/src/main/res/values/strings.xml | 2 +- 14 files changed, 80 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt b/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt index 4c1b4244c..c680a49a5 100644 --- a/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt +++ b/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt @@ -208,9 +208,7 @@ class DashboardActivity : AppCompatActivity(), KodeinAware { } private fun login(signedIn: Boolean) { - if (signedIn == false) { - SignInActivity.start(this) - } else { + if (signedIn) { val builder = AlertDialog.Builder(this) with(builder) { @@ -223,6 +221,9 @@ class DashboardActivity : AppCompatActivity(), KodeinAware { } show() } + } else { + SignInActivity.start(this) + } } @@ -239,6 +240,7 @@ class DashboardActivity : AppCompatActivity(), KodeinAware { } private fun updateMenu(signed: Boolean) { + networkLayout.isVisible = viewModel.userEmail.value?.isNotEmpty() == true val loginMenuItem = navigationView.menu.findItem(R.id.loginMenuItem) loginMenuItem?.let { it.title = if (signed) { diff --git a/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivityViewModel.kt b/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivityViewModel.kt index 636a0ff05..9b7d7f073 100644 --- a/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivityViewModel.kt +++ b/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivityViewModel.kt @@ -89,6 +89,8 @@ class DashboardActivityViewModel( } fun signOut() { - tokenRepository.signOut() + tokenRepository.signOut { + updateTags() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/database/domain/LocalDatabase.kt b/app/src/main/java/com/ruuvi/station/database/domain/LocalDatabase.kt index 33d3d25cc..c3cf3e319 100644 --- a/app/src/main/java/com/ruuvi/station/database/domain/LocalDatabase.kt +++ b/app/src/main/java/com/ruuvi/station/database/domain/LocalDatabase.kt @@ -13,7 +13,15 @@ import com.ruuvi.station.database.tables.* class LocalDatabase { companion object { const val NAME = "LocalDatabase" - const val VERSION = 23 + const val VERSION = 24 + } + + @Migration(version = 24, database = LocalDatabase::class) + class Migration24(table: Class?) : AlterTableMigration(table) { + override fun onPreMigrate() { + super.onPreMigrate() + addColumn(SQLiteType.INTEGER, "networkSensor") + } } @Migration(version = 23, database = LocalDatabase::class) diff --git a/app/src/main/java/com/ruuvi/station/database/domain/SensorSettingsRepository.kt b/app/src/main/java/com/ruuvi/station/database/domain/SensorSettingsRepository.kt index dd14c5783..821d4c460 100644 --- a/app/src/main/java/com/ruuvi/station/database/domain/SensorSettingsRepository.kt +++ b/app/src/main/java/com/ruuvi/station/database/domain/SensorSettingsRepository.kt @@ -104,9 +104,10 @@ class SensorSettingsRepository { .execute() } - fun setSensorOwner(sensorId: String, owner: String) { + fun setSensorOwner(sensorId: String, owner: String, isNetworkSensor: Boolean) { var settings = getSensorSettingsOrCreate(sensorId) settings.owner = owner + settings.networkSensor = isNetworkSensor settings.update() } diff --git a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt index b22b3d747..1fa282ebb 100644 --- a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt +++ b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt @@ -65,20 +65,26 @@ class TagRepository( return if (queryResult != null) tagConverter.fromDatabase(queryResult) else null } - fun deleteTagsAndRelatives(tag: RuuviTagEntity) { + fun deleteSensorAndRelatives(sensorId: String) { + getTagById(sensorId)?.let { + deleteSensorAndRelatives(it) + } + } + + fun deleteSensorAndRelatives(sensor: RuuviTagEntity) { SQLite.delete(Alarm::class.java) - .where(Alarm_Table.ruuviTagId.eq(tag.id)) + .where(Alarm_Table.ruuviTagId.eq(sensor.id)) .execute() SQLite.delete(TagSensorReading::class.java) - .where(TagSensorReading_Table.ruuviTagId.eq(tag.id)) + .where(TagSensorReading_Table.ruuviTagId.eq(sensor.id)) .execute() SQLite.delete(SensorSettings::class.java) - .where(SensorSettings_Table.id.eq(tag.id)) + .where(SensorSettings_Table.id.eq(sensor.id)) .execute() - tag.delete() + sensor.delete() } fun updateTag(tag: RuuviTagEntity) { diff --git a/app/src/main/java/com/ruuvi/station/database/tables/SensorSettings.kt b/app/src/main/java/com/ruuvi/station/database/tables/SensorSettings.kt index b70f3d621..383cf7086 100644 --- a/app/src/main/java/com/ruuvi/station/database/tables/SensorSettings.kt +++ b/app/src/main/java/com/ruuvi/station/database/tables/SensorSettings.kt @@ -41,7 +41,9 @@ data class SensorSettings( @Column var lastSync: Date? = null, @Column - var networkLastSync: Date? = null + var networkLastSync: Date? = null, + @Column + var networkSensor: Boolean = false ): BaseModel() { val displayName get() = if (name.isNullOrEmpty()) id else name.toString() @@ -81,6 +83,7 @@ data class SensorSettings( humidityOffset = sensor.offsetHumidity pressureOffset = sensor.offsetPressure temperatureOffset = sensor.offsetTemperature + networkSensor = true update() } } \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt b/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt index 1a7203e80..95e370b45 100644 --- a/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt +++ b/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt @@ -10,7 +10,7 @@ object NetworkInjectionModule { val module = Kodein.Module(NetworkInjectionModule.javaClass.name) { bind() with singleton { RuuviNetworkRepository(Dispatchers.IO, instance()) } - bind() with singleton { NetworkTokenRepository(instance()) } + bind() with singleton { NetworkTokenRepository(instance(), instance(), instance()) } bind() with singleton { RuuviNetworkInteractor(instance(), instance(), instance(), instance()) } diff --git a/app/src/main/java/com/ruuvi/station/network/domain/NetworkTokenRepository.kt b/app/src/main/java/com/ruuvi/station/network/domain/NetworkTokenRepository.kt index 60f9a4102..eed284400 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/NetworkTokenRepository.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/NetworkTokenRepository.kt @@ -1,10 +1,15 @@ package com.ruuvi.station.network.domain import com.ruuvi.station.app.preferences.Preferences +import com.ruuvi.station.database.domain.SensorSettingsRepository +import com.ruuvi.station.database.domain.TagRepository import com.ruuvi.station.network.data.NetworkTokenInfo +import kotlinx.coroutines.* class NetworkTokenRepository ( - private val preferences: Preferences + private val preferences: Preferences, + private val sensorSettingsRepository: SensorSettingsRepository, + private val tagRepository: TagRepository ) { fun saveTokenInfo(tokenInfo: NetworkTokenInfo) { setNetworkTokenInfo(tokenInfo) @@ -12,16 +17,28 @@ class NetworkTokenRepository ( fun getTokenInfo(): NetworkTokenInfo? = getNetworkTokenInfo() - fun signOut() { - saveTokenInfo(NetworkTokenInfo("", "")) - preferences.lastSyncDate = Long.MIN_VALUE + fun signOut(finished: ()->Unit) { + CoroutineScope(Dispatchers.IO).launch { + saveTokenInfo(NetworkTokenInfo("", "")) + preferences.lastSyncDate = Long.MIN_VALUE + + val sensors = sensorSettingsRepository.getSensorSettings() + for (sensor in sensors) { + if (sensor.networkSensor) { + tagRepository.deleteSensorAndRelatives(sensor.id) + } + } + withContext(Dispatchers.Main){ + finished() + } + } } private fun getNetworkTokenInfo(): NetworkTokenInfo? { - if (preferences.networkEmail.isEmpty() || preferences.networkToken.isEmpty()) { - return null + return if (preferences.networkEmail.isEmpty() || preferences.networkToken.isEmpty()) { + null } else { - return NetworkTokenInfo(preferences.networkEmail, preferences.networkToken) + NetworkTokenInfo(preferences.networkEmail, preferences.networkToken) } } diff --git a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt index 1b3c9e804..0d0861d4d 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt @@ -96,12 +96,19 @@ class RuuviNetworkInteractor ( try { networkRepository.claimSensor(request, token) { claimResponse -> if (claimResponse?.isSuccess() == true) { - sensorSettingsRepository.setSensorOwner(sensorSettings.id, getEmail() - ?: "") + sensorSettingsRepository.setSensorOwner( + sensorSettings.id, + getEmail() ?: "", + true + ) } else { val maskedEmail = Regex("\\b\\S*@\\S*\\.\\S*\\b").find(claimResponse?.error ?: "")?.value if (maskedEmail?.isNotEmpty() == true) { - sensorSettingsRepository.setSensorOwner(sensorSettings.id, maskedEmail) + sensorSettingsRepository.setSensorOwner( + sensorSettings.id, + maskedEmail, + false + ) } } getUserInfo { diff --git a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt index cf563057c..a69a04df9 100644 --- a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt +++ b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt @@ -345,9 +345,7 @@ class TagDetailsActivity : AppCompatActivity(), KodeinAware { } private fun login(signedIn: Boolean) { - if (!signedIn) { - SignInActivity.start(this) - } else { + if (signedIn) { val builder = AlertDialog.Builder(this) with(builder) { @@ -360,6 +358,8 @@ class TagDetailsActivity : AppCompatActivity(), KodeinAware { } show() } + } else { + SignInActivity.start(this) } } @@ -377,6 +377,7 @@ class TagDetailsActivity : AppCompatActivity(), KodeinAware { } private fun updateMenu(signed: Boolean) { + networkLayout.isVisible = viewModel.userEmail.value?.isNotEmpty() == true val loginMenuItem = navigationView.menu.findItem(R.id.loginMenuItem) loginMenuItem?.let { it.title = if (signed) { @@ -531,7 +532,7 @@ class TagDetailsActivity : AppCompatActivity(), KodeinAware { } override fun getPageTitle(position: Int): String { - return tags[position].displayName.toUpperCase(Locale.getDefault()) + return tags.elementAtOrNull(position)?.displayName?.toUpperCase(Locale.getDefault()) ?: "" } override fun getItemPosition(`object`: Any): Int { diff --git a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt index db84ef87d..2429a9b68 100644 --- a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt +++ b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt @@ -158,6 +158,8 @@ class TagDetailsViewModel( } fun signOut() { - tokenRepository.signOut() + tokenRepository.signOut { + refreshTags() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/tagsettings/domain/TagSettingsInteractor.kt b/app/src/main/java/com/ruuvi/station/tagsettings/domain/TagSettingsInteractor.kt index 9f314f6e1..312e4fd89 100644 --- a/app/src/main/java/com/ruuvi/station/tagsettings/domain/TagSettingsInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/tagsettings/domain/TagSettingsInteractor.kt @@ -27,7 +27,7 @@ class TagSettingsInteractor( fun deleteTagsAndRelatives(tag: RuuviTagEntity) { val sensorId = tag.id.toString() val sensorSettings = sensorSettingsRepository.getSensorSettings(sensorId) - tagRepository.deleteTagsAndRelatives(tag) + tagRepository.deleteSensorAndRelatives(tag) sensorSettings?.owner?.let { owner -> if (sensorSettings.owner == networkInteractor.getEmail()) { networkInteractor.unclaimSensor(sensorId) diff --git a/app/src/main/java/com/ruuvi/station/tagsettings/ui/TagSettingsActivity.kt b/app/src/main/java/com/ruuvi/station/tagsettings/ui/TagSettingsActivity.kt index 56121d87b..47f175c51 100644 --- a/app/src/main/java/com/ruuvi/station/tagsettings/ui/TagSettingsActivity.kt +++ b/app/src/main/java/com/ruuvi/station/tagsettings/ui/TagSettingsActivity.kt @@ -108,7 +108,7 @@ class TagSettingsActivity : AppCompatActivity(), KodeinAware { ) binding.ownerValueTextView.text = sensorSettings?.owner ?: "None" - if (sensorSettings?.owner.isNullOrEmpty()) { + if (sensorSettings?.networkSensor != true) { deleteString = getString(R.string.remove_local_sensor) binding.ownerLayout.isEnabled = true binding.ownerValueTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, getDrawable(R.drawable.ic_baseline_arrow_forward_ios_24), null) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b3a5c6b68..ed3ac4ce4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -250,7 +250,7 @@ Request a Code Submit Sign out - Do you want sign out? + When you sign out, sensors of which ownerships you\'ve claimed on the sensor settings page, will be automatically removed from the app. When you sign in again using the same email address, the sensors will be returned from the cloud.\n\n Do you want sign out? %1$,d %2$s - %1$s dBm From 32ff7e75577ddaf7e5aa32e40ba71b2ab4c4fa9f Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Tue, 31 Aug 2021 18:49:57 +0300 Subject: [PATCH 02/33] ISSUE #452 Unification: rename Ruuvi Network to Ruuvi cloud --- app/src/main/res/values-fi/strings.xml | 12 ++++++------ app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values/strings.xml | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index cc88d6dc1..0e81436a7 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -58,7 +58,7 @@ Historiatietojen kerääminen toimii parhaiten taustaskannauksen ollessa käytössä. Haluatko ottaa käyttöön taustaskannauksen? Omistatko tämän anturin? Vahvista omistajuus ja anturi lisätään Ruuvi-tilillesi. Jokaisella Ruuvi-anturilla voi olla vain yksi omistaja.\n\nHyödyt:\n\n ● Anturien nimet, taustakuvat, kalibrointi- ja hälytystiedot turvallisesta pilvipalvelusta\n\n ● Lue anturitiedot etänä verkossa (vaatii Ruuvi Gateway -reitittimen)\n\n ● Jaa antureita ystävien ja perheen kesken (vaatii Ruuvi Gateway -reitittimen)\n\n ● Jopa 2 vuoden historiatiedot osoitteesta station.ruuvi.com (vaatii Ruuvi Gateway -reitittimen) - VAHVISTA OMISTAJUUS + Vahvista Omistajuus Vahvista omistajuus Pyyhi Tyhjennetäänkö sovellukseen tallennetut historiatiedot? @@ -123,8 +123,8 @@ Français Русский Svenska - Hyödynnä kaikki Ruuvi Network mahdollisuudet! Kirjaudu sisään tai luo uusi Ruuvi-käyttäjätili antamalla sähköpostiosoitteesi. - Kirjaudu\nRuuvi\nNetworkiin + Hyödynnä Ruuvi-pilvipalvelun mahdollisuudet! Kirjaudu sisään tai luo uusi Ruuvi-käyttäjätili antamalla sähköpostiosoitteesi. + Kirjaudu\nRuuvi\ncloudiin MAC-osoite MAC-osoite kopioitu leikepöydälle Mittausjärjestysnumero @@ -141,7 +141,7 @@ Sulje siirtymisvalikko Avaa siirtymisvalikko Voit jakaa vain Ruuvi Gateway -reitittimen läheisyydessä olevia antureita. Lisätietoja reitittimestä osoitteesta ruuvi.com - Ruuvi Networkin tila + Ruuvi cloudin tila Synkronointi epäonnistui: %1$s Synkronointi epäonnistui: kirjaudu ensin Synkronointi onnistui! @@ -249,7 +249,7 @@ Pyydä kirjautumiskoodi Lähetä Kirjaudu ulos - Haluatko varmasti kirjautua ulos? + Anturit, joiden omistajuuden olet vahvistanut asetussivulla poistetaan sovelluksesta automaattisesti uloskirjauduttaessa. Anturitiedot palautetaan pilvipalvelusta samalla sähköpostiosoitteella uudelleenkirjauduttaessa.\n\n Haluatko varmasti kirjautua ulos? %1$,d %2$s - %1$s dBm @@ -263,7 +263,7 @@ Synkronoidaan Anturin nimi Anturia ei löydetty. Onko laite lähettyvillä? - Lukitse + Vahvista VERKON TIEDOT Omistaja Poista diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2c2459ebe..1bb25d772 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -121,7 +121,7 @@ Русский Svenska Чтобы воспользоваться всеми функциями, создайте аккаунт или войдите в существующий. Пожалуйста, введите ваш email. - Войти в\nRuuvi\nNetwork + Войти в\nRuuvi\ncloud MAC адрес MAC адрес скопирован в буфер обмена Порядковый Номер Измерения diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ed3ac4ce4..07e49eedd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -59,7 +59,7 @@ Charts feature works best with background scanning enabled. Would you like to enable background scanning? Do you own this sensor? If yes, please claim ownership of the sensor and it\'ll be added to your Ruuvi account. Every Ruuvi sensor can have only one owner.\n\nBenefits:\n\n ● Sensor names, background images, offsets and alert settings will be securely stored in the cloud\n\n ● Access sensors remotely over the Internet (requires a Ruuvi Gateway)\n\n ● Share sensors with friends and family (requires a Ruuvi Gateway)\n\n ● Browse up to 2 years of history on station.ruuvi.com (requires a Ruuvi Gateway) - CLAIM OWNERSHIP + Claim Ownership Claim sensor Clear Clear the historical data from the app? @@ -125,7 +125,7 @@ Русский Svenska To enjoy all the features, create an account or login to your existing Ruuvi account by entering your email address. - Login to\nRuuvi\nNetwork + Login to\nRuuvi\ncloud MAC Address MAC address copied to clipboard Measurement Sequence Number @@ -142,7 +142,7 @@ Close the navigation drawer Open the navigation drawer Only sensors within range of your Ruuvi Gateway can be shared. If you don\'t have one, get it on ruuvi.com - Ruuvi Network status + Ruuvi Cloud status Synchronization failed: %1$s Synchronization failed: need to log in first Synchronized successfully! From 2b7a77a5c3b7b5b7ff2266b5807deb2aeda528d2 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Tue, 31 Aug 2021 18:51:22 +0300 Subject: [PATCH 03/33] ISSUE #452 Unification: rename Ruuvi Network to Ruuvi cloud --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 07e49eedd..93f45a116 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -142,7 +142,7 @@ Close the navigation drawer Open the navigation drawer Only sensors within range of your Ruuvi Gateway can be shared. If you don\'t have one, get it on ruuvi.com - Ruuvi Cloud status + Ruuvi cloud status Synchronization failed: %1$s Synchronization failed: need to log in first Synchronized successfully! From f0ba0ed3843f439f004d85c593ea704901a9e277 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Tue, 31 Aug 2021 18:54:05 +0300 Subject: [PATCH 04/33] version bump --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 671c304fb..9ff2c367f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15033 - versionName "1.5.33" + versionCode 15034 + versionName "1.5.34" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } From 0085a5dd449148f4adbe44ab548243a74b873876 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Wed, 1 Sep 2021 23:15:31 +0300 Subject: [PATCH 05/33] ISSUE #469 Refresh cloud data automatically and simplify the menu --- .../station/app/RuuviScannerApplication.kt | 11 +---- .../station/dashboard/ui/DashboardActivity.kt | 43 +------------------ .../ui/DashboardActivityViewModel.kt | 4 -- .../domain/NetworkDataSyncInteractor.kt | 27 ++++++++++++ .../tagdetails/ui/TagDetailsActivity.kt | 43 +------------------ .../tagdetails/ui/TagDetailsViewModel.kt | 4 -- app/src/main/res/layout/navigation_drawer.xml | 41 ++++++------------ app/src/main/res/values-fi/strings.xml | 14 +++--- app/src/main/res/values-fr/strings.xml | 9 +--- app/src/main/res/values-ru/strings.xml | 9 ++-- app/src/main/res/values-sv/strings.xml | 11 ++--- app/src/main/res/values/strings.xml | 23 +++++----- 12 files changed, 71 insertions(+), 168 deletions(-) diff --git a/app/src/main/java/com/ruuvi/station/app/RuuviScannerApplication.kt b/app/src/main/java/com/ruuvi/station/app/RuuviScannerApplication.kt index 34fd556f4..03898a5d1 100644 --- a/app/src/main/java/com/ruuvi/station/app/RuuviScannerApplication.kt +++ b/app/src/main/java/com/ruuvi/station/app/RuuviScannerApplication.kt @@ -52,13 +52,14 @@ class RuuviScannerApplication : Application(), KodeinAware { override fun onBecameForeground() { isInForeground = true defaultOnTagFoundListener.isForeground = true - updateNetwork() + networkDataSyncInteractor.startAutoRefresh() runtimeBehavior.refreshFeatureFlags() } override fun onBecameBackground() { isInForeground = false defaultOnTagFoundListener.isForeground = false + networkDataSyncInteractor.stopAutoRefresh() } } @@ -89,8 +90,6 @@ class RuuviScannerApplication : Application(), KodeinAware { foreground.addListener(listener) setupExperimentalFeatures() - - updateNetwork() } private fun setupDependencyInjection() { @@ -111,10 +110,4 @@ class RuuviScannerApplication : Application(), KodeinAware { runtimeFeatureFlagProvider.setFeatureEnabled(FeatureFlag.RUUVI_NETWORK, true) } } - - private fun updateNetwork() { - if (networkInteractor.signedIn && Date(preferencesRepository.getLastSyncDate()).diffGreaterThan(60*1000)) { - networkDataSyncInteractor.syncNetworkData() - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt b/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt index c680a49a5..eb1b2f439 100644 --- a/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt +++ b/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt @@ -153,33 +153,6 @@ class DashboardActivity : AppCompatActivity(), KodeinAware { return@setNavigationItemSelectedListener true } - syncLayout.setOnClickListener { - viewModel.networkDataSync() - } - - viewModel.syncResultObserve.observe(this) {syncResult -> - val message = when (syncResult.type) { - NetworkSyncResultType.NONE -> "" - NetworkSyncResultType.SUCCESS -> getString(R.string.network_sync_result_success) - NetworkSyncResultType.EXCEPTION -> getString(R.string.network_sync_result_exception, syncResult.errorMessage) - NetworkSyncResultType.NOT_LOGGED -> getString(R.string.network_sync_result_not_logged) - } - if (message.isNotEmpty()) { - Snackbar.make(mainDrawerLayout, message, Snackbar.LENGTH_SHORT).show() - viewModel.syncResultShowed() - } - } - - viewModel.syncInProgressObserve.observe(this) { - if (it) { - Timber.d("Sync in progress") - syncNetworkButton.startAnimation(AnimationUtils.loadAnimation(this, R.anim.rotate_indefinitely)) - } else { - Timber.d("Sync not in progress") - syncNetworkButton.clearAnimation() - } - } - viewModel.userEmail.observe(this) { var user = it if (user.isNullOrEmpty()) { @@ -189,21 +162,7 @@ class DashboardActivity : AppCompatActivity(), KodeinAware { signedIn = true } updateMenu(signedIn) - loggedUserTextView.text = getString(R.string.network_user, user) - } - - viewModel.syncStatus.observe(this) {syncStatus-> - if (syncStatus.syncInProgress) { - syncStatusTextView.text = getString(R.string.connected_reading_info) - } else { - val lastSyncString = - if (syncStatus.lastSync == Long.MIN_VALUE) { - getString(R.string.never) - } else { - Date(syncStatus.lastSync).describingTimeSince(this) - } - syncStatusTextView.text = getString(R.string.network_synced, lastSyncString) - } + loggedUserTextView.text = user } } diff --git a/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivityViewModel.kt b/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivityViewModel.kt index 9b7d7f073..bfaa81033 100644 --- a/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivityViewModel.kt +++ b/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivityViewModel.kt @@ -74,10 +74,6 @@ class DashboardActivityViewModel( } } - fun networkDataSync() { - networkDataSyncInteractor.syncNetworkData() - } - fun syncResultShowed() { networkDataSyncInteractor.syncStatusShowed() } diff --git a/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt b/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt index bd29f9463..c163b64ec 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt @@ -43,12 +43,39 @@ class NetworkDataSyncInteractor ( @Volatile private var syncJob: Job? = null + @Volatile + private var autoRefreshJob: Job? = null + private val syncResult = MutableStateFlow (NetworkSyncResult(NetworkSyncResultType.NONE)) val syncResultFlow: StateFlow = syncResult private val syncInProgress = MutableStateFlow (false) val syncInProgressFlow: StateFlow = syncInProgress + fun startAutoRefresh() { + Timber.d("startAutoRefresh") + if (autoRefreshJob != null && autoRefreshJob?.isActive == true) { + Timber.d("Already in auto refresh mode") + return + } + + autoRefreshJob = CoroutineScope(IO).launch { + while (true) { + Timber.d("Cloud auto refresh another round") + if (networkInteractor.signedIn && + Date(preferencesRepository.getLastSyncDate()).diffGreaterThan(60*1000)) { + syncNetworkData() + } + delay(65 * 1000) + } + } + } + + fun stopAutoRefresh() { + Timber.d("stopAutoRefresh") + autoRefreshJob?.cancel() + } + fun syncNetworkData() { if (syncJob != null && syncJob?.isActive == true) { Timber.d("Already in sync mode") diff --git a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt index a69a04df9..a20a1c251 100644 --- a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt +++ b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt @@ -290,33 +290,6 @@ class TagDetailsActivity : AppCompatActivity(), KodeinAware { return@setNavigationItemSelectedListener true } - syncLayout.setOnClickListener { - viewModel.networkDataSync() - } - - viewModel.syncResultObserve.observe(this) {syncResult -> - val message = when (syncResult.type) { - NetworkSyncResultType.NONE -> "" - NetworkSyncResultType.SUCCESS -> getString(R.string.network_sync_result_success) - NetworkSyncResultType.EXCEPTION -> getString(R.string.network_sync_result_exception, syncResult.errorMessage) - NetworkSyncResultType.NOT_LOGGED -> getString(R.string.network_sync_result_not_logged) - } - if (message.isNotEmpty()) { - Snackbar.make(mainDrawerLayout, message, Snackbar.LENGTH_SHORT).show() - viewModel.syncResultShowed() - } - } - - viewModel.syncInProgressObserve.observe(this) { - if (it) { - Timber.d("Sync in progress") - syncNetworkButton.startAnimation(AnimationUtils.loadAnimation(this, R.anim.rotate_indefinitely)) - } else { - Timber.d("Sync not in progress") - syncNetworkButton.clearAnimation() - } - } - viewModel.userEmail.observe(this) { var user = it if (user.isNullOrEmpty()) { @@ -326,21 +299,7 @@ class TagDetailsActivity : AppCompatActivity(), KodeinAware { signedIn = true } updateMenu(signedIn) - loggedUserTextView.text = getString(R.string.network_user, user) - } - - viewModel.syncStatus.observe(this) {syncStatus -> - if (syncStatus.syncInProgress) { - syncStatusTextView.text = getString(R.string.connected_reading_info) - } else { - val lastSyncString = - if (syncStatus.lastSync == Long.MIN_VALUE) { - getString(R.string.never) - } else { - Date(syncStatus.lastSync).describingTimeSince(this) - } - syncStatusTextView.text = getString(R.string.network_synced, lastSyncString) - } + loggedUserTextView.text = user } } diff --git a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt index 2429a9b68..3d37cc1ba 100644 --- a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt +++ b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt @@ -143,10 +143,6 @@ class TagDetailsViewModel( } } - fun networkDataSync() { - networkDataSyncInteractor.syncNetworkData() - } - fun syncResultShowed() { networkDataSyncInteractor.syncStatusShowed() } diff --git a/app/src/main/res/layout/navigation_drawer.xml b/app/src/main/res/layout/navigation_drawer.xml index e563eba4a..925451522 100644 --- a/app/src/main/res/layout/navigation_drawer.xml +++ b/app/src/main/res/layout/navigation_drawer.xml @@ -14,8 +14,9 @@ android:background="@android:color/white" > + app:layout_constraintBottom_toBottomOf="parent" + tools:layout_editor_absoluteX="0dp"> + + android:layout_marginLeft="16dp" + android:layout_marginRight="16dp" + android:text="@string/logged_in" + android:textStyle="bold" /> + - - - - + android:layout_marginLeft="16dp" + android:layout_marginRight="16dp" + tools:text="@string/network_user" /> diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 0e81436a7..79c5db2e1 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -123,8 +123,8 @@ Français Русский Svenska - Hyödynnä Ruuvi-pilvipalvelun mahdollisuudet! Kirjaudu sisään tai luo uusi Ruuvi-käyttäjätili antamalla sähköpostiosoitteesi. - Kirjaudu\nRuuvi\ncloudiin + Hyödyntääksesi kaikkia sovelluksen ominaisuuksia, kirjaudu sisään tai luo uusi ilmainen Ruuvi-käyttäjätili antamalla sähköpostiosoitteesi. + Kirjaudu\nRuuvi\nStationiin MAC-osoite MAC-osoite kopioitu leikepöydälle Mittausjärjestysnumero @@ -141,14 +141,14 @@ Sulje siirtymisvalikko Avaa siirtymisvalikko Voit jakaa vain Ruuvi Gateway -reitittimen läheisyydessä olevia antureita. Lisätietoja reitittimestä osoitteesta ruuvi.com - Ruuvi cloudin tila + Ruuvin pilven tila Synkronointi epäonnistui: %1$s Synkronointi epäonnistui: kirjaudu ensin Synkronointi onnistui! Synkronoitu: %1$s - Synkronoidaan… + Synkronoidaan... Käyttäjä: %1$s - koskaan + ei koskaan Ei Uusia mittaustietoja ei saatavilla ei kirjautunut @@ -240,7 +240,7 @@ Haluatko lopettaa anturin jakamisen käyttäjälle %1$s? Kirjaudu sisään Sinut merkitään lähelläsi olevien Ruuvi-anturien omistajaksi sisäänkirjautumisen yhteydessä. Kaikki omistajan vaatimat anturit palautetaan verkosta sovelluksen uudelleenasennuksen yhteydessä.\n\nRuuvi Gatewayn avulla voit tarkastella omistamiasi antureita etänä ja jakaa niitä ystävillesi verkossa. - Ruuvi Networkin etuja + Ruuvin pilvipalvelun etuja Tarkasta aktivointikoodi saamastasi sähköpostista. Koodi Sähköposti lähetetty @@ -263,7 +263,7 @@ Synkronoidaan Anturin nimi Anturia ei löydetty. Onko laite lähettyvillä? - Vahvista + Vahvista omistajuus VERKON TIEDOT Omistaja Poista diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d6c985bcb..3943fc6bf 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -119,8 +119,8 @@ Français Русский Svenska - Profitez de tous les avantages du Ruuvi Network ! Connectez-vous ou créez votre compte en entrant votre adresse mail. - Connexion \nRuuvi\nNetwork + Profitez de tous les avantages du Ruuvi Station! Connectez-vous ou créez votre compte en entrant votre adresse mail. + Connexion \nRuuvi\nStation Adresse MAC Adreesse MAC copiée dans le presse-papiers Numéro de séquence @@ -137,7 +137,6 @@ Fermer le menu Ouvrir le menu Vous pouvez partager seulement des capteurs à proximité du Ruuvi Gateway. Plus d\'infos sur ruuvi.com - Statut du Ruuvi Network Echec de la synchronisation : %1$s Echec de la synchronisation : veuillez vous connecter Synchronisation réussie! @@ -225,13 +224,11 @@ Partager Ajouter un ami Le capteur est déjà partagé - Pour partager votre capteur, veuillez ajouter l\'adresse mail des destinataires (maximum 10). Envoyer Partager le capteur Voulez-vous arrêter le partage du capteur avec %1$s ? Connexion Après la connexion, vous serez automatiquement propriétaire des RuuviTags à proximité. Les capteurs couplés seront réinitialisés si vous réinstallez l\'application.\n\ Avec un routeur Ruuvi Gateway vous pourrez contrôlez vos capteurs à distance et partager vos données avec vos amis. - Avantages du Ruuvi Network Le code d\'activation vous a été envoyé par mail. Code Email envoyé @@ -240,7 +237,6 @@ Obtenir un code Envoyer Déconnexion - Souhaitez-vous vous déconnecter ? %1$,d %2$s - %1$s dBm @@ -252,7 +248,6 @@ Synchronisation Nom du capteur Capteur introuvable. Le capteur est-il à proximité ? - Coupler RÉSEAU Propriétaire Supprimer le capteur diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1bb25d772..2a3b9ce5d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -120,8 +120,9 @@ Français Русский Svenska + Пользователь: Чтобы воспользоваться всеми функциями, создайте аккаунт или войдите в существующий. Пожалуйста, введите ваш email. - Войти в\nRuuvi\ncloud + Войти в\nRuuvi\nStation MAC адрес MAC адрес скопирован в буфер обмена Порядковый Номер Измерения @@ -143,7 +144,7 @@ Ошибка синхронизации: необходимо залогиниться вначале Синхронизировано успешно! Синхронизировано: %1$s - Синхронизация… + Синхронизация... Пользователь: %1$s никогда Нет @@ -227,13 +228,11 @@ Поделиться Добавить друга Поделились - Поделитесь показаниями своего датчика. Добавьте адреса своих друзей (10 максимум) Отправить Поделиться датчиком Ruuvi Хотите перестать делиться показаниями датчика с %1$s? Войти После входа в систему вы будете автоматически отмечены как владелец ближайших сенсоров Ruuvi. Заявленные сенсоры будут восстановлены после повторной установки приложения.\n\nС помощью Ruuvi Gateway вы сможете удаленно контролировать заявленные сенсоры и делиться ими со своими друзьями. - Преимущества Ruuvi Network Пожалуйста, проверьте email для дальнейших инструкций Код для входа Email отправлен @@ -242,7 +241,6 @@ Запросить код Отправить Выйти из сети - Хотите выйти из сети? %1$,d %2$s - %1$s дБм @@ -255,7 +253,6 @@ Обмениваюсь Имя Датчик не найден - Мой сенсор Данные сети Владелец Удалить сенсор diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 0d9689e61..b5bdc26ca 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -119,8 +119,8 @@ Français Русский Svenska - Dra full nytta av Ruuvi Network! Logga in eller skapa ett nytt Ruuvi-konto genom att ange din e-postadress. - Logga in till\nRuuvi\nNetwork + Dra full nytta av Ruuvi Station! Logga in eller skapa ett nytt Ruuvi-konto genom att ange din e-postadress. + Logga in till\nRuuvi\nStation MAC Adress MAC-adressen kopierad till urklippet Mätningssekvensnummer @@ -137,12 +137,11 @@ Stäng navigationslådan Öppna navigationslådan Endast sensorer inom räckhåll av din Ruuvi Gateway kan delas. Mer information finns på ruuvi.com - Ruuvi Network status Synkroniseringen misslyckades: %1$s Synkroniseringen misslyckades: du måste vara inloggad Synkroniseringen lyckades! Synkroniserat: %1$s - Synkroniserar + Synkroniserar... Användare: %1$s aldrig Nej @@ -225,13 +224,11 @@ Dela Lägg till vän Sensorn är redan delad - Dela din Ruuvi sensor. Lägg till dina vänners e-postadresser (max 10). Skicka Dela sensor Vill du sluta dela sensorn med %1$s? Logga in Efter inloggning markeras du automatiskt som ägare till dina närliggande Ruuvi-sensorer. Sensorernas ägare kommer att återställas om appen installerats om igen.\n\nMed en Ruuvi Gateway kan du övervaka dina sensorer på distans och dele dem med dina vänner. - Fördelar med Ruuvi Network Kontrollera din e-post efter en aktiveringskod. Kod E-post skickat @@ -240,7 +237,6 @@ Begär en inloggningskod Skicka Logga ut - Vill du logga ut? %1$,d %2$s - %1$s dBm @@ -252,7 +248,6 @@ Synkroniserar Sensornamn Sensorn hittades inte, är den innom räckvidd? - Bli ägare NÄTVERKSINFO Ägare Ta bort sensor diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 93f45a116..7fccbd3b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -124,8 +124,9 @@ Français Русский Svenska - To enjoy all the features, create an account or login to your existing Ruuvi account by entering your email address. - Login to\nRuuvi\ncloud + Logged in: + To enjoy all the features, create a free account or login to your existing Ruuvi account by entering your email address. + Login to\nRuuvi\nStation MAC Address MAC address copied to clipboard Measurement Sequence Number @@ -143,11 +144,11 @@ Open the navigation drawer Only sensors within range of your Ruuvi Gateway can be shared. If you don\'t have one, get it on ruuvi.com Ruuvi cloud status - Synchronization failed: %1$s - Synchronization failed: need to log in first - Synchronized successfully! - Synchronized: %1$s - Syncing… + Synchronisation failed: %1$s + Synchronisation failed: need to log in first + Synchronised successfully! + Synchronised: %1$s + Syncing... User: %1$s never No @@ -193,7 +194,7 @@ Shared Settings If you experience any issues with background scanning you should disable battery optimization for Ruuvi Station. This procedure may vary depending on your device vendor, model and Android version. - Go to Android Settings -> Apps -> Ruuvi Station -> Battery -> Battery Optimization and select Don\'t Optimize for Ruuvi Station + Go to Android Settings -> Apps -> Ruuvi Station -> Battery -> Battery Optimization and select Don\'t Optimise for Ruuvi Station On Huawei devices go to Android Settings -> Apps -> Ruuvi Station -> Power usage details -> App launch. Disable Manage Automatically and enable options: Auto-Launch, Secondary Launch and Run in background. On Samsung devices go to Android Settings -> Battery -> App power saving detail and set option \'Turned off\' for Ruuvi Station. On Samsung devices go to Android Settings -> Device Maintenance (or Device Care) -> Battery. Disable Put unused apps to sleep. Disable Auto-disable unused apps. Remove Ruuvi Station from the list of sleeping apps. Disable background restrictions for Ruuvi Station. @@ -237,11 +238,11 @@ Already shared You can share the sensor with friends and family if it\'s in range of a Ruuvi Gateway.\n\nReceiver will be notified by email. If the receiver doesn\'t have a Ruuvi account, a free Ruuvi account will be automatically created at first log in.\n\nNote that sensor\'s custom name and background image will be shared. The name and image sync is one time and they can be customised by the receiver. Offset values (if any) will be automatically synced, and the receiver will always see the corrected values. Send - Share Ruuvi sensor + Share sensor Do you want to unshare sensor for %1$s? Sign in After signing in, you will be automatically marked as an owner of your nearby Ruuvi sensors. The claimed sensors will be restored after an app re-install.\n\nWith a Ruuvi Gateway router, you\'ll be able to monitor the claimed sensors remotely and share them with your friends. - Benefits of Ruuvi Network + Benefits of the Ruuvi cloud service Check your email for an activation code. Code Email sent @@ -264,7 +265,7 @@ Synchronizing Name Sensor not found, is it in range? - Claim + Claim ownership NETWORK INFO Owner Remove sensor From 7afd90624a01bcc1b29a746d8b42e7d68614f29f Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Wed, 1 Sep 2021 23:29:01 +0300 Subject: [PATCH 06/33] version bump --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9ff2c367f..20b79f314 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15034 - versionName "1.5.34" + versionCode 15035 + versionName "1.5.35" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } From 23b4ee32071b2c3394ba0dd55a3c5973ef6b6d3a Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Thu, 2 Sep 2021 23:39:28 +0300 Subject: [PATCH 07/33] ISSUE #443 Remove sensor automatically from the app if owner cancelled sharing --- .../data/response/RuuviNetworkResponse.kt | 3 +- .../domain/NetworkDataSyncInteractor.kt | 7 ++ .../network/domain/RuuviNetworkInteractor.kt | 2 +- .../network/domain/RuuviNetworkRepository.kt | 4 +- app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values/strings.xml | 76 +++++++++---------- 6 files changed, 51 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/com/ruuvi/station/network/data/response/RuuviNetworkResponse.kt b/app/src/main/java/com/ruuvi/station/network/data/response/RuuviNetworkResponse.kt index 8ceca2923..da2b90792 100644 --- a/app/src/main/java/com/ruuvi/station/network/data/response/RuuviNetworkResponse.kt +++ b/app/src/main/java/com/ruuvi/station/network/data/response/RuuviNetworkResponse.kt @@ -3,7 +3,8 @@ package com.ruuvi.station.network.data.response data class RuuviNetworkResponse ( val result: String, val error: String, - val data: T? + val data: T?, + val code: String? ) { fun isSuccess() = result == successResult diff --git a/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt b/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt index c163b64ec..4675f6240 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt @@ -249,6 +249,13 @@ class NetworkDataSyncInteractor ( setSensorImage(sensor, sensorSettings) } } + + val sensors = sensorSettingsRepository.getSensorSettings() + for (sensor in sensors) { + if (sensor.networkSensor && userInfoData.sensors.none { it.sensor == sensor.id }) { + tagRepository.deleteSensorAndRelatives(sensor.id) + } + } } private suspend fun setSensorImage(sensor: SensorDataResponse, sensorSettings: SensorSettings) { diff --git a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt index 0d0861d4d..cb9acb920 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt @@ -117,7 +117,7 @@ class RuuviNetworkInteractor ( } } catch (e: Exception) { withContext(Dispatchers.Main) { - onResult(ClaimSensorResponse(RuuviNetworkResponse.errorResult, e.message.toString(), null)) + onResult(ClaimSensorResponse(RuuviNetworkResponse.errorResult, e.message.toString(), null, null)) } } } diff --git a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkRepository.kt b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkRepository.kt index c3fa038be..5f2694749 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkRepository.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkRepository.kt @@ -59,7 +59,7 @@ class RuuviNetworkRepository result = errorResponse } } catch (e: Exception) { - result = UserRegisterResponse(result = RuuviNetworkResponse.errorResult, error = e.message.orEmpty(), data = null) + result = UserRegisterResponse(result = RuuviNetworkResponse.errorResult, error = e.message.orEmpty(), data = null, code = null) } withContext(Dispatchers.Main) { @@ -81,7 +81,7 @@ class RuuviNetworkRepository result = errorResponse } } catch (e: Exception) { - result = UserVerifyResponse(result = RuuviNetworkResponse.errorResult, error = e.message.orEmpty(), data = null) + result = UserVerifyResponse(result = RuuviNetworkResponse.errorResult, error = e.message.orEmpty(), data = null, code = null) } withContext(Dispatchers.Main) { onResult(result) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 79c5db2e1..3893a25ac 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -123,6 +123,7 @@ Français Русский Svenska + Kirjautunut: Hyödyntääksesi kaikkia sovelluksen ominaisuuksia, kirjaudu sisään tai luo uusi ilmainen Ruuvi-käyttäjätili antamalla sähköpostiosoitteesi. Kirjaudu\nRuuvi\nStationiin MAC-osoite diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7fccbd3b3..b18dcf9db 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,21 +12,21 @@ Disable this alarm Movement Alert when sensor is moved - Air Humidity too high! - Air Humidity too low! + Air Humidity is too high! + Air Humidity is too low! Movement detected! Air Pressure is too high! Air Pressure is too low! - Signal strength too high! - Signal strength too low! - Temperature too high! - Temperature too low! + Signal strength is too high! + Signal strength is too low! + Temperature is too high! + Temperature is too low! Off Alert when less than %1$,d or more than %2$,d ALERTS Ruuvi Station BACKGROUND\nIMAGE - You can disable background scanning in settings + You can disable background scanning in Settings Scanning every Battery Voltage beta @@ -38,13 +38,13 @@ ruuvi.com/support http://ruuvi.com/support Calibration done! - Enter humidity value expected from sensor in current conditions (%1$s): - Enter pressure value expected from sensor in current conditions (%1$s): - Enter temperature value expected from sensor in current conditions (%1$s): + Enter the expected humidity value from sensor under current conditions (%1$s): + Enter the expected pressure value from sensor under current conditions (%1$s): + Enter the expected temperature value from sensor under current conditions (%1$s): %1$d%% -> 75%% - In order to measure relative humidity as accurately as possible, a sodium chloride (salt) calibration is recommended. See video tutorials on how to easily do it at home. + In order to measure relative humidity as accurately as possible, a sodium chloride (salt) calibration is recommended. See video tutorials on how to easily do this at home. Calibrate hygrometer - Note that calibration data will be stored locally in your mobile device. After Ruuvi Station uninstall \u0026 install, you may need to recalibrate. + Note that calibration data will be stored locally in your mobile device. After Ruuvi Station uninstall and install, you may need to recalibrate. video tutorials https://www.youtube.com/results?search_query=hygrometer+salt+calibration Humidity offset @@ -58,17 +58,17 @@ Cancel Charts feature works best with background scanning enabled. Would you like to enable background scanning? - Do you own this sensor? If yes, please claim ownership of the sensor and it\'ll be added to your Ruuvi account. Every Ruuvi sensor can have only one owner.\n\nBenefits:\n\n ● Sensor names, background images, offsets and alert settings will be securely stored in the cloud\n\n ● Access sensors remotely over the Internet (requires a Ruuvi Gateway)\n\n ● Share sensors with friends and family (requires a Ruuvi Gateway)\n\n ● Browse up to 2 years of history on station.ruuvi.com (requires a Ruuvi Gateway) + Do you own this sensor? If yes, please claim ownership of the sensor and it\'ll be added to your Ruuvi account. Every Ruuvi sensor can have only one owner.\n\nBenefits:\n\n ● Sensor names, background images, offsets and alert settings will be securely stored in the Cloud\n\n ● Access sensors remotely over the Internet (requires a Ruuvi Gateway)\n\n ● Share sensors with friends and family (requires a Ruuvi Gateway)\n\n ● Browse up to 2 years of history on station.ruuvi.com (requires a Ruuvi Gateway) Claim Ownership Claim sensor Clear Clear the historical data from the app? Close Confirm - Synchronizing... + Synchronising... Connecting... Dashboard - Use dashboard view to see multiple sensors at a glance. Restart the app after enabled. + Use dashboard view to see multiple sensors at a glance. Restart the app after enabling it. Your dashboard \nis empty Data Format Disabled @@ -79,7 +79,7 @@ Disconnected Email EXPORT - Sensor %1$s csv export + Sensor %1$s CSV export .csv created, opening share menu Failed to create CSV file Timestamp,Temperature (%1$s), Humidity (%2$s), Pressure (%3$s),RSSI @@ -87,22 +87,22 @@ Timestamp,Temperature (%1$s), Humidity (%2$s), Pressure (%3$s),RSSI,Acceleration X,Acceleration Y,Acceleration Z,Voltage,Movement counter,Measurement sequence number File type not supported Gallery - Nope, did not work. Is the URL correct? - Nope, did not work. Response code: %1$d + Nope, it did not work. Is the URL correct? + Nope, it did not work. Response code: %1$d Data forwarding works! Response code: %1$d Testing... General h - Ruuvi Station is an easy-to-use but powerful tool to supercharge your Ruuvi sensors. Just add some sensors and you\'re ready to go. + Ruuvi Station is an easy-to-use but powerful tool to supercharge your Ruuvi sensors. Simply add some sensors and you\'re ready to go. ABOUT / HELP Added sensors: %1$,d Stored measurements: %1$,d Database size: %1$,d kB Ruuvi\'s website: ruuvi.com\nRuuvi Forum: f.ruuvi.com\nRuuvi Blog: blog.ruuvi.com\nRuuvi on Twitter: twitter.com/ruuvicom MORE TO READ - Just like Ruuvi sensor, Ruuvi Station is also open-source: github.com/ruuvi + Just like Ruuvi sensors, Ruuvi Station is also open-source: github.com/ruuvi OPEN-SOURCE - We\'ve designed the app to be self-explanatory but also comprehensive manuals are available for both Ruuvi sensors and Ruuvi Station: ruuvi.com/manuals + We\'ve designed the app to be self-explanatory but comprehensive manuals are also available for both Ruuvi sensors and Ruuvi Station: ruuvi.com/manuals OPERATIONS MANUAL By using the application, you accept Ruuvi\'s standard terms and conditions\nruuvi.com/terms PRIVACY POLICY @@ -142,7 +142,7 @@ NAME Close the navigation drawer Open the navigation drawer - Only sensors within range of your Ruuvi Gateway can be shared. If you don\'t have one, get it on ruuvi.com + Only sensors within range of your Ruuvi Gateway can be shared. If you don\'t have one yet, get it on ruuvi.com Ruuvi cloud status Synchronisation failed: %1$s Synchronisation failed: need to log in first @@ -157,10 +157,10 @@ Offset correction OK Enable Background Scanning - In order to scan nearby Bluetooth devices in the background, Android requires background location access to be enabled. \n\nPlease click allow all the time if you\'d like to use the background scanning feature. \n\nRuuvi doesn\'t track your movements. You\'re safe. + In order to scan nearby Bluetooth devices in the background, Android requires background location access to be enabled. \n\nPlease click \'allow all the time\' if you\'d like to use the background scanning feature. \n\nRuuvi doesn\'t track your movements. You\'re safe. In order to scan nearby Bluetooth devices, Android requires location access to be enabled. \n\nRuuvi doesn\'t track your movements. You\'re safe. Enable Bluetooth Scanning - Please enable location permission in settings to see sensors. + Please enable location permission in Settings to see sensors. No sensors added,\npress here to add sensors Pressure Hectopascal (hPa) @@ -179,7 +179,7 @@ Remove By removing the sensor, your sensor ownership status will be revoked. After removal, someone else can claim ownership of the sensor. Every Ruuvi sensor can have only one owner. Do you want to remove the sensor? You can add it again later, if needed. - If you remove the sensor, owner of the sensor will be notified and you cannot access the sensor anymore. + If you remove the sensor, the owner of the sensor will be notified and you cannot access the sensor anymore. Remove this sensor Signal strength (RSSI) s @@ -194,10 +194,10 @@ Shared Settings If you experience any issues with background scanning you should disable battery optimization for Ruuvi Station. This procedure may vary depending on your device vendor, model and Android version. - Go to Android Settings -> Apps -> Ruuvi Station -> Battery -> Battery Optimization and select Don\'t Optimise for Ruuvi Station - On Huawei devices go to Android Settings -> Apps -> Ruuvi Station -> Power usage details -> App launch. Disable Manage Automatically and enable options: Auto-Launch, Secondary Launch and Run in background. + Go to Android Settings -> Apps -> Ruuvi Station -> Battery -> Battery Optimization and select \'Don\'t Optimise for Ruuvi Station\' + On Huawei devices go to Android Settings -> Apps -> Ruuvi Station -> Power usage details -> App launch. Disable \'Manage Automatically\' and enable options: \'Auto-Launch\', \'Secondary Launch\' and \'Run in background\'. On Samsung devices go to Android Settings -> Battery -> App power saving detail and set option \'Turned off\' for Ruuvi Station. - On Samsung devices go to Android Settings -> Device Maintenance (or Device Care) -> Battery. Disable Put unused apps to sleep. Disable Auto-disable unused apps. Remove Ruuvi Station from the list of sleeping apps. Disable background restrictions for Ruuvi Station. + On Samsung devices go to Android Settings -> Device Maintenance (or Device Care) -> Battery. Disable \'Put unused apps to sleep\'. Disable \'Auto-disable unused apps\'. Remove Ruuvi Station from the list of sleeping apps. Disable background restrictions for Ruuvi Station. Background scan important note On Xiaomi devices go to Android Settings -> Apps -> Manage apps -> Ruuvi Station. Enable Autostart and set Battery Saver to \'No restrictions\'. Continuous background scanning @@ -212,13 +212,13 @@ Chart Settings Display all data in chart Enabling it may cause charts to update slowly - Configure interval between points shown on chart and history diapason + Configure interval between points shown on chart Draw dots in chart Small dots will help to understand when measurements were collected Chart Interval - Set interval between points for chart from 1 to 60 minutes. Less value means more accurate chart, but higher requirements to performance of your device + Set interval between points for chart from 1 to 60 minutes. Smaller values mean a more accurate chart, but also a higher performance requirement for your device Chart history view period - Configure history diapason to be shown on chart from 1 to 10 days + Configure the period of history to be shown on chart from 1 to 10 days Data Forwarding Settings Test data forwarding Experimental features @@ -236,33 +236,33 @@ Share Add friend Already shared - You can share the sensor with friends and family if it\'s in range of a Ruuvi Gateway.\n\nReceiver will be notified by email. If the receiver doesn\'t have a Ruuvi account, a free Ruuvi account will be automatically created at first log in.\n\nNote that sensor\'s custom name and background image will be shared. The name and image sync is one time and they can be customised by the receiver. Offset values (if any) will be automatically synced, and the receiver will always see the corrected values. + You can share the sensor with friends and family if it\'s in range of a Ruuvi Gateway.\n\nReceiver will be notified by email. If the receiver doesn\'t have a Ruuvi account, a free Ruuvi account will automatically be created at first log in.\n\nNote that the sensor\'s custom name and background image will be shared. The name and image sync is one time only, and they can be customised by the receiver. Offset values (if any) will be automatically synced, and the receiver will always see the corrected values. Send Share sensor Do you want to unshare sensor for %1$s? Sign in - After signing in, you will be automatically marked as an owner of your nearby Ruuvi sensors. The claimed sensors will be restored after an app re-install.\n\nWith a Ruuvi Gateway router, you\'ll be able to monitor the claimed sensors remotely and share them with your friends. - Benefits of the Ruuvi cloud service + After signing in, you will automatically be marked as the owner of your nearby Ruuvi sensors. The claimed sensors will be restored after an app re-install.\n\nWith a Ruuvi Gateway router, you\'ll be able to monitor the claimed sensors remotely and share them with your friends. + Benefits of the Ruuvi Cloud service Check your email for an activation code. Code Email sent Login Enter code manually - Request a Code + Request a code Submit Sign out - When you sign out, sensors of which ownerships you\'ve claimed on the sensor settings page, will be automatically removed from the app. When you sign in again using the same email address, the sensors will be returned from the cloud.\n\n Do you want sign out? + When you sign out, sensors the ownerships of which you\'ve claimed on the sensor Settings page will be automatically removed from the app. When you sign in again using the same email address, the sensors will be returned from the Cloud.\n\n Do you want to sign out? %1$,d %2$s - %1$s dBm SKIP Something went wrong - Successfully claimed ownership of the sensor + Ownership of the sensor claimed successfully Successfully shared sensor SYNC Sync complete Download history data from the sensor? - Synchronizing + Synchronising Name Sensor not found, is it in range? Claim ownership From cdfc51ba01033002b573542d7303e5b2a05b2cc7 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Fri, 3 Sep 2021 00:46:30 +0300 Subject: [PATCH 08/33] ISSUE #472 auto organise sensors alphabetically according sensor names (quick and allows user to reorganise by renaming) --- .../java/com/ruuvi/station/database/domain/TagRepository.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt index 1fa282ebb..4a2104dc5 100644 --- a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt +++ b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt @@ -8,6 +8,8 @@ import com.ruuvi.station.tag.domain.RuuviTag import com.ruuvi.station.tag.domain.TagConverter import timber.log.Timber import java.util.* +import com.raizlabs.android.dbflow.annotation.Collate +import com.raizlabs.android.dbflow.sql.language.OrderBy class TagRepository( private val sensorSettingsRepository: SensorSettingsRepository, @@ -48,7 +50,7 @@ class TagRepository( .from(SensorSettings::class.java) .innerJoin(RuuviTagEntity::class.java) .on(SensorSettings_Table.id.withTable().eq(RuuviTagEntity_Table.id.withTable())) - .orderBy(SensorSettings_Table.createDate.withTable(), true) + .orderBy(OrderBy.fromProperty(SensorSettings_Table.name).collate(Collate.UNICODE).ascending()) .queryCustomList(FavouriteSensorQuery::class.java) .map { tagConverter.fromDatabase(it) } } From 25b826829730249ebbb64eb3d7817eeab7d2abb6 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Fri, 3 Sep 2021 01:07:39 +0300 Subject: [PATCH 09/33] version bump --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 20b79f314..04d3e895d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15035 - versionName "1.5.35" + versionCode 15036 + versionName "1.5.36" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } From bd331cfa65a6d188e85c2db9b6f53ff92ea98c5f Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Fri, 3 Sep 2021 09:18:38 +0300 Subject: [PATCH 10/33] ISSUE #472 auto organise sensors alphabetically according sensor names (quick and allows user to reorganise by renaming) --- app/build.gradle | 4 ++-- .../java/com/ruuvi/station/database/domain/TagRepository.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 04d3e895d..c3592561b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15036 - versionName "1.5.36" + versionCode 15037 + versionName "1.5.37" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } diff --git a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt index 4a2104dc5..03f34bba8 100644 --- a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt +++ b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt @@ -50,7 +50,7 @@ class TagRepository( .from(SensorSettings::class.java) .innerJoin(RuuviTagEntity::class.java) .on(SensorSettings_Table.id.withTable().eq(RuuviTagEntity_Table.id.withTable())) - .orderBy(OrderBy.fromProperty(SensorSettings_Table.name).collate(Collate.UNICODE).ascending()) + .orderBy(OrderBy.fromProperty(SensorSettings_Table.name.withTable()).collate(Collate.UNICODE).ascending()) .queryCustomList(FavouriteSensorQuery::class.java) .map { tagConverter.fromDatabase(it) } } From 1817c03d47948b5a96dbb2be4897ae99abb1d109 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Fri, 3 Sep 2021 10:54:51 +0300 Subject: [PATCH 11/33] ISSUE #476 Sensors with scandic letters aren't organized correctly [CHANGED] collate to LOCALIZED --- .../java/com/ruuvi/station/database/domain/TagRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt index 03f34bba8..80c3ace5f 100644 --- a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt +++ b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt @@ -50,7 +50,7 @@ class TagRepository( .from(SensorSettings::class.java) .innerJoin(RuuviTagEntity::class.java) .on(SensorSettings_Table.id.withTable().eq(RuuviTagEntity_Table.id.withTable())) - .orderBy(OrderBy.fromProperty(SensorSettings_Table.name.withTable()).collate(Collate.UNICODE).ascending()) + .orderBy(OrderBy.fromProperty(SensorSettings_Table.name.withTable()).collate(Collate.LOCALIZED).ascending()) .queryCustomList(FavouriteSensorQuery::class.java) .map { tagConverter.fromDatabase(it) } } From d0a2128ff8db5cd711223f7238da341f5bb7b166 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Tue, 7 Sep 2021 18:06:56 +0300 Subject: [PATCH 12/33] ISSUE #475 Shared sensor is "returned" should owners shared list be updated? [FIXED] unsharing --- app/build.gradle | 4 ++-- .../network/domain/NetworkDataSyncInteractor.kt | 15 +++++++++------ .../tagsettings/domain/TagSettingsInteractor.kt | 2 +- app/src/main/res/values-sv/strings.xml | 17 +++++++++++++++++ 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c3592561b..702129272 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15037 - versionName "1.5.37" + versionCode 15038 + versionName "1.5.38" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } diff --git a/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt b/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt index 4675f6240..167374e43 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt @@ -7,7 +7,6 @@ import com.ruuvi.station.bluetooth.BluetoothLibrary import com.ruuvi.station.database.domain.SensorHistoryRepository import com.ruuvi.station.database.domain.SensorSettingsRepository import com.ruuvi.station.database.domain.TagRepository -import com.ruuvi.station.database.tables.RuuviTagEntity import com.ruuvi.station.database.tables.SensorSettings import com.ruuvi.station.database.tables.TagSensorReading import com.ruuvi.station.image.ImageInteractor @@ -60,13 +59,17 @@ class NetworkDataSyncInteractor ( } autoRefreshJob = CoroutineScope(IO).launch { + syncNetworkData() + delay(10000) while (true) { - Timber.d("Cloud auto refresh another round") + val lastSync = preferencesRepository.getLastSyncDate() + Timber.d("Cloud auto refresh another round. Last sync ${Date(lastSync)}") if (networkInteractor.signedIn && - Date(preferencesRepository.getLastSyncDate()).diffGreaterThan(60*1000)) { + Date(lastSync).diffGreaterThan(60000)) { + Timber.d("Do actual sync") syncNetworkData() } - delay(65 * 1000) + delay(10000) } } } @@ -97,7 +100,7 @@ class NetworkDataSyncInteractor ( } val benchUpdate1 = Date() - updateTags(userInfo.data) + updateSensors(userInfo.data) val benchUpdate2 = Date() Timber.d("benchmark-updateTags-finish - ${benchUpdate2.time - benchUpdate1.time} ms") Timber.d("benchmark-syncForPeriod-start") @@ -239,7 +242,7 @@ class NetworkDataSyncInteractor ( return 0 } - private suspend fun updateTags(userInfoData: UserInfoResponseBody) { + private suspend fun updateSensors(userInfoData: UserInfoResponseBody) { userInfoData.sensors.forEach { sensor -> Timber.d("updateTags: $sensor") val sensorSettings = sensorSettingsRepository.getSensorSettingsOrCreate(sensor.sensor) diff --git a/app/src/main/java/com/ruuvi/station/tagsettings/domain/TagSettingsInteractor.kt b/app/src/main/java/com/ruuvi/station/tagsettings/domain/TagSettingsInteractor.kt index 312e4fd89..5b7ff6669 100644 --- a/app/src/main/java/com/ruuvi/station/tagsettings/domain/TagSettingsInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/tagsettings/domain/TagSettingsInteractor.kt @@ -32,7 +32,7 @@ class TagSettingsInteractor( if (sensorSettings.owner == networkInteractor.getEmail()) { networkInteractor.unclaimSensor(sensorId) } else { - networkInteractor.unshareSensor(owner, sensorId) + networkInteractor.unshareSensor(networkInteractor.getEmail() ?: "", sensorId) } } } diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index b5bdc26ca..80951eae2 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -57,6 +57,9 @@ Avbryt Historiken fungerar bäst när bakgrundsskanning är aktiverad. Vill du aktivera bakgrundsskanning? + Äger du den här sensorn? Bekräfta ägandet och så läggs sensorn till på ditt Ruuvi-konto. Varje Ruuvi-sensor kan bara ha en ägare.\n\nFördelar:\n\n ● Sensornamn, bakgrundsbilder, kalibrering och larminformation från en säker molntjänst\n\n ● Läs sensorinformation på distans online ( kräver Ruuvi Gateway-router)\n\n ● Dela sensorer med vänner och familj (kräver Ruuvi Gateway)\n\n ● Upp till 2 års historik från station.ruuvi.com (kräver Ruuvi Gateway) + Bekräfta Ägandet + Bekräfta ägandet Rensa Radera historisk data från appen? Stäng @@ -87,6 +90,7 @@ Fel uppstod. HTTP svarskod: %1$d Proxyn fungerar! HTTP svarskod: %1$d Testar... + Allmänt h Ruuvi State är en lättanvänt och kraftfullt program för Ruuvi sensorer. Sätt igång genom att lägga till sensorer. OM / HJÄLP @@ -119,6 +123,7 @@ Français Русский Svenska + Inloggad: Dra full nytta av Ruuvi Station! Logga in eller skapa ett nytt Ruuvi-konto genom att ange din e-postadress. Logga in till\nRuuvi\nStation MAC Adress @@ -137,6 +142,7 @@ Stäng navigationslådan Öppna navigationslådan Endast sensorer inom räckhåll av din Ruuvi Gateway kan delas. Mer information finns på ruuvi.com + Ruuvi cloud status Synkroniseringen misslyckades: %1$s Synkroniseringen misslyckades: du måste vara inloggad Synkroniseringen lyckades! @@ -170,7 +176,10 @@ Läser historik Firmware versionen stöds inte Ta bort + Om du tar bort sensorn upphör ägarskapet. Vem som helst kan göra anspråk på ägandet av sensorn efter borttagning. Varje Ruuvi-sensor kan bara ha en ägare. Är du säker på att du vill ta bort den här sensorn? + Om du tar bort sensorn så meddelas ägaren till sensorn och du kan inte komma åt den längre. + Ta bort sensorn Signalstyrka (RSSI) s SKANNA @@ -179,7 +188,9 @@ Välj bild Skicka e-post Sensorn har redan lagts till + Inte delad Sensorinställningar + Delad Inställningar Om du har problem med bakgrundsskanningen så kan det hjälpa att stänga av batterioptimering. Denna inställning hittas på olika ställen beroende på telefonens tillverkare, modell och Android version. Gå till operativsystemets Inställningar -> Appar -> Batteri -> Batterioptimering och välj Optimera inte för Ruuvi Station @@ -224,11 +235,13 @@ Dela Lägg till vän Sensorn är redan delad + Du kan dela sensorn med vänner och familj om den är inom räckhåll för en Ruuvi Gateway.\n\nMottagaren meddelas via e-post. Om mottagaren inte har ett Ruuvi-konto skapas ett gratis Ruuvi-konto automatiskt vid första inloggningen.\n\nObservera att sensorns anpassade namn och bakgrundsbild delas. Namnet och bildsynkroniseringen sker endast vid en gång, efteråt kan det anpassas av mottagaren. Kalibreringsvärden (om sådana finns) synkroniseras automatiskt och mottagaren ser alltid de korrigerade värdena. Skicka Dela sensor Vill du sluta dela sensorn med %1$s? Logga in Efter inloggning markeras du automatiskt som ägare till dina närliggande Ruuvi-sensorer. Sensorernas ägare kommer att återställas om appen installerats om igen.\n\nMed en Ruuvi Gateway kan du övervaka dina sensorer på distans och dele dem med dina vänner. + Fördelarna med Ruuvi Cloud Kontrollera din e-post efter en aktiveringskod. Kod E-post skickat @@ -237,17 +250,21 @@ Begär en inloggningskod Skicka Logga ut + Sensorer som du har verifierat äganderätten till på inställningssidan tas automatiskt bort från appen när du loggar ut. Sensordata hämtas från molnet igen om du loggar in med samma e-postadress.\n\n Är du säker på att du vill logga ut? %1$,d %2$s - %1$s dBm SKIPPA Något gick fel + Sensorägande bekräftat + Delningen lyckades SYNK Synkronisering klar Ladda ner historik-data från sensorn? Synkroniserar Sensornamn Sensorn hittades inte, är den innom räckvidd? + Bekräfta ägandet NÄTVERKSINFO Ägare Ta bort sensor From 05c4837868f17b5da50b48adcf0afaf4267a80a6 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Wed, 8 Sep 2021 20:03:47 +0300 Subject: [PATCH 13/33] ISSUE #472 auto organise sensors alphabetically according sensor names (quick and allows user to reorganise by renaming) [FIXED] select new sensor after adding [ADDED] message to add sensor dialog --- .../tagdetails/ui/TagDetailsActivity.kt | 20 +++++++++++-------- .../tagsettings/ui/SensorNameEditDialog.kt | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt index a20a1c251..e3cfbe4a7 100644 --- a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt +++ b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt @@ -213,21 +213,23 @@ class TagDetailsActivity : AppCompatActivity(), KodeinAware { } private fun setupTags(tags: List) { - val previousTagsSize = adapter.count + val newSensorId = getNewSensor(adapter.getTags(), tags) + Timber.d("newSensorId = $newSensorId desiredTag = ${viewModel.desiredTag}") + if (newSensorId != null) viewModel.desiredTag = newSensorId adapter.setTags(tags) - val isSizeChanged = previousTagsSize > 0 && tags.size != previousTagsSize setupVisibility(tags.isNullOrEmpty()) if (tags.isNotEmpty()) { - if (!viewModel.desiredTag.isNullOrEmpty() && !isSizeChanged) { - val index = tags.indexOfFirst { tag -> tag.id == viewModel.desiredTag } - scrollOrCacheCurrentPosition(tagPager.currentItem != index, index) - } else { - scrollOrCacheCurrentPosition(isSizeChanged, tags.size - 1) - } + val index = tags.indexOfFirst { tag -> tag.id == viewModel.desiredTag } + scrollOrCacheCurrentPosition(tagPager.currentItem != index, index) } } + private fun getNewSensor(previousSensors: List, newSensors: List): String? { + if (previousSensors.isNullOrEmpty()) return null + return newSensors.firstOrNull { newSens -> previousSensors.none { it.id == newSens.id } }?.id + } + private fun scrollOrCacheCurrentPosition(shouldScroll: Boolean, scrollToPosition: Int) { if (shouldScroll) { tagPager.setCurrentItem(scrollToPosition, false) @@ -502,6 +504,8 @@ class TagDetailsActivity : AppCompatActivity(), KodeinAware { this.tags = tags notifyDataSetChanged() } + + fun getTags() = tags } private fun requestPermission() { diff --git a/app/src/main/java/com/ruuvi/station/tagsettings/ui/SensorNameEditDialog.kt b/app/src/main/java/com/ruuvi/station/tagsettings/ui/SensorNameEditDialog.kt index 65d43ad0a..45467a0cd 100644 --- a/app/src/main/java/com/ruuvi/station/tagsettings/ui/SensorNameEditDialog.kt +++ b/app/src/main/java/com/ruuvi/station/tagsettings/ui/SensorNameEditDialog.kt @@ -26,6 +26,7 @@ class SensorNameEditDialog( builder .setView(binding.root) .setTitle(getString(R.string.tag_name)) + .setMessage(R.string.rename_sensor_message) .setPositiveButton(R.string.ok) {_,_-> var value: String? = binding.sensorNameEditText.text.toString() if (value.isNullOrEmpty()) value = null diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2a3b9ce5d..2b7c74650 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -175,6 +175,7 @@ Удалить Вы уверены что хотите удалить этот сенсор? Удалить этот датчик + Датчики будут отсортированы в алфавитном порядке. Сила сигнала (RSSI) с СКАНИРОВАТЬ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b18dcf9db..32033138f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -181,6 +181,7 @@ Do you want to remove the sensor? You can add it again later, if needed. If you remove the sensor, the owner of the sensor will be notified and you cannot access the sensor anymore. Remove this sensor + Your sensors will be in alphabetical order. Signal strength (RSSI) s SCAN From bf8b18178e8b99ac668d3c42c878def78dd6cf97 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Wed, 8 Sep 2021 20:16:56 +0300 Subject: [PATCH 14/33] ISSUE #472 auto organise sensors alphabetically according sensor names (quick and allows user to reorganise by renaming) [ADDED] FI translations --- app/src/main/res/values-fi/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 3893a25ac..4b4ff98b4 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -180,6 +180,7 @@ Haluatko varmasti poistaa tämän anturin? Poistamisesta ilmoitetaan anturin omistajalle ja anturin tietojen luku-oikeus päättyy. Poista tämä anturi + Anturisi asettuvat automaattisesti aakkosjärjestykseen. Signaalin voimakkuus (RSSI) s SKANNAA From a36a04235fd77b40487df7e7dcff55dc6d105323 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Wed, 8 Sep 2021 21:47:56 +0300 Subject: [PATCH 15/33] version bump --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 702129272..8a29ec1da 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15038 - versionName "1.5.38" + versionCode 15039 + versionName "1.5.39" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } From 21d7773362b478e314eb40c5ba101397f15384af Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Thu, 9 Sep 2021 21:29:22 +0300 Subject: [PATCH 16/33] ISSUE #415 Apply offsets to existing history data [ADDED] auto calibration for history --- .../di/CalibrationInjectionModule.kt | 2 +- .../domain/CalibrationInteractor.kt | 19 ++++++++++++++++++ .../domain/SensorHistoryRepository.kt | 20 +++++++++++++++++++ .../station/database/tables/SensorSettings.kt | 5 ++++- .../network/di/NetworkInjectionModule.kt | 2 +- .../domain/NetworkDataSyncInteractor.kt | 7 ++++--- 6 files changed, 49 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/ruuvi/station/calibration/di/CalibrationInjectionModule.kt b/app/src/main/java/com/ruuvi/station/calibration/di/CalibrationInjectionModule.kt index bdff27258..a692cd416 100644 --- a/app/src/main/java/com/ruuvi/station/calibration/di/CalibrationInjectionModule.kt +++ b/app/src/main/java/com/ruuvi/station/calibration/di/CalibrationInjectionModule.kt @@ -11,7 +11,7 @@ import org.kodein.di.generic.* object CalibrationInjectionModule { val module = Kodein.Module(CalibrationInjectionModule.javaClass.name) { bind() with singleton { - CalibrationInteractor(instance(), instance(), instance(), instance()) + CalibrationInteractor(instance(), instance(), instance(), instance(), instance()) } bind() with factory { args: CalibrationViewModelArgs -> diff --git a/app/src/main/java/com/ruuvi/station/calibration/domain/CalibrationInteractor.kt b/app/src/main/java/com/ruuvi/station/calibration/domain/CalibrationInteractor.kt index 3e6dc5293..4ef67acf1 100644 --- a/app/src/main/java/com/ruuvi/station/calibration/domain/CalibrationInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/calibration/domain/CalibrationInteractor.kt @@ -1,6 +1,7 @@ package com.ruuvi.station.calibration.domain import com.ruuvi.station.calibration.model.CalibrationInfo +import com.ruuvi.station.database.domain.SensorHistoryRepository import com.ruuvi.station.database.domain.SensorSettingsRepository import com.ruuvi.station.database.domain.TagRepository import com.ruuvi.station.database.tables.RuuviTagEntity @@ -13,6 +14,7 @@ class CalibrationInteractor ( val tagRepository: TagRepository, val sensorSettingsRepository: SensorSettingsRepository, val unitsConverter: UnitsConverter, + val sensorHistoryRepository: SensorHistoryRepository, private val networkInteractor: RuuviNetworkInteractor ) { fun getSensorData(sensorId: String): RuuviTagEntity? = tagRepository.getTagById(sensorId) @@ -29,6 +31,7 @@ class CalibrationInteractor ( val offset = targetCelsius - fromTemperature sensorSettingsRepository.setSensorTemperatureCalibrationOffset(sensorId, offset) saveCalibrationToNetwork(sensorId) + recalibrateHistory(sensorId) } } @@ -37,6 +40,7 @@ class CalibrationInteractor ( fun clearTemperatureCalibration(sensorId: String) { sensorSettingsRepository.clearTemperatureCalibration(sensorId) saveCalibrationToNetwork(sensorId) + recalibrateHistory(sensorId) } private fun isTemperatureCalibrated(settings: SensorSettings?): Boolean = settings?.temperatureOffset ?: 0.0 != 0.0 @@ -115,6 +119,7 @@ class CalibrationInteractor ( fun clearPressureCalibration(sensorId: String) { sensorSettingsRepository.clearPressureCalibration(sensorId) saveCalibrationToNetwork(sensorId) + recalibrateHistory(sensorId) } fun calibratePressure(sensorId: String, targetValue: Double) { @@ -125,6 +130,7 @@ class CalibrationInteractor ( val offset = targetPascal - fromPressure sensorSettingsRepository.setSensorPressureCalibrationOffset(sensorId, offset) saveCalibrationToNetwork(sensorId) + recalibrateHistory(sensorId) } } @@ -135,6 +141,7 @@ class CalibrationInteractor ( fun clearHumidityCalibration(sensorId: String) { sensorSettingsRepository.clearHumidityCalibration(sensorId) saveCalibrationToNetwork(sensorId) + recalibrateHistory(sensorId) } fun calibrateHumidity(sensorId: String, targetValue: Double) { @@ -144,10 +151,22 @@ class CalibrationInteractor ( val offset = targetValue - fromHumidity sensorSettingsRepository.setSensorHumidityOffset(sensorId, offset) saveCalibrationToNetwork(sensorId) + recalibrateHistory(sensorId) } } fun saveCalibrationToNetwork(sensorId: String) { networkInteractor.updateSensorCalibration(sensorId) } + + fun recalibrateHistory(sensorId: String) { + val sensorSettings = sensorSettingsRepository.getSensorSettings(sensorId) + sensorSettings?.let { + recalibrateHistory(it) + } + } + + fun recalibrateHistory(sensorSettings: SensorSettings) { + sensorHistoryRepository.recalibrate(sensorSettings) + } } \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/database/domain/SensorHistoryRepository.kt b/app/src/main/java/com/ruuvi/station/database/domain/SensorHistoryRepository.kt index 985cac239..4125a1025 100644 --- a/app/src/main/java/com/ruuvi/station/database/domain/SensorHistoryRepository.kt +++ b/app/src/main/java/com/ruuvi/station/database/domain/SensorHistoryRepository.kt @@ -5,6 +5,7 @@ import com.raizlabs.android.dbflow.kotlinextensions.from import com.raizlabs.android.dbflow.sql.language.Method import com.raizlabs.android.dbflow.sql.language.SQLite import com.raizlabs.android.dbflow.sql.queriable.StringQuery +import com.ruuvi.station.database.tables.SensorSettings import com.ruuvi.station.database.tables.TagSensorReading import com.ruuvi.station.database.tables.TagSensorReading_Table import timber.log.Timber @@ -143,6 +144,25 @@ class SensorHistoryRepository { } } + fun recalibrate(sensorSettings: SensorSettings) { + fun executeSQL(sql: String) { + Timber.d("executeSQL $sql") + FlowManager.getWritableDatabase(LocalDatabase.NAME).execSQL(sql) + } + val updateQuery = """ + update TagSensorReading + set + temperature = temperature - ifnull(temperatureOffset, 0) + ${sensorSettings.temperatureOffset ?: 0.0}, + humidity = humidity - ifnull(humidityOffset, 0) + ${sensorSettings.humidityOffset ?: 0.0}, + pressure = pressure - ifnull(pressureOffset, 0) + ${sensorSettings.pressureOffset ?: 0.0}, + temperatureOffset = ${sensorSettings.temperatureOffset ?: 0.0}, + humidityOffset = ${sensorSettings.humidityOffset ?: 0.0}, + pressureOffset = ${sensorSettings.pressureOffset ?: 0.0} + where ruuviTagId = "${sensorSettings.id}" + """ + executeSQL(updateQuery) + } + companion object { const val POINT_THRESHOLD = 1000 const val HIGH_DENSITY_INTERVAL_MINUTES = 15 diff --git a/app/src/main/java/com/ruuvi/station/database/tables/SensorSettings.kt b/app/src/main/java/com/ruuvi/station/database/tables/SensorSettings.kt index 383cf7086..a7d371b21 100644 --- a/app/src/main/java/com/ruuvi/station/database/tables/SensorSettings.kt +++ b/app/src/main/java/com/ruuvi/station/database/tables/SensorSettings.kt @@ -2,6 +2,7 @@ package com.ruuvi.station.database.tables import com.raizlabs.android.dbflow.annotation.* import com.raizlabs.android.dbflow.structure.BaseModel +import com.ruuvi.station.calibration.domain.CalibrationInteractor import com.ruuvi.station.database.domain.LocalDatabase import com.ruuvi.station.network.data.response.SensorDataResponse import java.util.* @@ -77,13 +78,15 @@ data class SensorSettings( sensorReading.humidityOffset = humidityOffset ?: 0.0 } - fun updateFromNetwork(sensor: SensorDataResponse) { + fun updateFromNetwork(sensor: SensorDataResponse, calibrationInteractor: CalibrationInteractor) { name = sensor.name owner = sensor.owner + val recalibrateHistory = humidityOffset != sensor.offsetHumidity || pressureOffset != sensor.offsetPressure || temperatureOffset != sensor.offsetTemperature humidityOffset = sensor.offsetHumidity pressureOffset = sensor.offsetPressure temperatureOffset = sensor.offsetTemperature networkSensor = true update() + if (recalibrateHistory) calibrationInteractor.recalibrateHistory(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt b/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt index 95e370b45..56004491b 100644 --- a/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt +++ b/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt @@ -19,7 +19,7 @@ object NetworkInjectionModule { bind() with singleton { NetworkRequestExecutor(instance(), instance(), instance(), instance(), instance()) } bind() with singleton { - NetworkDataSyncInteractor(instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance()) + NetworkDataSyncInteractor(instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance()) } bind() with singleton { diff --git a/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt b/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt index 167374e43..2b6065a7c 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt @@ -4,6 +4,7 @@ import android.net.Uri import com.ruuvi.station.app.preferences.GlobalSettings import com.ruuvi.station.app.preferences.PreferencesRepository import com.ruuvi.station.bluetooth.BluetoothLibrary +import com.ruuvi.station.calibration.domain.CalibrationInteractor import com.ruuvi.station.database.domain.SensorHistoryRepository import com.ruuvi.station.database.domain.SensorSettingsRepository import com.ruuvi.station.database.domain.TagRepository @@ -37,7 +38,8 @@ class NetworkDataSyncInteractor ( private val sensorHistoryRepository: SensorHistoryRepository, private val networkRequestExecutor: NetworkRequestExecutor, private val networkApplicationSettings: NetworkApplicationSettings, - private val networkAlertsSyncInteractor: NetworkAlertsSyncInteractor + private val networkAlertsSyncInteractor: NetworkAlertsSyncInteractor, + private val calibrationInteractor: CalibrationInteractor ) { @Volatile private var syncJob: Job? = null @@ -162,7 +164,6 @@ class NetworkDataSyncInteractor ( var since = cal.time if (sensorSettings.networkLastSync ?: Date(Long.MIN_VALUE) > since) since = sensorSettings.networkLastSync - val originalSince = since // if we have data for recent minute - skipping update if (!since.diffGreaterThan(60*1000)) return @@ -246,7 +247,7 @@ class NetworkDataSyncInteractor ( userInfoData.sensors.forEach { sensor -> Timber.d("updateTags: $sensor") val sensorSettings = sensorSettingsRepository.getSensorSettingsOrCreate(sensor.sensor) - sensorSettings.updateFromNetwork(sensor) + sensorSettings.updateFromNetwork(sensor, calibrationInteractor) if (!sensor.picture.isNullOrEmpty()) { setSensorImage(sensor, sensorSettings) From 68f862c92f181e72d8fac8775f5791a4aaec50df Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Thu, 9 Sep 2021 23:35:31 +0300 Subject: [PATCH 17/33] version bump --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8a29ec1da..57c3f8dbe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15039 - versionName "1.5.39" + versionCode 15040 + versionName "1.5.40" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } From 4d6f57d70632b39e2b190a69e9405034756e55ea Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Tue, 14 Sep 2021 19:10:44 +0300 Subject: [PATCH 18/33] ISSUE #418 Add Firebase analytics --- .../app/preferences/PreferencesRepository.kt | 2 ++ .../firebase/di/FirebaseInjectionModule.kt | 6 ++-- ...opertiesSaver.kt => FirebaseInteractor.kt} | 33 +++++++++++++++++-- .../network/di/NetworkInjectionModule.kt | 4 +-- .../domain/NetworkDataSyncInteractor.kt | 5 ++- .../network/domain/RuuviNetworkInteractor.kt | 5 ++- .../station/startup/ui/StartupActivity.kt | 4 +-- .../station/tag/di/RuuviTagInjectionModule.kt | 2 +- .../ruuvi/station/tag/domain/TagInteractor.kt | 5 +-- .../di/TagDetailsInjectionModule.kt | 2 +- .../tagdetails/ui/TagDetailsViewModel.kt | 8 +++-- 11 files changed, 57 insertions(+), 19 deletions(-) rename app/src/main/java/com/ruuvi/station/firebase/domain/{FirebasePropertiesSaver.kt => FirebaseInteractor.kt} (68%) diff --git a/app/src/main/java/com/ruuvi/station/app/preferences/PreferencesRepository.kt b/app/src/main/java/com/ruuvi/station/app/preferences/PreferencesRepository.kt index b01a86f91..fff8c7a58 100644 --- a/app/src/main/java/com/ruuvi/station/app/preferences/PreferencesRepository.kt +++ b/app/src/main/java/com/ruuvi/station/app/preferences/PreferencesRepository.kt @@ -150,4 +150,6 @@ class PreferencesRepository( fun setLocale(locale: String) { preferences.locale = locale } + + fun getUserEmail() = preferences.networkEmail } \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/firebase/di/FirebaseInjectionModule.kt b/app/src/main/java/com/ruuvi/station/firebase/di/FirebaseInjectionModule.kt index 81488dcff..4ddf29537 100644 --- a/app/src/main/java/com/ruuvi/station/firebase/di/FirebaseInjectionModule.kt +++ b/app/src/main/java/com/ruuvi/station/firebase/di/FirebaseInjectionModule.kt @@ -3,7 +3,7 @@ package com.ruuvi.station.firebase.di import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.analytics import com.google.firebase.ktx.Firebase -import com.ruuvi.station.firebase.domain.FirebasePropertiesSaver +import com.ruuvi.station.firebase.domain.FirebaseInteractor import org.kodein.di.Kodein import org.kodein.di.generic.bind import org.kodein.di.generic.instance @@ -14,8 +14,8 @@ object FirebaseInjectionModule { bind() with singleton { Firebase.analytics } - bind() with singleton { - FirebasePropertiesSaver(instance(), instance(), instance()) + bind() with singleton { + FirebaseInteractor(instance(), instance(), instance()) } } } \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/firebase/domain/FirebasePropertiesSaver.kt b/app/src/main/java/com/ruuvi/station/firebase/domain/FirebaseInteractor.kt similarity index 68% rename from app/src/main/java/com/ruuvi/station/firebase/domain/FirebasePropertiesSaver.kt rename to app/src/main/java/com/ruuvi/station/firebase/domain/FirebaseInteractor.kt index 1b9954c16..fc53bfce1 100644 --- a/app/src/main/java/com/ruuvi/station/firebase/domain/FirebasePropertiesSaver.kt +++ b/app/src/main/java/com/ruuvi/station/firebase/domain/FirebaseInteractor.kt @@ -1,14 +1,16 @@ package com.ruuvi.station.firebase.domain import com.google.firebase.analytics.FirebaseAnalytics +import com.google.firebase.analytics.ktx.logEvent import com.ruuvi.station.app.preferences.PreferencesRepository +import com.ruuvi.station.network.data.response.UserInfoResponseBody import com.ruuvi.station.tag.domain.TagInteractor import com.ruuvi.station.util.BackgroundScanModes import kotlinx.coroutines.* import timber.log.Timber import java.lang.Exception -class FirebasePropertiesSaver( +class FirebaseInteractor( private val firebaseAnalytics: FirebaseAnalytics, private val preferences: PreferencesRepository, private val tagInteractor: TagInteractor @@ -16,7 +18,7 @@ class FirebasePropertiesSaver( ) { fun saveUserProperties() { CoroutineScope(Dispatchers.IO).launch { - delay(15*1000) + delay(15000) Timber.d("FirebasePropertySaver.saveUserProperties") try { firebaseAnalytics.setUserProperty("background_scan_enabled", @@ -47,9 +49,36 @@ class FirebasePropertiesSaver( } else { firebaseAnalytics.setUserProperty("added_tags", "10+") } + + val signedIn = preferences.getUserEmail().isEmpty() + firebaseAnalytics.setUserProperty("signed_in", signedIn.toString()) } catch (e: Exception) { Timber.e(e) } } } + + fun logSignIn() { + CoroutineScope(Dispatchers.IO).launch { + val addedTags = tagInteractor.getTagEntities(true).size + val notAddedTags = tagInteractor.getTagEntities(false).size + val seenTags = addedTags + notAddedTags + + firebaseAnalytics.logEvent(FirebaseAnalytics.Event.LOGIN) { + param("sensors_added", addedTags.toLong()) + param("sensors_seen", seenTags.toLong()) + } + } + } + + fun logSync(userInfoData: UserInfoResponseBody) { + CoroutineScope(Dispatchers.IO).launch { + val claimed = userInfoData.sensors.count { it.owner == userInfoData.email } + val notOwned = userInfoData.sensors.count { it.owner != userInfoData.email } + firebaseAnalytics.logEvent("sync") { + param("sensors_claimed", claimed.toLong()) + param("sensors_shared_to_user", notOwned.toLong()) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt b/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt index 56004491b..291426ba8 100644 --- a/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt +++ b/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt @@ -12,14 +12,14 @@ object NetworkInjectionModule { bind() with singleton { NetworkTokenRepository(instance(), instance(), instance()) } - bind() with singleton { RuuviNetworkInteractor(instance(), instance(), instance(), instance()) } + bind() with singleton { RuuviNetworkInteractor(instance(), instance(), instance(), instance(), instance()) } bind() with singleton { NetworkSignInInteractor(instance(), instance(), instance()) } bind() with singleton { NetworkRequestExecutor(instance(), instance(), instance(), instance(), instance()) } bind() with singleton { - NetworkDataSyncInteractor(instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance()) + NetworkDataSyncInteractor(instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance(), instance()) } bind() with singleton { diff --git a/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt b/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt index 2b6065a7c..786053a79 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/NetworkDataSyncInteractor.kt @@ -10,6 +10,7 @@ import com.ruuvi.station.database.domain.SensorSettingsRepository import com.ruuvi.station.database.domain.TagRepository import com.ruuvi.station.database.tables.SensorSettings import com.ruuvi.station.database.tables.TagSensorReading +import com.ruuvi.station.firebase.domain.FirebaseInteractor import com.ruuvi.station.image.ImageInteractor import com.ruuvi.station.network.data.NetworkSyncResult import com.ruuvi.station.network.data.NetworkSyncResultType @@ -39,7 +40,8 @@ class NetworkDataSyncInteractor ( private val networkRequestExecutor: NetworkRequestExecutor, private val networkApplicationSettings: NetworkApplicationSettings, private val networkAlertsSyncInteractor: NetworkAlertsSyncInteractor, - private val calibrationInteractor: CalibrationInteractor + private val calibrationInteractor: CalibrationInteractor, + private val firebaseInteractor: FirebaseInteractor ) { @Volatile private var syncJob: Job? = null @@ -103,6 +105,7 @@ class NetworkDataSyncInteractor ( val benchUpdate1 = Date() updateSensors(userInfo.data) + firebaseInteractor.logSync(userInfo.data) val benchUpdate2 = Date() Timber.d("benchmark-updateTags-finish - ${benchUpdate2.time - benchUpdate1.time} ms") Timber.d("benchmark-syncForPeriod-start") diff --git a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt index cb9acb920..129003913 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt @@ -5,6 +5,7 @@ import com.ruuvi.station.database.model.NetworkRequestType import com.ruuvi.station.database.tables.Alarm import com.ruuvi.station.database.tables.NetworkRequest import com.ruuvi.station.database.tables.SensorSettings +import com.ruuvi.station.firebase.domain.FirebaseInteractor import com.ruuvi.station.network.data.NetworkTokenInfo import com.ruuvi.station.network.data.request.* import com.ruuvi.station.network.data.requestWrappers.UploadImageRequestWrapper @@ -18,7 +19,8 @@ class RuuviNetworkInteractor ( private val tokenRepository: NetworkTokenRepository, private val networkRepository: RuuviNetworkRepository, private val networkRequestExecutor: NetworkRequestExecutor, - private val sensorSettingsRepository: SensorSettingsRepository + private val sensorSettingsRepository: SensorSettingsRepository, + private val firebaseInteractor: FirebaseInteractor ) { val signedIn: Boolean get() = getToken() != null @@ -44,6 +46,7 @@ class RuuviNetworkInteractor ( if (response.error.isNullOrEmpty() && response.data != null) { tokenRepository.saveTokenInfo( NetworkTokenInfo(response.data.email, response.data.accessToken)) + firebaseInteractor.logSignIn() } } onResult(response) diff --git a/app/src/main/java/com/ruuvi/station/startup/ui/StartupActivity.kt b/app/src/main/java/com/ruuvi/station/startup/ui/StartupActivity.kt index 9831d1c79..819febe78 100644 --- a/app/src/main/java/com/ruuvi/station/startup/ui/StartupActivity.kt +++ b/app/src/main/java/com/ruuvi/station/startup/ui/StartupActivity.kt @@ -9,7 +9,7 @@ import com.ruuvi.station.R import com.ruuvi.station.dashboard.ui.DashboardActivity import com.ruuvi.station.welcome.ui.WelcomeActivity import com.ruuvi.station.welcome.ui.WelcomeActivity.Companion.ARGUMENT_FROM_WELCOME -import com.ruuvi.station.firebase.domain.FirebasePropertiesSaver +import com.ruuvi.station.firebase.domain.FirebaseInteractor import com.ruuvi.station.tagdetails.ui.TagDetailsActivity import org.kodein.di.KodeinAware import org.kodein.di.android.closestKodein @@ -20,7 +20,7 @@ class StartupActivity : AppCompatActivity(), KodeinAware { override val kodein by closestKodein() private val viewModel: StartupActivityViewModel by viewModel() - private val firebasePropertySaver: FirebasePropertiesSaver by instance() + private val firebasePropertySaver: FirebaseInteractor by instance() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/ruuvi/station/tag/di/RuuviTagInjectionModule.kt b/app/src/main/java/com/ruuvi/station/tag/di/RuuviTagInjectionModule.kt index e2acf3aa1..11a96359a 100644 --- a/app/src/main/java/com/ruuvi/station/tag/di/RuuviTagInjectionModule.kt +++ b/app/src/main/java/com/ruuvi/station/tag/di/RuuviTagInjectionModule.kt @@ -12,7 +12,7 @@ object RuuviTagInjectionModule { val module = Kodein.Module(RuuviTagInjectionModule.javaClass.name) { bind() with singleton { - TagInteractor(instance(), instance(), instance(), instance(), instance()) + TagInteractor(instance(), instance(), instance(), instance()) } bind() with singleton { diff --git a/app/src/main/java/com/ruuvi/station/tag/domain/TagInteractor.kt b/app/src/main/java/com/ruuvi/station/tag/domain/TagInteractor.kt index a2c17a29d..b1c7f23d9 100644 --- a/app/src/main/java/com/ruuvi/station/tag/domain/TagInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/tag/domain/TagInteractor.kt @@ -5,7 +5,6 @@ import com.ruuvi.station.app.preferences.PreferencesRepository import com.ruuvi.station.database.domain.TagRepository import com.ruuvi.station.database.domain.SensorHistoryRepository import com.ruuvi.station.database.tables.RuuviTagEntity -import com.ruuvi.station.network.domain.NetworkApplicationSettings import com.ruuvi.station.util.BackgroundScanModes import timber.log.Timber @@ -13,8 +12,7 @@ class TagInteractor constructor( private val tagRepository: TagRepository, private val sensorHistoryRepository: SensorHistoryRepository, private val preferencesRepository: PreferencesRepository, - private val alarmCheckInteractor: AlarmCheckInteractor, - private val networkApplicationSettings: NetworkApplicationSettings + private val alarmCheckInteractor: AlarmCheckInteractor ) { fun getTags(): List = @@ -38,7 +36,6 @@ class TagInteractor constructor( fun setBackgroundScanMode(mode: BackgroundScanModes) { preferencesRepository.setBackgroundScanMode(mode) - networkApplicationSettings.updateBackgroundScanMode() } fun isFirstGraphVisit(): Boolean = diff --git a/app/src/main/java/com/ruuvi/station/tagdetails/di/TagDetailsInjectionModule.kt b/app/src/main/java/com/ruuvi/station/tagdetails/di/TagDetailsInjectionModule.kt index 407fa8fbf..fc2110964 100644 --- a/app/src/main/java/com/ruuvi/station/tagdetails/di/TagDetailsInjectionModule.kt +++ b/app/src/main/java/com/ruuvi/station/tagdetails/di/TagDetailsInjectionModule.kt @@ -21,7 +21,7 @@ object TagDetailsInjectionModule { } bind() with factory { args: TagDetailsArguments -> - TagDetailsViewModel(args, instance(), instance(), instance(), instance(), instance()) + TagDetailsViewModel(args, instance(), instance(), instance(), instance(), instance(), instance()) } bind() with factory { args: TagViewModelArgs -> diff --git a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt index 3d37cc1ba..e1135ec4f 100644 --- a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt +++ b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsViewModel.kt @@ -19,6 +19,7 @@ import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber +import com.ruuvi.station.network.domain.NetworkApplicationSettings class TagDetailsViewModel( tagDetailsArguments: TagDetailsArguments, @@ -26,7 +27,8 @@ class TagDetailsViewModel( private val alarmCheckInteractor: AlarmCheckInteractor, private val networkDataSyncInteractor: NetworkDataSyncInteractor, private val preferencesRepository: PreferencesRepository, - private val tokenRepository: NetworkTokenRepository + private val tokenRepository: NetworkTokenRepository, + private val networkApplicationSettings: NetworkApplicationSettings ) : ViewModel() { private val ioScope = CoroutineScope(Dispatchers.IO) @@ -115,8 +117,10 @@ class TagDetailsViewModel( fun getBackgroundScanMode(): BackgroundScanModes = interactor.getBackgroundScanMode() - fun setBackgroundScanMode(mode: BackgroundScanModes) = + fun setBackgroundScanMode(mode: BackgroundScanModes) { interactor.setBackgroundScanMode(mode) + networkApplicationSettings.updateBackgroundScanMode() + } fun isFirstGraphVisit(): Boolean = interactor.isFirstGraphVisit() From c39b95539807991d3259ab13cd225325670be7d9 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Tue, 14 Sep 2021 19:12:59 +0300 Subject: [PATCH 19/33] version bump --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 57c3f8dbe..739326eea 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15040 - versionName "1.5.40" + versionCode 15041 + versionName "1.5.41" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } From 46834516250cb02b86691ffa4e3695fa51a71141 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Wed, 15 Sep 2021 18:32:59 +0300 Subject: [PATCH 20/33] ISSUE #459 Share Ruuvi sensor page doesn't show how many sensors out of max 10 shared [ADDED] counter for list of users on share page --- app/build.gradle | 2 +- .../station/network/ui/ShareSensorActivity.kt | 2 +- app/src/main/res/values-fi/strings.xml | 36 +++++++++---------- app/src/main/res/values-fr/strings.xml | 12 +++---- app/src/main/res/values-ru/strings.xml | 12 +++---- app/src/main/res/values-sv/strings.xml | 14 ++++---- app/src/main/res/values/strings.xml | 28 +++++++-------- 7 files changed, 53 insertions(+), 53 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 739326eea..030698343 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -79,7 +79,7 @@ dependencies { implementation 'com.opencsv:opencsv:3.10' implementation 'com.github.ruuvi:com.ruuvi.bluetooth:1.2.1' - implementation 'com.github.ruuvi:com.ruuvi.bluetooth.default:1.2.5' + implementation 'com.github.ruuvi:com.ruuvi.bluetooth.default:1.2.6' //implementation project(':bluetooth_library') //implementation project(':default_bluetooth_library') diff --git a/app/src/main/java/com/ruuvi/station/network/ui/ShareSensorActivity.kt b/app/src/main/java/com/ruuvi/station/network/ui/ShareSensorActivity.kt index a9252d59b..1471d95d7 100644 --- a/app/src/main/java/com/ruuvi/station/network/ui/ShareSensorActivity.kt +++ b/app/src/main/java/com/ruuvi/station/network/ui/ShareSensorActivity.kt @@ -69,7 +69,7 @@ class ShareSensorActivity : AppCompatActivity(R.layout.activity_share_sensor) , emailsList.clear() emailsList.addAll(it) binding.sharedTextView.isVisible = emailsList.isNotEmpty() - + binding.sharedTextView.text = getString(R.string.share_sensor_already_shared, emailsList.size, 10) adapter.notifyDataSetChanged() } diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 4b4ff98b4..b6c3c8bfe 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -34,9 +34,9 @@ Kalibroitu: %1$s Poista kalibrointiasetuset? Korjattu arvo - Anturin kalibrointi ei ole tarpeellista normaalissa käytössä.\n\nTämä ominaisuus on tarkoitettu edistyneille käyttäjille.\n\nKalibroinnin lisäohjeet löytyvät osoitteesta ruuvi.com/support - ruuvi.com/support - http://ruuvi.com/support + Anturin kalibrointi ei ole tarpeellista normaalissa käytössä.\n\nTämä ominaisuus on tarkoitettu edistyneille käyttäjille.\n\nKalibroinnin lisäohjeet löytyvät osoitteesta ruuvi.com/fi/tuki + ruuvi.com/fi/tuki + http://ruuvi.com/fi/tuki Kalibrointi valmis! Syötä anturin oletettu kosteus tämänhetkisissä olosuhteissa (%1$s): Syötä anturin oletettu paine tämänhetkisissä olosuhteissa (%1$s): @@ -57,11 +57,11 @@ Peruuta Historiatietojen kerääminen toimii parhaiten taustaskannauksen ollessa käytössä. Haluatko ottaa käyttöön taustaskannauksen? - Omistatko tämän anturin? Vahvista omistajuus ja anturi lisätään Ruuvi-tilillesi. Jokaisella Ruuvi-anturilla voi olla vain yksi omistaja.\n\nHyödyt:\n\n ● Anturien nimet, taustakuvat, kalibrointi- ja hälytystiedot turvallisesta pilvipalvelusta\n\n ● Lue anturitiedot etänä verkossa (vaatii Ruuvi Gateway -reitittimen)\n\n ● Jaa antureita ystävien ja perheen kesken (vaatii Ruuvi Gateway -reitittimen)\n\n ● Jopa 2 vuoden historiatiedot osoitteesta station.ruuvi.com (vaatii Ruuvi Gateway -reitittimen) + Omistatko tämän anturin? Vahvista omistajuus ja anturi lisätään Ruuvi-tilillesi. Jokaisella Ruuvi-anturilla voi olla vain yksi omistaja.\n\nHyödyt:\n\n ● Anturien nimet, taustakuvat sekä kalibrointi- ja hälytysasetukset tallentuvat turvallisesti tilillesi pilvipalveluun\n\n ● Lue anturitiedot etänä verkossa (vaatii Ruuvi Gateway -reitittimen)\n\n ● Jaa antureita ystävien ja perheen kesken (vaatii Ruuvi Gateway -reitittimen)\n\n ● Selaa jopa 2 vuoden historiatietoja osoitteessa station.ruuvi.com (vaatii Ruuvi Gateway -reitittimen) Vahvista Omistajuus Vahvista omistajuus Pyyhi - Tyhjennetäänkö sovellukseen tallennetut historiatiedot? + Tyhjennetäänkö sovellukseen paikallisesti tallennetut historiatiedot? Sulje Vahvista Synkronoidaan... @@ -74,12 +74,12 @@ Välityspalvelimen URL-osoite https://välitys.palvelin/... %1$,d mittausta luettu, tallennetaan... - Päivää + päivää Ei yhteyttä Sähköposti VIE Anturin %1$s CSV-lokitiedosto - .csv tiedosto luotu, avataan tiedostonjako-ikkuna + .csv tiedosto luotu, avataan tiedostonjakoikkuna CSV-tiedoston luonti epäonnistui Päivämäärä,Lämpötila (%1$s), Ilmankosteus (%2$s), Ilmanpaine (%3$s),Lähetysteho Päivämäärä,Lämpötila (%1$s), Ilmankosteus (%2$s), Ilmanpaine (%3$s),Lähetysteho,Kiihtyvyys X,Kiihtyvyys Y,Kiihtyvyys Z,Jännite @@ -95,20 +95,20 @@ Ruuvi Station on helppokäyttöinen sovellus Ruuvin tuotteiden hallinnointiin. Aloita lisäämällä antureita. TIETOA / APUA Lisätyt anturit: %1$,d - Tallennetut mittaukset: %1$,d + Paikallisesti tallennettujen mittausten lukumäärä: %1$,d Tietokannan koko: %1$,d kt - Ruuvin kotisivu: ruuvi.com\nRuuvi Forum: f.ruuvi.com\nRuuvi Blog: blog.ruuvi.com\nRuuvi Twitter: twitter.com/ruuvicom + Ruuvin kotisivu: ruuvi.com\nRuuvi Forum: f.ruuvi.com\nRuuvi Blog: ruuvi.com/fi/blogi\nRuuvi Twitter: twitter.com/ruuvicom LUE LISÄÄ Kuten muutkin Ruuvin tuotteet, myös Ruuvi Station perustuu avoimeen lähdekoodiin: github.com/ruuvi AVOIN LÄHDEKOODI - Olemme suunnitelleet ohjelman ja laitteemme mahdollisimman helppokäyttöisiksi, mutta myös ohjeet ovat saatavilla osoitteessa ruuvi.com/manuals + Olemme suunnitelleet ohjelman ja laitteemme mahdollisimman helppokäyttöisiksi, mutta myös ohjeet ovat saatavilla osoitteessa ruuvi.com/fi/tuki KÄYTTÖOHJE - Sovelluksen käyttäminen vaatii Ruuvin käyttöehtojen hyväksymisen\nruuvi.com/terms + Sovelluksen käyttäminen vaatii Ruuvin käyttöehtojen hyväksymisen: ruuvi.com/terms TIETOSUOJAKÄYTÄNTÖ Havaitut anturit: %1$,d - Jos törmäät ongelmiin ja ohjeet eivät auttaneet, tarkista vianetsintäkysymykset: ruuvi.com/troubles + Jos törmäät ongelmiin ja ohjeet eivät auttaneet, tarkista vianetsintäkysymykset: ruuvi.com/fi/tuki VIANETSINTÄ - Tuntia + tuntia Kosteus Absoluuttinen (g/m³) g/m³ @@ -141,7 +141,7 @@ NIMI Sulje siirtymisvalikko Avaa siirtymisvalikko - Voit jakaa vain Ruuvi Gateway -reitittimen läheisyydessä olevia antureita. Lisätietoja reitittimestä osoitteesta ruuvi.com + Voit jakaa vain Ruuvi Gateway -reitittimen läheisyydessä olevia antureita. Lisätietoja reitittimestä osoitteesta ruuvi.com/fi/gateway Ruuvin pilven tila Synkronointi epäonnistui: %1$s Synkronointi epäonnistui: kirjaudu ensin @@ -178,7 +178,7 @@ Poista Anturin poistaminen mitätöi omistajuuden. Kuka tahansa voi vaatia anturin omistajuutta poistamisen jälkeen. Jokaisella Ruuvi-anturilla voi olla vain yksi omistaja. Haluatko varmasti poistaa tämän anturin? - Poistamisesta ilmoitetaan anturin omistajalle ja anturin tietojen luku-oikeus päättyy. + Poistamisesta ilmoitetaan anturin omistajalle ja anturin tietojen lukuoikeus päättyy. Poista tämä anturi Anturisi asettuvat automaattisesti aakkosjärjestykseen. Signaalin voimakkuus (RSSI) @@ -235,8 +235,8 @@ Valitse sovelluksessa käytettävä lämpötilayksikkö Jaa Lisää ystävä - Anturi on jo jaettu - Voit jakaa tämän anturin ystäville tai perheenjäsenille, mikäli laite on Ruuvi Gateway -reitittimen kuuluvuusalueella.\n\nVastaanottaja saa jakamisesta ilmoituksen sähköpostilla. Ilmainen Ruuvi-tili luodaan ensimmäisen sisäänkirjautumisen yhteydessä, mikäli vastaanottajalla ei ole vielä Ruuvi-tiliä.\n\nAnturin nimi ja taustakuva jaetaan ensimmäisen synkronoinnin yhteydessä, jonka jälkeen vastaanottaja voi muokata tietoja haluamallaan tavalla. Kalibroidut arvot (mikäli käytössä) synkronoidaan automaattisesti. Vastaanottaja näkee aina korjatut arvot. + Anturi on jo jaettu %1$,d/%2$,d + Voit jakaa tämän anturin ystäville tai perheenjäsenille, mikäli laite on Ruuvi Gateway -reitittimen kuuluvuusalueella.\n\nVastaanottaja saa jakamisesta ilmoituksen sähköpostilla. Ilmainen Ruuvi-tili luodaan ensimmäisen sisäänkirjautumisen yhteydessä, mikäli vastaanottajalla ei ole vielä Ruuvi-tiliä.\n\nAnturin nimi ja taustakuva jaetaan vastaanottajalle vain kertaalleen. Sen jälkeen kumpikin voivat muokata vain omia anturiasetuksiaan. Kalibrointiarvot (mikäli käytössä) synkronoidaan automaattisesti jaetuille antureille ja vastaanottaja näkee vain lopulliset korjatut arvot. Lähetä Jaa anturi Haluatko lopettaa anturin jakamisen käyttäjälle %1$s? @@ -251,7 +251,7 @@ Pyydä kirjautumiskoodi Lähetä Kirjaudu ulos - Anturit, joiden omistajuuden olet vahvistanut asetussivulla poistetaan sovelluksesta automaattisesti uloskirjauduttaessa. Anturitiedot palautetaan pilvipalvelusta samalla sähköpostiosoitteella uudelleenkirjauduttaessa.\n\n Haluatko varmasti kirjautua ulos? + Anturit, joiden omistajuuden olet vahvistanut asetussivulla poistetaan sovelluksesta automaattisesti uloskirjauduttaessa. Anturitiedot palautetaan pilvipalvelusta samalla sähköpostiosoitteella uudelleenkirjauduttaessa.\n\nHaluatko varmasti kirjautua ulos? %1$,d %2$s - %1$s dBm diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3943fc6bf..ff078dd69 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -93,16 +93,16 @@ Capteurs jumelés : %1$,d Données enregistrées : %1$,d Taille de la base de données : %1$,d kB - Site officiel de Ruuvi : ruuvi.com\nRuuvi Forum : f.ruuvi.com\nRuuvi Blog : blog.ruuvi.com\nRuuvi Twitter : twitter.com/ruuvicom + Site officiel de Ruuvi : ruuvi.com\nRuuvi Forum : f.ruuvi.com\nRuuvi Blog : ruuvi.com/blog\nRuuvi Twitter : twitter.com/ruuvicom PLUS D\'INFOS Comme tous les produits Ruuvi, Ruuvi Station est également open-source : github.com/ruuvi OPEN-SOURCE - Nous avons conçu nos produits et leur application pour qu\'ils soient faciles à utiliser. Une notice est cependant disponible : ruuvi.com/manuals + Nous avons conçu nos produits et leur application pour qu\'ils soient faciles à utiliser. Une notice est cependant disponible : ruuvi.com/support NOTICE D\'UTILISATION - L\'utilisation de l\'application nécessite l\'approbation des conditions générales de Ruuvi \nruuvi.com/terms + L\'utilisation de l\'application nécessite l\'approbation des conditions générales de Ruuvi: ruuvi.com/terms PROTECTION DES DONNÉES PERSONNELLES Capteurs détectés : %1$,d - Si vous rencontrez des problèmes et que vous ne trouvez pas la réponse dans la notice, veuillez consulter la page d\'assistance technique : ruuvi.com/troubles + Si vous rencontrez des problèmes et que vous ne trouvez pas la réponse dans la notice, veuillez consulter la page d\'assistance technique : ruuvi.com/support DÉPANNAGE TECHNIQUE Heures Humidité @@ -136,7 +136,7 @@ NOM Fermer le menu Ouvrir le menu - Vous pouvez partager seulement des capteurs à proximité du Ruuvi Gateway. Plus d\'infos sur ruuvi.com + Vous pouvez partager seulement des capteurs à proximité du Ruuvi Gateway. Plus d\'infos sur ruuvi.com/gateway Echec de la synchronisation : %1$s Echec de la synchronisation : veuillez vous connecter Synchronisation réussie! @@ -223,7 +223,7 @@ Choisissez l\'unité souhaitée pour la température Partager Ajouter un ami - Le capteur est déjà partagé + Le capteur est déjà partagé %1$,d/%2$,d Envoyer Partager le capteur Voulez-vous arrêter le partage du capteur avec %1$s ? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2b7c74650..2f42e7365 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -94,16 +94,16 @@ Добавленных датчиков: %1$,d Кол-во сохраненных измерений: %1$,d Размер базы данных: %1$,d кБ - Веб-сайт: ruuvi.com\nФорум: f.ruuvi.com\nБлог: blog.ruuvi.com\nTwitter: twitter.com/ruuvicom + Веб-сайт: ruuvi.com\nФорум: f.ruuvi.com\nБлог: ruuvi.com\nTwitter: twitter.com/ruuvicom ПОЧИТАТЬ ЕЩЕ Как и сенсоры Ruuvi, Ruuvi Station также доступна в исходных кодах: github.com/ruuvi ОТКРЫТЫЙ ИСХОДНЫЙ КОД - Мы разработали приложение так, чтобы оно было интуитивно понятным. В то же время, руководства доступны здесь: ruuvi.com/manuals + Мы разработали приложение так, чтобы оно было интуитивно понятным. В то же время, руководства доступны здесь: ruuvi.com/support РУКОВОДСТВО - Используя это приложение, вы соглашаетесь со стандартными условиями и положениями Ruuvi\nruuvi.com/terms + Используя это приложение, вы соглашаетесь со стандартными условиями и положениями Ruuvi: ruuvi.com/terms ПОЛИТИКА КОНФИДЕНЦИАЛЬНОСТИ Датчиков обнаружено: %1$,d - Если вы испытываете какие либо проблемы или наши руководства не помогли вам, посмотрите наши многочисленные темы с решением проблем здесь: ruuvi.com/troubles + Если вы испытываете какие либо проблемы или наши руководства не помогли вам, посмотрите наши многочисленные темы с решением проблем здесь: ruuvi.com/support РЕШЕНИЕ ПРОБЛЕМ Часов Влажность @@ -138,7 +138,7 @@ ИМЯ Закрыть навигационную панель Открыть навигационную панель - Вы можете поделиться сенсорами только из зоны покрытия Ruuvi Gateway. Если у вас нет Gateway, вы можете приобрести его на ruuvi.com + Вы можете поделиться сенсорами только из зоны покрытия Ruuvi Gateway. Если у вас нет Gateway, вы можете приобрести его на ruuvi.com/gateway Статус сети Ruuvi Ошибка синхронизации: %1$s Ошибка синхронизации: необходимо залогиниться вначале @@ -228,7 +228,7 @@ Выберите единицу измерения температуры для отображения Поделиться Добавить друга - Поделились + Предоставлен доступ %1$,d/%2$,d Отправить Поделиться датчиком Ruuvi Хотите перестать делиться показаниями датчика с %1$s? diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 80951eae2..51ac7d8e5 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -97,16 +97,16 @@ Tillagda sensorer: %1$,d Sparade mätningar: %1$,d Databasens storlek: %1$,d kB - Ruuvis hemsida: ruuvi.com\nRuuvi Forum: f.ruuvi.com\nRuuvi Blog: blog.ruuvi.com\nRuuvi Twitter: twitter.com/ruuvicom + Ruuvis hemsida: ruuvi.com\nRuuvi Forum: f.ruuvi.com\nRuuvi Blog: ruuvi.com/blog\nRuuvi Twitter: twitter.com/ruuvicom LÄS MER Likt Ruuvi sensor är också Ruuvi Station gjord med öppen källkod: github.com/ruuvi ÖPPEN KÄLLKOD - Vi har designat appen så att den ska vara självförklarande men det finns också heltäckande manualer för både Ruuvi sensorer och Ruuvi Station: ruuvi.com/manuals + Vi har designat appen så att den ska vara självförklarande men det finns också heltäckande manualer för både Ruuvi sensorer och Ruuvi Station: ruuvi.com/support BRUKSANVISNING Användning av applikationen kräver godkännande av användarvillkoren\nruuvi.com/terms INTEGRITETSPOLICY Upptäckta sensorer: %1$,d - Om du stöter på problem och våra manualer inte hjälper så kan det hjälpa att ta en titt på våra många felsökningsämnen: ruuvi.com/troubles + Om du stöter på problem och våra manualer inte hjälper så kan det hjälpa att ta en titt på våra många felsökningsämnen: ruuvi.com/support FELSÖKNING Timmar Fuktighet @@ -141,7 +141,7 @@ NAMN Stäng navigationslådan Öppna navigationslådan - Endast sensorer inom räckhåll av din Ruuvi Gateway kan delas. Mer information finns på ruuvi.com + Endast sensorer inom räckhåll av din Ruuvi Gateway kan delas. Mer information finns på ruuvi.com/gateway Ruuvi cloud status Synkroniseringen misslyckades: %1$s Synkroniseringen misslyckades: du måste vara inloggad @@ -234,14 +234,14 @@ Välj den temperaturenhet som du vill ska visas Dela Lägg till vän - Sensorn är redan delad + Sensorn är redan delad %1$,d/%2$,d Du kan dela sensorn med vänner och familj om den är inom räckhåll för en Ruuvi Gateway.\n\nMottagaren meddelas via e-post. Om mottagaren inte har ett Ruuvi-konto skapas ett gratis Ruuvi-konto automatiskt vid första inloggningen.\n\nObservera att sensorns anpassade namn och bakgrundsbild delas. Namnet och bildsynkroniseringen sker endast vid en gång, efteråt kan det anpassas av mottagaren. Kalibreringsvärden (om sådana finns) synkroniseras automatiskt och mottagaren ser alltid de korrigerade värdena. Skicka Dela sensor Vill du sluta dela sensorn med %1$s? Logga in Efter inloggning markeras du automatiskt som ägare till dina närliggande Ruuvi-sensorer. Sensorernas ägare kommer att återställas om appen installerats om igen.\n\nMed en Ruuvi Gateway kan du övervaka dina sensorer på distans och dele dem med dina vänner. - Fördelarna med Ruuvi Cloud + Fördelarna med Ruuvi cloud Kontrollera din e-post efter en aktiveringskod. Kod E-post skickat @@ -250,7 +250,7 @@ Begär en inloggningskod Skicka Logga ut - Sensorer som du har verifierat äganderätten till på inställningssidan tas automatiskt bort från appen när du loggar ut. Sensordata hämtas från molnet igen om du loggar in med samma e-postadress.\n\n Är du säker på att du vill logga ut? + Sensorer som du har verifierat äganderätten till på inställningssidan tas automatiskt bort från appen när du loggar ut. Sensordata hämtas från molnet igen om du loggar in med samma e-postadress.\n\nÄr du säker på att du vill logga ut? %1$,d %2$s - %1$s dBm diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 32033138f..370272a53 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -58,11 +58,11 @@ Cancel Charts feature works best with background scanning enabled. Would you like to enable background scanning? - Do you own this sensor? If yes, please claim ownership of the sensor and it\'ll be added to your Ruuvi account. Every Ruuvi sensor can have only one owner.\n\nBenefits:\n\n ● Sensor names, background images, offsets and alert settings will be securely stored in the Cloud\n\n ● Access sensors remotely over the Internet (requires a Ruuvi Gateway)\n\n ● Share sensors with friends and family (requires a Ruuvi Gateway)\n\n ● Browse up to 2 years of history on station.ruuvi.com (requires a Ruuvi Gateway) + Do you own this sensor? If yes, please claim ownership of the sensor and it\'ll be added to your Ruuvi account. Every Ruuvi sensor can have only one owner.\n\nBenefits:\n\n ● Sensor names, background images, offsets and alert settings will be securely stored in the cloud\n\n ● Access sensors remotely over the Internet (requires a Ruuvi Gateway)\n\n ● Share sensors with friends and family (requires a Ruuvi Gateway)\n\n ● Browse up to 2 years of history on station.ruuvi.com (requires a Ruuvi Gateway) Claim Ownership Claim sensor Clear - Clear the historical data from the app? + Clear the local historical data from the app? Close Confirm Synchronising... @@ -96,18 +96,18 @@ Ruuvi Station is an easy-to-use but powerful tool to supercharge your Ruuvi sensors. Simply add some sensors and you\'re ready to go. ABOUT / HELP Added sensors: %1$,d - Stored measurements: %1$,d + Number of locally stored measurements: %1$,d Database size: %1$,d kB - Ruuvi\'s website: ruuvi.com\nRuuvi Forum: f.ruuvi.com\nRuuvi Blog: blog.ruuvi.com\nRuuvi on Twitter: twitter.com/ruuvicom + Ruuvi\'s website: ruuvi.com\nRuuvi Forum: f.ruuvi.com\nRuuvi Blog: ruuvi.com/blog\nRuuvi on Twitter: twitter.com/ruuvicom MORE TO READ Just like Ruuvi sensors, Ruuvi Station is also open-source: github.com/ruuvi OPEN-SOURCE - We\'ve designed the app to be self-explanatory but comprehensive manuals are also available for both Ruuvi sensors and Ruuvi Station: ruuvi.com/manuals + We\'ve designed the app to be self-explanatory but comprehensive manuals are also available for both Ruuvi sensors and Ruuvi Station: ruuvi.com/support OPERATIONS MANUAL - By using the application, you accept Ruuvi\'s standard terms and conditions\nruuvi.com/terms + By using the application, you accept Ruuvi\'s standard terms and conditions: ruuvi.com/terms PRIVACY POLICY Seen sensors: %1$,d - If you’re experiencing problems and our manuals didn’t provide the help you need, check out our many troubleshooting topics, here: ruuvi.com/troubles + If you’re experiencing problems and our manuals didn’t provide the help you need, check out our many troubleshooting topics, here: ruuvi.com/support TROUBLESHOOTING Hours Humidity @@ -142,7 +142,7 @@ NAME Close the navigation drawer Open the navigation drawer - Only sensors within range of your Ruuvi Gateway can be shared. If you don\'t have one yet, get it on ruuvi.com + Only sensors within range of your Ruuvi Gateway can be shared. If you don\'t have one yet, get it on ruuvi.com/gateway Ruuvi cloud status Synchronisation failed: %1$s Synchronisation failed: need to log in first @@ -194,8 +194,8 @@ Sensor Settings Shared Settings - If you experience any issues with background scanning you should disable battery optimization for Ruuvi Station. This procedure may vary depending on your device vendor, model and Android version. - Go to Android Settings -> Apps -> Ruuvi Station -> Battery -> Battery Optimization and select \'Don\'t Optimise for Ruuvi Station\' + If you experience any issues with background scanning you should disable battery optimisation for Ruuvi Station. This procedure may vary depending on your device vendor, model and Android version. + Go to Android Settings -> Apps -> Ruuvi Station -> Battery -> Battery Optimisation and select \'Don\'t optimise for Ruuvi Station\' On Huawei devices go to Android Settings -> Apps -> Ruuvi Station -> Power usage details -> App launch. Disable \'Manage Automatically\' and enable options: \'Auto-Launch\', \'Secondary Launch\' and \'Run in background\'. On Samsung devices go to Android Settings -> Battery -> App power saving detail and set option \'Turned off\' for Ruuvi Station. On Samsung devices go to Android Settings -> Device Maintenance (or Device Care) -> Battery. Disable \'Put unused apps to sleep\'. Disable \'Auto-disable unused apps\'. Remove Ruuvi Station from the list of sleeping apps. Disable background restrictions for Ruuvi Station. @@ -236,14 +236,14 @@ Choose the temperature unit you want to be displayed Share Add friend - Already shared - You can share the sensor with friends and family if it\'s in range of a Ruuvi Gateway.\n\nReceiver will be notified by email. If the receiver doesn\'t have a Ruuvi account, a free Ruuvi account will automatically be created at first log in.\n\nNote that the sensor\'s custom name and background image will be shared. The name and image sync is one time only, and they can be customised by the receiver. Offset values (if any) will be automatically synced, and the receiver will always see the corrected values. + Already shared %1$,d/%2$,d + You can share the sensor with friends and family if it\'s in range of a Ruuvi Gateway.\n\nReceiver will be notified by email. If the receiver doesn\'t have a Ruuvi account, a free Ruuvi account will automatically be created at first log in.\n\nNote that the sensor\'s custom name and background image will be shared. The name and image sync is one time only, and after this, they can be privately customised by the receiver. Offset values (if any) set by the owner, will be automatically synced, and the receiver will always see the final corrected values. Send Share sensor Do you want to unshare sensor for %1$s? Sign in After signing in, you will automatically be marked as the owner of your nearby Ruuvi sensors. The claimed sensors will be restored after an app re-install.\n\nWith a Ruuvi Gateway router, you\'ll be able to monitor the claimed sensors remotely and share them with your friends. - Benefits of the Ruuvi Cloud service + Benefits of the Ruuvi cloud service Check your email for an activation code. Code Email sent @@ -252,7 +252,7 @@ Request a code Submit Sign out - When you sign out, sensors the ownerships of which you\'ve claimed on the sensor Settings page will be automatically removed from the app. When you sign in again using the same email address, the sensors will be returned from the Cloud.\n\n Do you want to sign out? + When you sign out, sensors the ownerships of which you\'ve claimed on the sensor Settings page will be automatically removed from the app. When you sign in again using the same email address, the sensors will be returned from the cloud.\n\nDo you want to sign out? %1$,d %2$s - %1$s dBm From d3d7d6000bedc4be47f7b7d6b44cf49b05091eba Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Wed, 15 Sep 2021 20:01:37 +0300 Subject: [PATCH 21/33] ISSUE #462 No FI string for Invalid E-Mail given error (sensor share) [ADDED] localization for different cloud errors --- .../data/response/RuuviNetworkResponse.kt | 2 +- .../network/di/NetworkInjectionModule.kt | 4 +- .../domain/NetworkResponseLocalizer.kt | 62 +++++++++++++++++++ .../network/domain/RuuviNetworkInteractor.kt | 10 ++- app/src/main/res/values-fi/strings.xml | 21 +++++++ app/src/main/res/values-fr/strings.xml | 20 ++++++ app/src/main/res/values-ru/strings.xml | 21 +++++++ app/src/main/res/values-sv/strings.xml | 21 +++++++ app/src/main/res/values/strings.xml | 21 +++++++ 9 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/ruuvi/station/network/domain/NetworkResponseLocalizer.kt diff --git a/app/src/main/java/com/ruuvi/station/network/data/response/RuuviNetworkResponse.kt b/app/src/main/java/com/ruuvi/station/network/data/response/RuuviNetworkResponse.kt index da2b90792..cfb5ea940 100644 --- a/app/src/main/java/com/ruuvi/station/network/data/response/RuuviNetworkResponse.kt +++ b/app/src/main/java/com/ruuvi/station/network/data/response/RuuviNetworkResponse.kt @@ -2,7 +2,7 @@ package com.ruuvi.station.network.data.response data class RuuviNetworkResponse ( val result: String, - val error: String, + var error: String, val data: T?, val code: String? ) { diff --git a/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt b/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt index 291426ba8..c48ede2ab 100644 --- a/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt +++ b/app/src/main/java/com/ruuvi/station/network/di/NetworkInjectionModule.kt @@ -12,7 +12,7 @@ object NetworkInjectionModule { bind() with singleton { NetworkTokenRepository(instance(), instance(), instance()) } - bind() with singleton { RuuviNetworkInteractor(instance(), instance(), instance(), instance(), instance()) } + bind() with singleton { RuuviNetworkInteractor(instance(), instance(), instance(), instance(), instance(), instance()) } bind() with singleton { NetworkSignInInteractor(instance(), instance(), instance()) } @@ -45,5 +45,7 @@ object NetworkInjectionModule { bind() with factory { sensorId: String -> ClaimSensorViewModel(sensorId, instance(), instance(), instance(), instance()) } + + bind() with provider { NetworkResponseLocalizer(instance()) } } } \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/network/domain/NetworkResponseLocalizer.kt b/app/src/main/java/com/ruuvi/station/network/domain/NetworkResponseLocalizer.kt new file mode 100644 index 000000000..8849ead8f --- /dev/null +++ b/app/src/main/java/com/ruuvi/station/network/domain/NetworkResponseLocalizer.kt @@ -0,0 +1,62 @@ +package com.ruuvi.station.network.domain + +import android.content.Context +import com.ruuvi.station.R +import com.ruuvi.station.network.data.response.RuuviNetworkResponse + +class NetworkResponseLocalizer ( + val context: Context + ) { + fun localizeResponse(response: RuuviNetworkResponse<*>?) { + if (response?.isError() == true) { + response.error = when (response.code) { + ER_FORBIDDEN -> context.getString(R.string.cloud_er_forbidden) + ER_UNAUTHORIZED -> context.getString(R.string.cloud_er_unauthorized) + ER_INTERNAL -> context.getString(R.string.cloud_er_internal) + ER_INVALID_FORMAT -> context.getString(R.string.cloud_er_invalid_format) + ER_USER_NOT_FOUND -> context.getString(R.string.cloud_er_user_not_found) + ER_SENSOR_NOT_FOUND -> context.getString(R.string.cloud_er_sensor_not_found) + ER_TOKEN_EXPIRED -> context.getString(R.string.cloud_er_token_expired) + ER_SUBSCRIPTION_NOT_FOUND -> context.getString(R.string.cloud_er_subscription_not_found) + ER_SHARE_COUNT_REACHED -> context.getString(R.string.cloud_er_share_count_reached) + ER_SENSOR_SHARE_COUNT_REACHED -> context.getString(R.string.cloud_er_sensor_share_count_reached) + ER_NO_DATA_TO_SHARE -> context.getString(R.string.cloud_er_no_data_to_share) + ER_SENSOR_ALREADY_SHARED -> context.getString(R.string.cloud_er_sensor_already_shared) + ER_UNABLE_TO_SEND_EMAIL -> context.getString(R.string.cloud_er_unable_to_send_email) + ER_MISSING_ARGUMENT -> context.getString(R.string.cloud_er_missing_argument) + ER_INVALID_DENSITY_MODE -> context.getString(R.string.cloud_er_invalid_density_mode) + ER_INVALID_SORT_MODE -> context.getString(R.string.cloud_er_invalid_sort_mode) + ER_INVALID_TIME_RANGE -> context.getString(R.string.cloud_er_invalid_time_range) + ER_INVALID_EMAIL_ADDRESS -> context.getString(R.string.cloud_er_invalid_email_address) + ER_INVALID_MAC_ADDRESS -> context.getString(R.string.cloud_er_invalid_mac_address) + ER_SUB_DATA_STORAGE_ERROR -> context.getString(R.string.cloud_er_sub_data_storage_error) + ER_SUB_NO_USER -> context.getString(R.string.cloud_er_sub_no_user) + else -> response.error + } + } + } + + companion object { + const val ER_FORBIDDEN = "ER_FORBIDDEN" + const val ER_UNAUTHORIZED = "ER_UNAUTHORIZED" + const val ER_INTERNAL = "ER_INTERNAL" + const val ER_INVALID_FORMAT = "ER_INVALID_FORMAT" + const val ER_USER_NOT_FOUND = "ER_USER_NOT_FOUND" + const val ER_SENSOR_NOT_FOUND = "ER_SENSOR_NOT_FOUND" + const val ER_TOKEN_EXPIRED = "ER_TOKEN_EXPIRED" + const val ER_SUBSCRIPTION_NOT_FOUND = "ER_SUBSCRIPTION_NOT_FOUND" + const val ER_SHARE_COUNT_REACHED = "ER_SHARE_COUNT_REACHED" + const val ER_SENSOR_SHARE_COUNT_REACHED = "ER_SENSOR_SHARE_COUNT_REACHED" + const val ER_NO_DATA_TO_SHARE = "ER_NO_DATA_TO_SHARE" + const val ER_SENSOR_ALREADY_SHARED = "ER_SENSOR_ALREADY_SHARED" + const val ER_UNABLE_TO_SEND_EMAIL = "ER_UNABLE_TO_SEND_EMAIL" + const val ER_MISSING_ARGUMENT = "ER_MISSING_ARGUMENT" + const val ER_INVALID_DENSITY_MODE = "ER_INVALID_DENSITY_MODE" + const val ER_INVALID_SORT_MODE = "ER_INVALID_SORT_MODE" + const val ER_INVALID_TIME_RANGE = "ER_INVALID_TIME_RANGE" + const val ER_INVALID_EMAIL_ADDRESS = "ER_INVALID_EMAIL_ADDRESS" + const val ER_INVALID_MAC_ADDRESS = "ER_INVALID_MAC_ADDRESS" + const val ER_SUB_DATA_STORAGE_ERROR = "ER_SUB_DATA_STORAGE_ERROR" + const val ER_SUB_NO_USER = "ER_SUB_NO_USER" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt index 129003913..0a6a0b94a 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt @@ -20,7 +20,8 @@ class RuuviNetworkInteractor ( private val networkRepository: RuuviNetworkRepository, private val networkRequestExecutor: NetworkRequestExecutor, private val sensorSettingsRepository: SensorSettingsRepository, - private val firebaseInteractor: FirebaseInteractor + private val firebaseInteractor: FirebaseInteractor, + private val networkResponseLocalizer: NetworkResponseLocalizer ) { val signedIn: Boolean get() = getToken() != null @@ -42,6 +43,7 @@ class RuuviNetworkInteractor ( fun verifyUser(token: String, onResult: (UserVerifyResponse?) -> Unit) { networkRepository.verifyUser(token) { response -> + networkResponseLocalizer.localizeResponse(response) response?.let { if (response.error.isNullOrEmpty() && response.data != null) { tokenRepository.saveTokenInfo( @@ -68,6 +70,7 @@ class RuuviNetworkInteractor ( fun getUserInfo(onResult: (UserInfoResponse?) -> Unit) { ioScope.launch { val result = getUserInfo() + networkResponseLocalizer.localizeResponse(result) withContext(Dispatchers.Main) { onResult(result) } @@ -98,6 +101,7 @@ class RuuviNetworkInteractor ( val request = ClaimSensorRequest(sensorSettings.id, sensorSettings.displayName) try { networkRepository.claimSensor(request, token) { claimResponse -> + networkResponseLocalizer.localizeResponse(claimResponse) if (claimResponse?.isSuccess() == true) { sensorSettingsRepository.setSensorOwner( sensorSettings.id, @@ -145,6 +149,7 @@ class RuuviNetworkInteractor ( token?.let { val request = ShareSensorRequest(recipientEmail, tagId) val response = networkRepository.shareSensor(request, token) + networkResponseLocalizer.localizeResponse(response) withContext(Dispatchers.Main) { onResult(response) } @@ -158,6 +163,7 @@ class RuuviNetworkInteractor ( token?.let { val request = UnshareSensorRequest(recipientEmail, tagId) val response = networkRepository.unshareSensor(request, token) + networkResponseLocalizer.localizeResponse(response) withContext(Dispatchers.Main) { onResult(response) } @@ -170,6 +176,7 @@ class RuuviNetworkInteractor ( CoroutineScope(Dispatchers.IO).launch(handler) { token?.let { val response = networkRepository.getSensors(sensorId, it) + networkResponseLocalizer.localizeResponse(response) if (response?.isSuccess() == true && response.data != null) { val result = response.data.sensors.firstOrNull { it.sensor == sensorId } withContext(Dispatchers.Main) { @@ -222,6 +229,7 @@ class RuuviNetworkInteractor ( token?.let { val request = UploadImageRequest(tagId, "image/jpeg") val response = networkRepository.uploadImage(filename, request, token) + networkResponseLocalizer.localizeResponse(response) withContext(Dispatchers.Main) { onResult(response) } diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b6c3c8bfe..be884846f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -63,6 +63,27 @@ Pyyhi Tyhjennetäänkö sovellukseen paikallisesti tallennetut historiatiedot? Sulje + Kielletty + Sisäinen virhe + Virheellinen tiheuden tila + Virheellinen sähköpostiosoite + Virheellinen pyynnön muoto + Virheellinen MAC-osoite + Virheellinen lajittelun tila + Virheellinen aikaväli + Argumentti puuttuu + Jotta voit jakaa anturin, sen täytyy olla Ruuvi Gateway -reitittimen kuuluvuusalueella + Tämä anturi on jo jaettu + Anturia ei löydy + Et voi jakaa anturia useammalle käyttäjälle + Jakojen enimmäismäärä on ylitetty + Tallennusvirhe + Ei käyttäjää + Tilausta ei löydy + Avain on vanhentunut + Sähköpostin lähetys epäonnistui + Ei sallittu + Käyttäjää ei löydy Vahvista Synkronoidaan... Yhdistetään... diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ff078dd69..583ee375b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -60,6 +60,26 @@ Effacer Supprimer l\'historique de l\'application ? Fermer + Interdit + Erreur interne + Mode de densité invalide + Adresse email invalide + Format incorrect + Adresse MAC invalide + Mode de tri invalide + Intervalle invalide + Argument manquant + Ce capteur est déjà partagé + Capteur introuvable + Vous ne pouvez pas partager le capteur à d\'avantage d\'utilisateurs + Le nombre de partages maximum est atteint + Erreur d\'enregistrement + Pas d\'utilisateur + L\'abonnement est introuvable + Le code est perimé + Impossible d\'envoyer l\'email + Non permis + Utilisateur introuvable Confirmer Synchronisation... Connexion... diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2f42e7365..48228a883 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -60,6 +60,27 @@ Очистить Вы уверены что хотите удалить всю историю наблюдений? Данное действие невозможно отменить. Закрыть + Запрещено + Внутренняя ошибка + Недопустимый режим плотности + Недопустимый e-mail + Неправильный формат запроса + Недопустимый MAC-адрес + Выбран недопустимый метод сортировки + Выбран недопустимый промежуток времени + Пропущен аргумент запроса + Чтобы поделиться датчиком необходимо наличие Ruuvi Gateway поблизости + Вы уже делились этим сенсором + Сенсор не найден + Превышено количество общих сенсоров + Достигнут лимит количества общих сенсоров + Ошибка сохранения данных + Нет пользователя + Подписка не найдена + Токен истек + Не удалось отправить e-mail + Требуется авторизация + Пользователь не найден Подтвердить Обмениваюсь... Соединение... diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 51ac7d8e5..534d3d703 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -63,6 +63,27 @@ Rensa Radera historisk data från appen? Stäng + Förbjuden + Internt fel + Ogiltig densitet + Ogiltig e-postaddress + Ogiltigt förfrågningsformat + Ogiltig MAC-address + Ogiltig sortering + Ogiltigt intervall + Argument saknas + För att dela sensorn måste du ha en Ruuvi Gateway router i närheten av sensorn + Sensorn är redan delad + Sensorn hittades inte + Du kan inte dela sensorn med flera användare + Maximal delning har överskridits + Datalagringsfel + Ingen användare + Prenumerationen hittades inte + Nyckeln har upphört att gälla + Kunde inte skicka e-post + Obehörig + Användaren hittades inte Bekräfta Synkroniserar... Ansluter... diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 370272a53..1aea1fd50 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -64,6 +64,27 @@ Clear Clear the local historical data from the app? Close + Forbidden + Internal error + Invalid density mode + Invalid e-mail address + Invalid request format + Invalid MAC-address + Invalid sort mode + Invalid time range + Missing argument + In order to share the sensor, you need to have a Ruuvi Gateway router nearby the sensor + This sensor is already shared + Sensor not found + Sensor share limit is reached + The share limit is reached + Data storage error + No user + Subscription is not found + Token is expired + Unable to send e-mail + Unauthorised + User not found Confirm Synchronising... Connecting... From 68b16edec0f2bcced6819834a28a7a099563543f Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Wed, 15 Sep 2021 20:33:44 +0300 Subject: [PATCH 22/33] ISSUE #482 Force capital letters when typing the one time code --- app/src/main/res/layout/fragment_enter_code.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_enter_code.xml b/app/src/main/res/layout/fragment_enter_code.xml index 2324c0da5..233264350 100644 --- a/app/src/main/res/layout/fragment_enter_code.xml +++ b/app/src/main/res/layout/fragment_enter_code.xml @@ -62,7 +62,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/montserrat" android:hint="@string/sign_in_code_hint" - android:inputType="textEmailAddress" + android:inputType="textCapCharacters" android:textColor="@color/white" /> From f672ffdd7600f287025aaaccd9fe33852a901cbe Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Wed, 15 Sep 2021 20:44:25 +0300 Subject: [PATCH 23/33] ISSUE #481 Auto capitalise when renaming sensors --- app/src/main/res/layout/dialog_sensor_name_edit.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/dialog_sensor_name_edit.xml b/app/src/main/res/layout/dialog_sensor_name_edit.xml index af6be8678..7debb90cf 100644 --- a/app/src/main/res/layout/dialog_sensor_name_edit.xml +++ b/app/src/main/res/layout/dialog_sensor_name_edit.xml @@ -9,7 +9,7 @@ android:id="@+id/sensorNameEditText" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="text" + android:inputType="textCapWords" android:maxLength="32" android:layout_marginStart="@dimen/dialog_margin" android:layout_marginEnd="@dimen/dialog_margin" From c67e5900df730f3bddd580545929df7add7126f4 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Wed, 15 Sep 2021 20:45:52 +0300 Subject: [PATCH 24/33] version bump --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 030698343..859698fec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15041 - versionName "1.5.41" + versionCode 15042 + versionName "1.5.42" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } From e490ff56ef6de2fab0df7855dee5f65e5ef2bc7f Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Thu, 16 Sep 2021 19:27:15 +0300 Subject: [PATCH 25/33] ISSUE #420 Unification: Ruuvi logo --- .../ruuvi/station/about/ui/AboutActivity.kt | 2 +- .../station/dashboard/ui/DashboardActivity.kt | 2 +- .../tagdetails/ui/TagDetailsActivity.kt | 2 +- .../res/drawable-nodpi/ruuvi_logo_nega.png | Bin 8474 -> 0 bytes app/src/main/res/drawable/logo_2021.xml | 9 ++ app/src/main/res/drawable/logo_white.xml | 84 ------------------ app/src/main/res/drawable/splash.xml | 9 +- app/src/main/res/layout/activity_welcome.xml | 2 +- app/src/main/res/layout/drawer_header.xml | 2 +- app/src/main/res/values-de/strings.xml | 3 + app/src/main/res/values-fi/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 15 files changed, 26 insertions(+), 99 deletions(-) delete mode 100644 app/src/main/res/drawable-nodpi/ruuvi_logo_nega.png create mode 100644 app/src/main/res/drawable/logo_2021.xml delete mode 100644 app/src/main/res/drawable/logo_white.xml create mode 100644 app/src/main/res/values-de/strings.xml diff --git a/app/src/main/java/com/ruuvi/station/about/ui/AboutActivity.kt b/app/src/main/java/com/ruuvi/station/about/ui/AboutActivity.kt index 16db096bb..2eeea1513 100644 --- a/app/src/main/java/com/ruuvi/station/about/ui/AboutActivity.kt +++ b/app/src/main/java/com/ruuvi/station/about/ui/AboutActivity.kt @@ -38,7 +38,7 @@ class AboutActivity : AppCompatActivity(), KodeinAware { supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.title = null - supportActionBar?.setIcon(R.drawable.logo_white) + supportActionBar?.setIcon(R.drawable.logo_2021) infoText.movementMethod = LinkMovementMethod.getInstance() operationsText.movementMethod = LinkMovementMethod.getInstance() diff --git a/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt b/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt index eb1b2f439..b096b1fb2 100644 --- a/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt +++ b/app/src/main/java/com/ruuvi/station/dashboard/ui/DashboardActivity.kt @@ -67,7 +67,7 @@ class DashboardActivity : AppCompatActivity(), KodeinAware { permissionsInteractor = PermissionsInteractor(this) supportActionBar?.title = null - supportActionBar?.setIcon(R.drawable.logo) + supportActionBar?.setIcon(R.drawable.logo_2021) setupViewModel() setupDrawer() diff --git a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt index e3cfbe4a7..f9dcc97c9 100644 --- a/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt +++ b/app/src/main/java/com/ruuvi/station/tagdetails/ui/TagDetailsActivity.kt @@ -142,7 +142,7 @@ class TagDetailsActivity : AppCompatActivity(), KodeinAware { setSupportActionBar(toolbar) supportActionBar?.title = null - supportActionBar?.setIcon(R.drawable.logo_white) + supportActionBar?.setIcon(R.drawable.logo_2021) noTagsTextView.setDebouncedOnClickListener { AddTagActivity.start(this) } diff --git a/app/src/main/res/drawable-nodpi/ruuvi_logo_nega.png b/app/src/main/res/drawable-nodpi/ruuvi_logo_nega.png deleted file mode 100644 index e8881d5bd09bf77f493109e0bf67db828752531d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8474 zcmV+#A?4nQP)003nO1^@s6yPFZ%00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY4c7nw4c7reD4Tcy000McNliru;tL5CD-8InzH0ygAOJ~3 zK~#9!?VWenRmHW&f9sGn-F|kaN-vXb(&^GiBVD&Oj%i)y$?9T<*&O>$-i=4VVE; z2F9D&!oV`$3D^MW4Hz&J7!SM#j0)Kw&tu&h*aBD^SRR-Sd<2XJhMC!{K>b(~*x$*0 zBcP{~`$XUqU?lJu@Uoe;mZwyStT#?CN&O{VB@VrJlHO1{cv8~3p8DI)5%r`h z`?65d-I6xU@f@90!+0fWj-;!75UHe&k}j0=MGgI#Ea_ZH?Q$ppFYn^A|WOpfPSF%l;d#tylttIUu zX+KFvNIKd5_drQ|x;3$Zq>iQ3zAD5`C0*fel0NX6q4jbb8L_sJo;m z8kmFkC2f&ne^!??qJjPlk+fQl|+-&@l32F5x$ z4NIY>F)}I zxoMf;-A(zu6#Deb9Fh5pDU5e&8l*014fmYUD8@)yJqPmdv`sBqo;@mneO>GT}T*I!Z`??;Vj#?B-*IK}?FEU81}^1mkKeQ;)-{a8WLyD9c# zlB884m3g}cEO1N1Oi5eT(T`o-vy~6L;M2b%l6h=#GQ7S)OG~2|D(M_aJ&PpVwNfw} zHi~;29K)|t?$0bq8$>*3M|+rqdm8A^86Ns`LB#Uku?FX-YB9Z@w_QmCJjniZB1b*uIJiMu(M81kMrH@lwnCtu?cFy}P>FkuuSB;`o()JCQdgpoQ)7_EI z+j5dV_B0PW*3qAik|ucQ%QQ(VMmh)2dXoP&HTL7{9xfJ(F0?B}DEFs4$^E1n`fz`s zGw~Y*BJ$NFU9QSe7ct;@NrybAYXoy{z>#%+_XmIv^K5^`8Pe7t z@b$)gMjhWd8t~!B)*Uz@!oz8Ez*p$yi8XrqpPt5fuoNs0d?zxwZwB}xxl^j_!w$f= z0uA}Hkfh>i&Q^EUhOxkTZe7KWU4Tb`;qn;fm>Qu=+65Tq@ldK4d)E2AV?Fh!UBJy- z3-S8H_1Kp)((t}d5ofuJzn3{xb@AZ8@YshXu>(nh znmiJDdr9YzB+)q)$YU7UmcSEA@)xY@v!Rv-1bv3n%wtR>v9+YGHI8QmlFU%PuvLU| zTF2vWuUUsyu#w09Y#gEdeOqmMRJrzh0c(2f#|FT@F$ml}z4)}&v;(%S(1$fLkVpR< zlKIZSP~a*OD_h=iFz}|5+!|h-6Zi|HFNvt!&+|y6Cgf8jV zu0ye-TaBOheFKa!e56Z+i@llT-#LzpUe;oyF+P2;{kA2E$*4+MZytnxoz% zmfwpqxb%d?X2465j?awHo#*ViIT2W`#an!*ON^0FVoQ(ea}L@^m=ZIV{(KDhF1XVH zI632SeuKpP?;GPP{Cl5_#@~mCA?YBJLO;9G9Ow$%Ch2A+#gD=fx}={2XXi**AD4ul z8$xN;If&vyWoDlPZwF}VyBT|1pBA8v*}(7$pUEmMYY!rYr0)O^Whk30aWe3ES`wiy}8V0vUk-cHiBz~z(x*p%d5z3zG#Efoa53UF5rZ%z+JNG35}h{`wR zlF*aIX*M2sGC)&@ht7BH%>3UC(9|g4g(^NbHlu0&AR;n1rzn2Ez#2Id$P}QST;k299Y#ecE~LiyrKh~WG_GAXijIWO+P5cR9Kvp@(lYpJ26NjA zycyA2yEM=xE05?2{I#A+k!_L8_lP7JM2)!E%<3^M`6k>L3B6sD^(8hdNoAN(KU%&gTG9t4gvv(`xa*HW&}w)c7y&VeGFhXKG(0$esu1D+2s zo|6d^t~j8^&tDH*8E8(Y12;!N=6y(>b@Jk1J;trkF~9_p=&2bb*2FF(nI3zRq^#Zu z*o4{>npMJHz$L)>brHIxt%0L*Lsc`v(GXn^G+n8k==5%9VVIC$u*3zJ+Qqa;R8sD zFQswj{6x}VGkc;Qjpdg)IQSNjhww#0N5W+dGGjP1;Hg?Bv z!JkFAxz_W?%;q^o#5cwQS4Xg>t|otZ*>{q(R}FKzz|4l2*{{rOH+NaPh{mHDT7X+z z5vA%6I7!<92Sp~-iO%dX(3u?$1$vm-?q+tina#+_;wZJlat`u>`$;TczTw+BE`)a8 z>dvNmtReT{_dWRwpud^T&R9D?lrWBoKJeqZ4;!=h&FmMzhQKMnI}P+>72wuNnHHDS zSk8(-fNzl$f7uUM(acsev)#<>R5SavnLT1=({gy&m)c=T==l(m*%!ba0h-!EQeRIb z@-^Vw0mks8nT>1U`#;7{{C_KOqL~fNn9REX*W`FR>{qL&`BL`Nd^5Y5Byr4Hz|=Z_ zYH#3}sz}Bqd&uhTd;v)Un{CbP>t=S5nf=WZac6~+(91c<6K)FBjxR0xM4(fE{tsy6 z%VxF!=tsKI1v8yy{^tnR(a(Xka=Z^Zy7@`tqP)<|{s3(3_^uvYA*p*c2VAHPuq2)W zwlK3}&Foc*i&8r*=O8z0!puehuLNl7sJ0HM2rmkYV-hLEl$+UH=X`Z8Ft@>kZVNSN}5-AET|z?5#-F&s9WP5T-_W zaprSo_#J@vYy9fjk~UuE0q2U!?-)=(?*TiT*}XImN;1h_TP>|5wc$<@^Q~{3k@D|_ za=;px`T{i@Z)T?hn*qNfsSn=ThEnt>a1yYN^D&wi!@_aC5&INmA8aDYOJN^(`Pu~- zQN!0d06%MsWDW~>*o`7F3B48Bq*=~?KksP9#4>T;u*_xx_l3}aByE!tk*rJ@XSnBm zS{BW0l$l*%W?KW@fo(`qaUVhw=e!=Ul9}~0vs=w@Q|E z*o8zznR`Rhmc$qS+$g$xp5tl2!N5PO{7QS^-@igKF0O6200L8t-9m^w;`}<0D)X* zW-m1HA}`6LoP)e#K!7&7(_q-Fq@79Lo_*u4tdq6G3isr3SOJF?B!t?`#*;XSE~w(; zok(gG{L2BiMSy-zWEqe6C7F~6sc@Des0+8zcsNxxI4$GvSBsmQ0TB<0S1!7+;|K&1@4CjYjuma~oo zA@p(OI*<17j>!aFYUuIHbRgB402{@b5o+g9I>WVfsp<&qT)?4C2OiJxB0YiXo~-wT zBsjgJ=RV~niA+;z=#}c~7L?G-H}nP%7fFwkWGnNDtt4$*jq{l+>=L3%Gs(@$q17`MSBz?KH!oT;D)H?*B&o4Ff zrqs|Cnf&ugpmE(m%oYHD3eZ$n;J6Cpw;ix`fWG|2%svS~=4%5luvi#Ujpz(q4BRWJ zUErm$QNfn_T;S&s_27#QdRc6tQbIRwa~;Zmj! zBAvV--*&_v=HN`;`PVPlS#hDyYI=2Cq^D6ie6CMRfJ0?rPA0I_(6e2zrO7=fYue1l z0M7)F&z9~jd1)lljm6?`J>o;)i2&_fpR$&F-qOlzdcwLSB}R*azZ1dR`BG3Rd~U-K zhq@?H5_);5Dw2i{;X=5UrKKN3fC^Z^&AzjQN!p9V`7KR!U@7G_J)uv5&gpl6!$W6= zs}hxpoAqf4aIm-LWFkv4DSn?y4Lv>F4}2CtMn_3nX(|8zdx6e`5YBME#&T$&@YEg! zA@d2q0j_pIj2Kzr-&buZHRz@#^p*(a*_!h)H_Zjf%;pg$4QgkSJnf5Xv|9t)1!(&z z_q^a!JMRb_>gnfu6UJGsTLJdUXkZUBdoSWXj-~Caaa}{ap_eE%^m5F_oP(^)?nTNB zw=sSbvTRZkdPNKZb}+NiQ6FB(GeBFJSG$#O=%t2U&OveERh}+J_oV>i*i6!{PNVHY z{b60T;4|Ri0PXbh{QDui&+|&?(}8~j4$M)G{^?n3=p~_-gkH`;aW5F5we+J&3b^>j zZDuw%KszgV{{5~2#?UoqYj!S46|>FE>}pqdC{LG=lF-Y;I~Qb9I>qG=_f$A!(!vpv zdJ@JN4g$oUJNQoQ)jq%&<^^7J^%C&Az@@-?W_G5TeVD`jHmj|9Xiteo7fDGb>CQpB zCK_{$j)}Di)NH1tdjb&ca=>qZ9RtkE5Hou#&>HZ426qfFh8cnP&6OmnQ1=4%An`-! z;r#qUBfWg%i`^f=1w>1y#OAWng3Dh^4EQoNe#5M=MlW~NKrM)qb=6q71 z@!Sw_4frP95K7z3!270~nY{tL0bKJh2S^g)I4x&p^qR)r#=lJuVRA3y(Bp(}La&ER zn$6_yo6v*QQ82StfZ+w%7t?@y3q?ROan&F% zHT3M^TYCzb?dqn2Y}4D!EM&>&4mn?ASrB?Jnh=gZ)@tiAS`vC#4Lv48@!gjg2|c#; zUL-=lowglz@`4)!x96MCLsVTG8(3zW(41J4w#(^`Exp{oLa(d7O`lg&Y4 z2t6b1wg~;tedwageLgvGv)eQwq4%wZ&`Tr;VJ?hG-o8z7^=R8On@Iiuog$orMh^Cu zfDt*}|I-R!VaO7pwe-E4P{x(UJhCM8u!J7dZM=7c+M(|`h-SUJ@S2_x&Ox(k>35h} z5qto$I&OV|9(B$qkJEzt3)LKtpc=> z#S_Nuf%Z~)5s3?b58U1slGbh_`5r{u7QL6vY;IYc;0N`Qbj6)E5o^DXS31uHit4A=-?*?e29zq%8 zxlhZJl;6x6KMK&sN2S(V74FQ~8Lmhg<`WsTd11k|^A&-!Dtv6PnSD_b`d8sQ2Y9uP?}T{AJV#Qy4CUV!_*Q_XUdnhc<;6L!$maIY=kH^{l)&TLLDB&Q zp1&W_M(+B>_8KLje-$Ch>-{LJEJu>s16PG;3V5N8?~TTPZSBnoSG8+N`F8~V7-&zt zkmW`)v#G#+k?;3c%&aIyWwO6Hn9U^{hsdiXbt;-XofrRqRQT9T;Ng}nCA!arsg8lR&@MfgjeFkt>GaPGy+Z#e+X$y^?N!q+X+WE=A!L?qXN)7$1 z7!;_T>m=L)J4R&0ZuoZu?C&>$;gWVr zS^mpO`aN(9{_CDEj#tfWWJLRE3h?L1w)rqK8%A?L8O-?{;L41~dn9m8PRYEpJFly$ z_x`q16etP3GHwsK{(*l7Mo9W*N(R)b$TC*qROtH3QJ)oVgx zW8iT~gCreR>)WoR6(pS~>1C2nK-HOhZI zN#_IqbQXqxq;A7x(k~DuSy1$KpZGas~(#kHEvFLuc zhyZ8;4IPrOtM33?WYqr8fL@YLbG15RB=c1rnQve1SAa9kY^mYZCTRhF&9Xa~ z*(-V51(LQUOiXl9FbP=K%x0$~{}!j!ZB&Z3D$EBqG_$dh?x&SW($Qv}0AzdTCliZY zE(Ctzv59NV?92?uw+l&W)hspTp}^5*HYTz?u_uW&uU8FU8(?P3Ox<0Y+?TDT4`Z&up)4mq`yhZ%BFDB|=Qjt%Ggs95FR<9`y# zp%gPNbM>fW-%rnxgxh3+nMCL?7=lA0nD@!RF_9=o`v9*y$JccO68RpIo+NQtUca8p zsF_tF2img|7RpJ z=}6-E`i`XA9oeSNg_62RI$qNABpKcIt@Ec|2hNE_d(JhXJFnrhOWs&2W&@|B=-Iw3 z{FLlXb}?chaMGe$$T`8SB#|1;a*-$r{Y(5e@Yjg?(;hg^k?nhuE|auZBbD1EttROh zNw)%@kYq~SrGY-q1dgnBkC$O<)sg!Bl5Qpm!6@-1&UMcczU4nn(vc*w=^aY3|35A> zvmrU#OOqu%K-iGb*UjwZCS4<~5zW0M9Y>O@VvES+v^I$~_IzNDq<;W!0V9Diz(kUe z)!9H7pewKv(32z*XCpVJO;haCd=l^cs?XSx(5uH;zz&2dKbi+TLQ>m1)M4ITm zSw&2EfutO39&uw}Lcgww*GW|VCuTNP(!Rj+B)QjPL?>Vm_m>p}oNi_{)fOpD?$s~E z*(Ak0J}hkW;KWVm0@eOEyPj4;lR8m7Q+6T)Hsn8tBbsE? z9BF3E1CBSd|8C?*TJUc^o>fHYo7ufhMCvo0X81%z@}CTR19-Vf^|VgqF!1YCINez*`NsJ zKb531-4g|t|3qMq80DV=1_SSS`t8}k?KzNv?;HZTs4Qn@Q%J0C|3!0Uh8zZLXJ&s( zTGrvV28zb@!z?^}>J^QFz5fSWx1 z{M~MC#EuU=|Ngift%rqXcCjP&qG#t6N&SnR)2ss5f?t#6bIowYGP4mRG3w72XjlV* zUCivgoE!w_11C}(YsnwnX8)kz+viXCdG@<0C*$||c0Au*3iEcJJ_Bq^QYXBK_=w~Q z?VPkjPg_V*G5XxBO#w6e6xf@jLff1i4`n(@I@eS4W?eC}+eorC4bHLrCjm#9*;#pw zGp}Rc+?(>x4$VsjJu@3el99{@9&_@|+ANg7_HYMET39HlFHH1M_+h|FL6mSk!m2{1yxsl6%h@{<{ ze7{_rk}My|;n+J#dOzhgb$>zk^W~Ce<%r0imvo3E3oWdHDGuV-lvpI!j*?E3G$F#p zHpca>eZl8o9Z7$Rkl0_4w12rvKvH{2e`!#j<0bXX>G*d~(Ms{5q+SJHD?Qu=a7yGv zzIT>F>LTf}6b5p2@Y_f}7GY;eCp&E{ODvT1H%UiHYS(0Qu&Sh=N_sCt`OlDav!vb1 zU9r?X@=%>}{a8|;oR9x-NwZV9)NIg1>*WadR5(8Z5+CpQZ_Ai&$^TX7qM9P-w>c z-6{yCBd{H?4X{42Jc;Z5r@(mN72qv1TUaim)D~lj4Dh{8-dHBf5 zes(Fv^fY#0b6`_o4U)`fp8&6#*@sOq{xwMom~0Mo1-iJkHVJqWcqJzZbh4CTJ768R zr#AuCb9=g*lWAACr{|L7v6$-C*({QfxsfCp4M&+-)S37G4@DC8G5krn%K!iX07*qo IM6N<$f?-R5g8%>k diff --git a/app/src/main/res/drawable/logo_2021.xml b/app/src/main/res/drawable/logo_2021.xml new file mode 100644 index 000000000..285d16412 --- /dev/null +++ b/app/src/main/res/drawable/logo_2021.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/logo_white.xml b/app/src/main/res/drawable/logo_white.xml deleted file mode 100644 index b6f038f67..000000000 --- a/app/src/main/res/drawable/logo_white.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/splash.xml b/app/src/main/res/drawable/splash.xml index dcd1aef82..e5576e8bb 100644 --- a/app/src/main/res/drawable/splash.xml +++ b/app/src/main/res/drawable/splash.xml @@ -4,11 +4,10 @@ - - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_welcome.xml b/app/src/main/res/layout/activity_welcome.xml index c77d52d88..75ca61a67 100644 --- a/app/src/main/res/layout/activity_welcome.xml +++ b/app/src/main/res/layout/activity_welcome.xml @@ -16,7 +16,7 @@ android:layout_width="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/logo" /> + app:srcCompat="@drawable/logo_2021" /> + app:srcCompat="@drawable/logo_2021" /> \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml new file mode 100644 index 000000000..55344e519 --- /dev/null +++ b/app/src/main/res/values-de/strings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index be884846f..1af49533d 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -313,4 +313,4 @@ Lähetä sovelluksen keräämät tiedot ulkoiselle palvelimelle Näytä lähietäisyydellä olevat anturit napauttamalla SKANNAA Kyllä - + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 583ee375b..2805f3f63 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -294,4 +294,4 @@ Exporter les données mesurées vers un autre support Afficher les capteurs à proximité en appuyant sur BALAYAGE Oui - + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 48228a883..a6e8fa5e5 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -301,4 +301,4 @@ Используйте приложение как гейтвей Нажмите СКАНИРОВАТЬ, чтобы найти и добавить датчики в Ruuvi Station Да - + \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 534d3d703..20089df78 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -312,4 +312,4 @@ Skicka den information som samlas in av applikationen till en extern server Tryck på SCAN för att se sensorerna i närheten Ja - + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1aea1fd50..15816e457 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -314,4 +314,4 @@ Let the app act as a gateway Press SCAN to find and add nearby sensors to your Ruuvi Station Yes - + \ No newline at end of file From 181f04de78d366cb65dcd5b258ef4a3b76aa50ab Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Thu, 16 Sep 2021 21:40:06 +0300 Subject: [PATCH 26/33] ISSUE #483 Do not override existing last measurement when syncing from Cloud if newer data was received via Bluetooth already --- .../java/com/ruuvi/station/database/domain/TagRepository.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt index 80c3ace5f..72fa76909 100644 --- a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt +++ b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt @@ -38,7 +38,10 @@ class TagRepository( tagEntry.insert() } else { tagEntry.favorite = true - tagEntry.updateData(reading) + val previousUpdate = tagEntry.updateAt + if (previousUpdate == null || previousUpdate < reading.createdAt) { + tagEntry.updateData(reading) + } tagEntry.update() } } From d4f19ac8c3cd65f3ee038991badf7d626cf27baf Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Thu, 16 Sep 2021 22:07:11 +0300 Subject: [PATCH 27/33] ISSUE #444 Unification: show/hide SYNC button in charts [CHANGED] if last measurement came from cloud - hide sync/clear buttons --- .../main/java/com/ruuvi/station/database/domain/TagRepository.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt index 72fa76909..4e4ffa573 100644 --- a/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt +++ b/app/src/main/java/com/ruuvi/station/database/domain/TagRepository.kt @@ -41,6 +41,7 @@ class TagRepository( val previousUpdate = tagEntry.updateAt if (previousUpdate == null || previousUpdate < reading.createdAt) { tagEntry.updateData(reading) + tagEntry.connectable = false } tagEntry.update() } From 2af56f5e38a0944c1aa50f2ee385a134679b0693 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Thu, 16 Sep 2021 22:26:51 +0300 Subject: [PATCH 28/33] ISSUE #418 Add Firebase analytics [ADDED] event for gatt sync --- app/build.gradle | 4 ++-- .../bluetooth/di/BluetoothScannerInjectionModule.kt | 2 +- .../bluetooth/domain/BluetoothGattInteractor.kt | 6 +++++- .../station/firebase/domain/FirebaseInteractor.kt | 10 ++++++++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 859698fec..9e3ae57f6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15042 - versionName "1.5.42" + versionCode 15043 + versionName "1.5.43" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } diff --git a/app/src/main/java/com/ruuvi/station/bluetooth/di/BluetoothScannerInjectionModule.kt b/app/src/main/java/com/ruuvi/station/bluetooth/di/BluetoothScannerInjectionModule.kt index 4f6bd71af..e027d5168 100644 --- a/app/src/main/java/com/ruuvi/station/bluetooth/di/BluetoothScannerInjectionModule.kt +++ b/app/src/main/java/com/ruuvi/station/bluetooth/di/BluetoothScannerInjectionModule.kt @@ -31,7 +31,7 @@ object BluetoothScannerInjectionModule { BluetoothLibrary.getBluetoothInteractor(instance(), instance(), instance()) } - bind() with singleton { BluetoothGattInteractor(instance(), instance(), instance(), instance()) } + bind() with singleton { BluetoothGattInteractor(instance(), instance(), instance(), instance(), instance()) } bind() with singleton { BluetoothStateReceiver(instance(), instance()) } diff --git a/app/src/main/java/com/ruuvi/station/bluetooth/domain/BluetoothGattInteractor.kt b/app/src/main/java/com/ruuvi/station/bluetooth/domain/BluetoothGattInteractor.kt index 5517961a0..36f225173 100644 --- a/app/src/main/java/com/ruuvi/station/bluetooth/domain/BluetoothGattInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/bluetooth/domain/BluetoothGattInteractor.kt @@ -9,6 +9,7 @@ import com.ruuvi.station.database.domain.SensorHistoryRepository import com.ruuvi.station.database.domain.SensorSettingsRepository import com.ruuvi.station.database.domain.TagRepository import com.ruuvi.station.database.tables.TagSensorReading +import com.ruuvi.station.firebase.domain.FirebaseInteractor import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import timber.log.Timber @@ -18,7 +19,8 @@ class BluetoothGattInteractor ( private val interactor: BluetoothInteractor, private val tagRepository: TagRepository, private val sensorSettingsRepository: SensorSettingsRepository, - private val sensorHistoryRepository: SensorHistoryRepository + private val sensorHistoryRepository: SensorHistoryRepository, + private val firebaseInteractor: FirebaseInteractor ) { private val syncStatus = MutableStateFlow (null) val syncStatusFlow: StateFlow = syncStatus @@ -81,6 +83,8 @@ class BluetoothGattInteractor ( } fun saveGattReadings(sensorId: String, data: List) { + Timber.d("saveGattReadings") + firebaseInteractor.logGattSync(data.size) val tagReadingList = mutableListOf() val sensorSettings = sensorSettingsRepository.getSensorSettings(sensorId) data.forEach { logReading -> diff --git a/app/src/main/java/com/ruuvi/station/firebase/domain/FirebaseInteractor.kt b/app/src/main/java/com/ruuvi/station/firebase/domain/FirebaseInteractor.kt index fc53bfce1..30364d2df 100644 --- a/app/src/main/java/com/ruuvi/station/firebase/domain/FirebaseInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/firebase/domain/FirebaseInteractor.kt @@ -81,4 +81,14 @@ class FirebaseInteractor( } } } + + fun logGattSync(size: Int) { + CoroutineScope(Dispatchers.IO).launch { + val emptyHistory = size == 0 + firebaseAnalytics.logEvent("gatt_sync") { + param("gatt_sync_count", size.toLong()) + param("gatt_empty_history", emptyHistory.toString()) + } + } + } } \ No newline at end of file From 8bd167ee544d7b1802e2ded83bbdeede9f39d03a Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Fri, 17 Sep 2021 10:02:47 +0300 Subject: [PATCH 29/33] ISSUE #497 1.5.43 cloud login invalid email FI string missing #497 --- .../com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt index 0a6a0b94a..dcf4759c2 100644 --- a/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt +++ b/app/src/main/java/com/ruuvi/station/network/domain/RuuviNetworkInteractor.kt @@ -37,6 +37,7 @@ class RuuviNetworkInteractor ( fun registerUser(user: UserRegisterRequest, onResult: (UserRegisterResponse?) -> Unit) { networkRepository.registerUser(user) { + networkResponseLocalizer.localizeResponse(it) onResult(it) } } From 1097892233ba62d5a2f53200e69a257e34cdcafe Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Mon, 20 Sep 2021 15:46:12 +0300 Subject: [PATCH 30/33] ISSUE #500 Sensors cannot be claimed or shared if phone's default font size is too big [FIXED] Claim and share screens. Also dashboard view fixed --- .../main/res/layout/activity_claim_sensor.xml | 5 +- .../main/res/layout/activity_share_sensor.xml | 203 ++++++++++-------- app/src/main/res/layout/item_dashboard.xml | 66 +++--- app/src/main/res/layout/view_tag_detail.xml | 20 +- 4 files changed, 164 insertions(+), 130 deletions(-) diff --git a/app/src/main/res/layout/activity_claim_sensor.xml b/app/src/main/res/layout/activity_claim_sensor.xml index 9e944d80f..a689cdd6a 100644 --- a/app/src/main/res/layout/activity_claim_sensor.xml +++ b/app/src/main/res/layout/activity_claim_sensor.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_share_sensor.xml b/app/src/main/res/layout/activity_share_sensor.xml index d9dd179c9..418fe39ec 100644 --- a/app/src/main/res/layout/activity_share_sensor.xml +++ b/app/src/main/res/layout/activity_share_sensor.xml @@ -1,41 +1,42 @@ - - + - + android:layout_height="?attr/actionBarSize" + android:background="@drawable/header" + app:popupTheme="@style/AppTheme.PopupOverlay" /> + - - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_dashboard.xml b/app/src/main/res/layout/item_dashboard.xml index 7eab67c62..65e75be9c 100644 --- a/app/src/main/res/layout/item_dashboard.xml +++ b/app/src/main/res/layout/item_dashboard.xml @@ -19,7 +19,7 @@ - - + android:textStyle="bold" + tools:text="124" /> - + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_tag_detail.xml b/app/src/main/res/layout/view_tag_detail.xml index 58af7618a..45c1e697b 100644 --- a/app/src/main/res/layout/view_tag_detail.xml +++ b/app/src/main/res/layout/view_tag_detail.xml @@ -18,10 +18,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="50dp" - tools:text="@string/temperature_reading" + tools:text="21.72" android:fontFamily="@font/oswald_bold" android:textColor="@color/white" - android:textSize="76sp" + android:textSize="72sp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -34,11 +34,11 @@ android:gravity="center" android:fontFamily="@font/oswald_light" android:textColor="@color/white" - android:textSize="40sp" + android:textSize="36sp" app:layout_constraintBottom_toBottomOf="@id/tagTemperatureTextView" app:layout_constraintLeft_toRightOf="@id/tagTemperatureTextView" app:layout_constraintTop_toTopOf="parent" - tools:text="°U" /> + tools:text="°С" /> - + - + \ No newline at end of file From 8d27fe6387585c993e283616603d9240965c49c6 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Mon, 20 Sep 2021 15:54:19 +0300 Subject: [PATCH 31/33] version bump --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9e3ae57f6..c55a95306 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15043 - versionName "1.5.43" + versionCode 15044 + versionName "1.5.44" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } From d87392c150e53aad8fd1237b184bea47f748e201 Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Mon, 20 Sep 2021 18:41:02 +0300 Subject: [PATCH 32/33] ISSUE #492 1.5.42 Dashboard arrow exists app first time after cloud sync --- .../main/java/com/ruuvi/station/network/ui/SignInActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/ruuvi/station/network/ui/SignInActivity.kt b/app/src/main/java/com/ruuvi/station/network/ui/SignInActivity.kt index 46e43c5ff..d5be08f0b 100644 --- a/app/src/main/java/com/ruuvi/station/network/ui/SignInActivity.kt +++ b/app/src/main/java/com/ruuvi/station/network/ui/SignInActivity.kt @@ -6,7 +6,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.ruuvi.station.R import com.ruuvi.station.network.domain.RuuviNetworkInteractor -import com.ruuvi.station.tagdetails.ui.TagDetailsActivity +import com.ruuvi.station.startup.ui.StartupActivity import org.kodein.di.Kodein import org.kodein.di.KodeinAware import org.kodein.di.android.closestKodein @@ -25,7 +25,7 @@ class SignInActivity: AppCompatActivity(), KodeinAware{ override fun onBackPressed() { if (networkInteractor.signedIn) { - val parentIntent = Intent(this, TagDetailsActivity::class.java) + val parentIntent = Intent(this, StartupActivity::class.java) parentIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(parentIntent) finish() From c4d3d02cbc62ede2f222f92fa8865d45b352d9da Mon Sep 17 00:00:00 2001 From: Denis Andreev Date: Tue, 21 Sep 2021 08:24:12 +0300 Subject: [PATCH 33/33] Hot fix for charts version bump --- app/build.gradle | 4 ++-- app/src/main/res/layout/view_tag_detail.xml | 12 +++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c55a95306..388f36957 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ruuvi.station" minSdkVersion 21 targetSdkVersion 30 - versionCode 15044 - versionName "1.5.44" + versionCode 15045 + versionName "1.5.45" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } diff --git a/app/src/main/res/layout/view_tag_detail.xml b/app/src/main/res/layout/view_tag_detail.xml index 45c1e697b..149ca6d62 100644 --- a/app/src/main/res/layout/view_tag_detail.xml +++ b/app/src/main/res/layout/view_tag_detail.xml @@ -160,13 +160,11 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"/> - - + + \ No newline at end of file