From 0f668472a4577f5502e540ee825dd4729dac695c Mon Sep 17 00:00:00 2001 From: Carlos Rafael Giani Date: Sat, 5 Aug 2023 15:21:17 +0200 Subject: [PATCH 01/12] combov2: Use custom Bluetooth strings instead of reusing BLE ones The Combo does not use Bluetooth Low Energy, but rather Bluetooth Classic, so don't use BLE strings for notificiations. --- .../main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt | 4 ++-- pump/combov2/src/main/res/values/strings.xml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt index cbe56f27f5..39a9e6e2c1 100644 --- a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt +++ b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt @@ -349,7 +349,7 @@ class ComboV2Plugin @Inject constructor ( } catch (_: BluetoothNotEnabledException) { uiInteraction.addNotification( Notification.BLUETOOTH_NOT_ENABLED, - text = rh.gs(info.nightscout.core.ui.R.string.ble_not_enabled), + text = rh.gs(R.string.combov2_bluetooth_disabled), level = Notification.INFO ) @@ -761,7 +761,7 @@ class ComboV2Plugin @Inject constructor ( } catch (_: BluetoothNotEnabledException) { uiInteraction.addNotification( Notification.BLUETOOTH_NOT_ENABLED, - text = rh.gs(info.nightscout.core.ui.R.string.ble_not_enabled), + text = rh.gs(R.string.combov2_bluetooth_disabled), level = Notification.INFO ) } catch (e: Exception) { diff --git a/pump/combov2/src/main/res/values/strings.xml b/pump/combov2/src/main/res/values/strings.xml index 947df4df66..e1e2432874 100644 --- a/pump/combov2/src/main/res/values/strings.xml +++ b/pump/combov2/src/main/res/values/strings.xml @@ -139,4 +139,5 @@ buttons at the same time to cancel pairing)\n Refreshing pump status after the pump reported an error Go back Cannot perform pairing because the driver is not initialized. This typically happens because the necessary Bluetooth permissions have not been granted. Go back, grant the Bluetooth permissions, then try again to pair. + Cannot start driver - Bluetooth is disabled From 84f4303895ca3f0f271c04f3c632b972f3d82ed5 Mon Sep 17 00:00:00 2001 From: Carlos Rafael Giani Date: Sat, 5 Aug 2023 15:21:50 +0200 Subject: [PATCH 02/12] combov2: Report error and abort driver start if Bluetooth is not supported --- .../interfaces/notifications/Notification.kt | 1 + .../info/nightscout/pump/combov2/ComboV2Plugin.kt | 15 +++++++++++++++ pump/combov2/src/main/res/values/strings.xml | 1 + 3 files changed, 17 insertions(+) diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/notifications/Notification.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/notifications/Notification.kt index b15459c9b0..6509fb7f61 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/notifications/Notification.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/notifications/Notification.kt @@ -137,6 +137,7 @@ open class Notification { const val PATCH_NOT_ACTIVE = 83 const val PUMP_SETTINGS_FAILED = 84 const val PUMP_TIMEZONE_UPDATE_FAILED = 85 + const val BLUETOOTH_NOT_SUPPORTED = 86 const val USER_MESSAGE = 1000 diff --git a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt index 39a9e6e2c1..0fd7b2c9ff 100644 --- a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt +++ b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt @@ -12,6 +12,7 @@ import dagger.android.HasAndroidInjector import info.nightscout.comboctl.android.AndroidBluetoothInterface import info.nightscout.comboctl.base.BasicProgressStage import info.nightscout.comboctl.base.BluetoothException +import info.nightscout.comboctl.base.BluetoothNotAvailableException import info.nightscout.comboctl.base.BluetoothNotEnabledException import info.nightscout.comboctl.base.ComboException import info.nightscout.comboctl.base.DisplayFrame @@ -346,6 +347,20 @@ class ComboV2Plugin @Inject constructor ( _pairedStateUIFlow.value = paired pumpManager = newPumpManager + } catch (_: BluetoothNotAvailableException) { + uiInteraction.addNotification( + Notification.BLUETOOTH_NOT_SUPPORTED, + text = rh.gs(R.string.combov2_bluetooth_not_supported), + level = Notification.URGENT + ) + + // Deliberately _not_ setting the driver state here before + // exiting this scope. We are essentially aborting the start + // since Bluetooth is not supported by the hardware, so the + // driver cannot do anything, and therefore cannot leave the + // DriverState.NotInitialized state. + aapsLogger.error(LTag.PUMP, "combov2 driver start cannot be completed since the hardware does not support Bluetooth") + return@runWithPermissionCheck } catch (_: BluetoothNotEnabledException) { uiInteraction.addNotification( Notification.BLUETOOTH_NOT_ENABLED, diff --git a/pump/combov2/src/main/res/values/strings.xml b/pump/combov2/src/main/res/values/strings.xml index e1e2432874..3051413bcd 100644 --- a/pump/combov2/src/main/res/values/strings.xml +++ b/pump/combov2/src/main/res/values/strings.xml @@ -140,4 +140,5 @@ buttons at the same time to cancel pairing)\n Go back Cannot perform pairing because the driver is not initialized. This typically happens because the necessary Bluetooth permissions have not been granted. Go back, grant the Bluetooth permissions, then try again to pair. Cannot start driver - Bluetooth is disabled + Driver cannot run - this device does not support Bluetooth From 7886dc7e14bb37a804f6c55cd4f10996f5e1313b Mon Sep 17 00:00:00 2001 From: Carlos Rafael Giani Date: Wed, 9 Aug 2023 19:44:15 +0200 Subject: [PATCH 03/12] combov2: Validate length of entered pairing PIN --- .../pump/combov2/activities/ComboV2PairingActivity.kt | 6 ++++++ pump/combov2/src/main/res/values/strings.xml | 1 + 2 files changed, 7 insertions(+) diff --git a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/activities/ComboV2PairingActivity.kt b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/activities/ComboV2PairingActivity.kt index 8ecbda0c7a..48e7158d1e 100644 --- a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/activities/ComboV2PairingActivity.kt +++ b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/activities/ComboV2PairingActivity.kt @@ -17,9 +17,11 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import info.nightscout.comboctl.base.BasicProgressStage +import info.nightscout.comboctl.base.PAIRING_PIN_SIZE import info.nightscout.comboctl.base.PairingPIN import info.nightscout.core.ui.activities.TranslatedDaggerAppCompatActivity import info.nightscout.core.ui.dialogs.OKDialog +import info.nightscout.core.ui.toast.ToastUtils import info.nightscout.pump.combov2.ComboV2Plugin import info.nightscout.pump.combov2.R import info.nightscout.pump.combov2.databinding.Combov2PairingActivityBinding @@ -334,6 +336,10 @@ class ComboV2PairingActivity : TranslatedDaggerAppCompatActivity() { // We need to skip whitespaces since the // TextWatcher above inserts some. val pinString = binding.combov2PinEntryEdit.text.replace(whitespaceRemovalRegex, "") + if (pinString.length != PAIRING_PIN_SIZE) { + ToastUtils.showToastInUiThread(this, rh.gs(R.string.combov2_pairing_invalid_pin_length, PAIRING_PIN_SIZE, pinString.length)) + return@setOnClickListener + } runBlocking { val PIN = PairingPIN(pinString.map { it - '0' }.toIntArray()) combov2Plugin.providePairingPIN(PIN) diff --git a/pump/combov2/src/main/res/values/strings.xml b/pump/combov2/src/main/res/values/strings.xml index 3051413bcd..9c4933a7f1 100644 --- a/pump/combov2/src/main/res/values/strings.xml +++ b/pump/combov2/src/main/res/values/strings.xml @@ -53,6 +53,7 @@ buttons at the same time to cancel pairing)\n Combo scan timeout reached Pairing failed due to error: %1$s Pairing aborted for unknown reasons + "Invalid pairing PIN length: need %1$d digits, got %2$d" Scanning for pump Establishing Bluetooth connection (attempt no. %1$d) Performing handshake with pump From 80b413f398f6aa9460cdbf66d0c249b59820b6a0 Mon Sep 17 00:00:00 2001 From: Philoul Date: Fri, 11 Aug 2023 15:14:57 +0200 Subject: [PATCH 04/12] ic_blueowl Icon --- _docs/icons/ic_blueowl.svg | 86 ++++++++++++++++++ app/build.gradle | 4 +- .../src/main/res/mipmap-hdpi/ic_blueowl.png | Bin 0 -> 3336 bytes .../src/main/res/mipmap-mdpi/ic_blueowl.png | Bin 0 -> 2174 bytes .../src/main/res/mipmap-xhdpi/ic_blueowl.png | Bin 0 -> 4249 bytes .../src/main/res/mipmap-xxhdpi/ic_blueowl.png | Bin 0 -> 6510 bytes .../main/res/mipmap-xxxhdpi/ic_blueowl.png | Bin 0 -> 8792 bytes .../resources/IconsProviderImplementation.kt | 2 +- 8 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 _docs/icons/ic_blueowl.svg create mode 100644 core/ui/src/main/res/mipmap-hdpi/ic_blueowl.png create mode 100644 core/ui/src/main/res/mipmap-mdpi/ic_blueowl.png create mode 100644 core/ui/src/main/res/mipmap-xhdpi/ic_blueowl.png create mode 100644 core/ui/src/main/res/mipmap-xxhdpi/ic_blueowl.png create mode 100644 core/ui/src/main/res/mipmap-xxxhdpi/ic_blueowl.png diff --git a/_docs/icons/ic_blueowl.svg b/_docs/icons/ic_blueowl.svg new file mode 100644 index 0000000000..56d970fa1a --- /dev/null +++ b/_docs/icons/ic_blueowl.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f93cd70c50..d17b673a28 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -147,7 +147,7 @@ android { resValue "string", "app_name", "AAPSClient" versionName version + "-aapsclient" manifestPlaceholders = [ - appIcon : "@mipmap/ic_yellowowl", + appIcon : "@mipmap/ic_blueowl", appIconRound: "@null" ] } @@ -157,7 +157,7 @@ android { resValue "string", "app_name", "AAPSClient2" versionName version + "-aapsclient" manifestPlaceholders = [ - appIcon : "@mipmap/ic_yellowowl", + appIcon : "@mipmap/ic_blueowl", appIconRound: "@null" ] } diff --git a/core/ui/src/main/res/mipmap-hdpi/ic_blueowl.png b/core/ui/src/main/res/mipmap-hdpi/ic_blueowl.png new file mode 100644 index 0000000000000000000000000000000000000000..edb03f42a84f5e295d6f5eb5cb4541016eb22b42 GIT binary patch literal 3336 zcmV+j4fpbiP)1^@s6$I7^K00009a7bBm000XU z000XU0RWnu7ytkO8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?43$Yl zK~#9!>(5DPoEmAgCQth)p7Gu@sWf&_A%i z1qM5ofC)C$(vk$i%TY*3K?Nj61PZk>Nl<9*nA`-cb*7IbyrFP=e%sy6*|YDxm&c6X z%uepzyXQOS{LcB_XA>0)h3HmN+`DZV%IA*B@eQ|fEKxTD40*zS`AT5dL>k#vr;QIhA@om`OdxXIeeFF;bv} z1%@mRrDh;p|MCo7*;zqX_q|D>^Jl#evflvenfWC3dOV+jG}sE1!f?dLGZ+jAh(eW- zIE2o1(UqDCx?EiraedS~r+|9R$fv0OF=pbE%K)jpDPY*`2IzuICB>GaFmTvN8lId& zL*o;q?>SQ*qQA7X(ube6P#cN)r(NO-3>gS$^c17tFIShE z?uNk(fW<#6qM47+pt!g=+rBzFI%xaO8hT|zC7t@?A;V{S&B&wZ=a-tXXo4kk1BhcV z7!ZCL2tzAzadk0W-M>S3f7rM*DqppNGBPqei$+631I>G3sUavmAAW-REGn_GIsl|G zVqkayq9>E-veK7nZhoHb`NqaZs(rVfPXF^il328~25E47Jbf!Mk%oNzPRgD?cb5nvE+<~v*n{8)2u=I|!Kh~qS%SaIQ1 zF_BRU+JVuPnW(WKm%2K1USd&E5haaGruocaQsf;ID1Uti9e8~U&3gW)RLw+z7aM*z z0Lao+E2Y)OBozyVU~ciU0A1|rloaRFEY9I6Iwnq|v}5+QI!O{GsJ;ilz!kecn9Ht^ z)y0%jC@LySy;3r>LOj*f)JXT2tzHu{qpdr3hN5F)L(^yF82*m?_#MxgQPD4!O8tn> z+&?8tGd_&hZcdoDf`LyE5mz+kKCS7R5tZLoX&C-q#6)Wx=tvXK- zFZ7e2r;U4(Qv`qNyd%?IsL>g6+AhVe6;gI)1o6Q3ePz`O&Aqt6@zVB%{PTbynqBqV z4H_PcURopF=Yc>w=!;m!2mBOL`r+?I`=WIIkONAQ=dbRJY%fmG)YLKR=N9=$?P?!{h2_DAv|L9oGB~&=iFW+Qk4CiRX*{ zPBb+|!nw@|8w{Slc4r)&>+H5H4}2%d@EP9xnq|0nz(nHt^8G~w3|U@06?tIlc;y9G zTOlNMMvhPG-bI6k(C>b^QvJSd?*T)e{QdG5S4iy?0zW=kg#Pa5lsG>gmlO*eurnOH zkD_~v1g=8JP(eRz+gYRDYd&<4jvqfx_4W1i@6&B+_6iPF?Uri8K5$=g%-~s~9omBr z_^F_=e$XFc7o+h=G0NS;T{*HoHzE=xfYIL8tpJg#1LfuBsbMw<0PqeK!~i)CvqTT> z<9A+M(4J2Nfe9c{hKooE|`bJV>H-^4&GqUEPFvV5L^M3oCbAiej%{S3e_eSn=~>U5zAq zK&;Mk7`2B#p(_Wl1sF7Z6kR&osjH6E}hmoNuAf!QFLIZZwi4w z>F$gDV|*r6dMoPic^Ons;qb_dYhE^tTaY9cQ+r+se8A7BXpQ2u)%e_qNrP*>A#{dP zAD_+>a}P)uI~5y|Qm14|?fHtDm<$#Z%RRh-(cqI)edJbDP}|hxAQx+o22@p5X%e<@ zr7JFhfTqOD?;Z`!w1Gcn;5_oibtY<4c%45Juy1qc0@!mv;tw z@RSTdC7wUOg#qu`x=9sQhCEM=GNgEs?_@b?Qg~g(=5uyHyvZF#H z9!%GmQwN1+E6QVFREe<(lxSxpb_WLf(%NoEtZqxU`;3|hzruDvi0#2w^ee*H70R(| z((DX*cLd0y0&hj)*)AME`fGEeDh^1>w6wOWW)b=X37n44PuqH)yoI_a*{_LbY>q$L zk){$ag5jv%YD7lIn&5Tvc}t#998zi`RzVrxJ~=I&K0eaDD{yQHO4Fm0rLD7yA-w!U zsTa-|ka*e-1Lws>wPQ>??0|r7;e#^p;ei05KaW62o`87R&C|&pD>6D0ip(~jtHjZQ zza6tSgUE<0-YBfo=+UEfk!jz+dapnjp4>5uT64Yj0{Ml_=V{VZZMM7Uhk2Gfe)Ibc zDiCOg_L>#M+416%aDw1m$C)nq6{s@L;v%dVlw^9=H1#_QL1x)7+~*5LXeTOJ@DD>g z%FJHzGRW1YWW5lG5WGtU|9jQ0&z< zuW^eQ=Hu)IpZJCUfWxkmW5)jS{sf*Al`Ql`7(PWC*%ZveK09t_ZZE()%fA1x@L_3O%1XAGsoSx;(#L`2$`d6{9D(eTcWM*nK)BE6OIM5GINVi^&}$Af$xNO#s3%7#tu8UX-e& zPz9G+1jGyoyeZ%jh$h*?bX*FF_&aJ=gtr(kmMn7oyv-{UR&?XvQ4>HheS0wyfOrHV zthX0E)lFovsg=cMqnmb^ASQYPfY>ODMXlF4-LyBJjdqCm&Whw_v*62R-Q)Inab6R(Q5T-&?fWjgiIV+l|Ca;{Z~(|x^Z#df0E&;6ZyEhhfB^t%EDurJ S@b63j0000 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 literal 0 HcmV?d00001 diff --git a/core/ui/src/main/res/mipmap-xxhdpi/ic_blueowl.png b/core/ui/src/main/res/mipmap-xxhdpi/ic_blueowl.png new file mode 100644 index 0000000000000000000000000000000000000000..b66df081d58818a52ddea3ad47f30d105cf793f7 GIT binary patch literal 6510 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 U{XTxCKmY&$07*qoM6N<$f@q}@ssI20 literal 0 HcmV?d00001 diff --git a/core/ui/src/main/res/mipmap-xxxhdpi/ic_blueowl.png b/core/ui/src/main/res/mipmap-xxxhdpi/ic_blueowl.png new file mode 100644 index 0000000000000000000000000000000000000000..2e220aaab0f97f95c5be6015773bb6930262b330 GIT binary patch literal 8792 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 O0000 info.nightscout.core.ui.R.mipmap.ic_yellowowl + config.NSCLIENT -> info.nightscout.core.ui.R.mipmap.ic_blueowl config.PUMPCONTROL -> info.nightscout.core.ui.R.mipmap.ic_pumpcontrol else -> info.nightscout.core.ui.R.mipmap.ic_launcher } From 8ade0525f2c04009e577d7e9994255ee847c53e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Aug 2023 19:45:44 +0000 Subject: [PATCH 05/12] chore(deps): bump androidx.preference:preference-ktx from 1.2.0 to 1.2.1 Bumps androidx.preference:preference-ktx from 1.2.0 to 1.2.1. --- updated-dependencies: - dependency-name: androidx.preference:preference-ktx dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ecbc499da0..9fca843e97 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ buildscript { material_version = '1.9.0' gridlayout_version = '1.0.0' constraintlayout_version = '2.1.4' - preferencektx_version = '1.2.0' + preferencektx_version = '1.2.1' commonslang3_version = '3.13.0' commonscodec_version = '1.16.0' guava_version = '32.1.2-jre' From ac25a048f0d7753eae8eee1a4bd1c29624c572df Mon Sep 17 00:00:00 2001 From: Philoul Date: Mon, 14 Aug 2023 14:37:02 +0200 Subject: [PATCH 06/12] Create round yellowowl icon for nsclient --- _docs/icons/ic_yellowowl.svg | 86 ++++++++++++++++++ app/build.gradle | 6 +- .../src/main/res/mipmap-hdpi/ic_yellowowl.png | Bin 4769 -> 3340 bytes .../src/main/res/mipmap-mdpi/ic_yellowowl.png | Bin 3127 -> 2166 bytes .../main/res/mipmap-xhdpi/ic_yellowowl.png | Bin 7137 -> 4242 bytes .../main/res/mipmap-xxhdpi/ic_yellowowl.png | Bin 12994 -> 6480 bytes .../main/res/mipmap-xxxhdpi/ic_yellowowl.png | Bin 20028 -> 8786 bytes .../resources/IconsProviderImplementation.kt | 2 +- 8 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 _docs/icons/ic_yellowowl.svg diff --git a/_docs/icons/ic_yellowowl.svg b/_docs/icons/ic_yellowowl.svg new file mode 100644 index 0000000000..8b739a831c --- /dev/null +++ b/_docs/icons/ic_yellowowl.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index d17b673a28..57bf122073 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -147,8 +147,8 @@ android { resValue "string", "app_name", "AAPSClient" versionName version + "-aapsclient" manifestPlaceholders = [ - appIcon : "@mipmap/ic_blueowl", - appIconRound: "@null" + appIcon : "@mipmap/ic_yellowowl", + appIconRound: "@mipmap/ic_yellowowl" ] } aapsclient2 { @@ -158,7 +158,7 @@ android { versionName version + "-aapsclient" manifestPlaceholders = [ appIcon : "@mipmap/ic_blueowl", - appIconRound: "@null" + appIconRound: "@mipmap/ic_blueowl" ] } } diff --git a/core/ui/src/main/res/mipmap-hdpi/ic_yellowowl.png b/core/ui/src/main/res/mipmap-hdpi/ic_yellowowl.png index fd2d6dd22dcfce17169fcb6db930bc74593f46f2..e937e70c3373aefea626243c02410f6ed5c23af2 100644 GIT binary patch literal 3340 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 diff --git a/core/ui/src/main/res/mipmap-mdpi/ic_yellowowl.png b/core/ui/src/main/res/mipmap-mdpi/ic_yellowowl.png index 962fd4a84875fb5bc03468843982c3db310c2b24..e31afb9febb0d109c169173741805a59d6e1e2d6 100644 GIT binary patch literal 2166 zcmV-+2#NQJP)nGplKRiC_1*Mms@0Ri>A<(Iqjhf)lb6tfEFMt@+?z)b^W3d+N`sx}0H&)aQ}}8a%*dR&@yAMe>OOg#QuH2Cztd zWIX_W^2ML@<<7Ho@;7^3y#??IV-jiRq$D1Qf!YAPE8rc07J&2gSxGm}>XOpav^RLR z%gZ~`lSsvLlg;2U^92I9|GYs9z?j)p#=2L_PSc9AGf{j)2KA-s)27h4+h%at=K>4$7)rJnbCJGeFs5cG_a**#X za67<0vy$aSsRqEQT77*z13+$`J-Y-xqa5_ew&J-dR=|CZKnunKv+%x+7e{q2J2ual zlLVlfH+`sp8{4*5^t1wA5EHauaElZ+3r-xHq!h1O`4V@Cj=KWZoTRxxpRCInmShDQ zc-%&uW{>YP`e4vczi8}(LH+usk$2$}k#qU*F{-VtrQ^qsbHexRSraTbJL=86@GKzc zgI*BaC;Br{A05}Z-b0Kg&tjC?Lo+&;-?;H4VTq-=fLdEywV|2mkxeLal#~_|7p8QR%m0&K!`a6iPaA;)J$fUcRu;p4!+^nY_W$ue)4Z`t(B8K6UbV&OxY0 z`?IN^K2yxFQ9BsZmvi6Hr-%tMdPECZhAAOGTf^vD6KZrYSw3b&o4(4iv~*wsXV z-3KVxc#wj@Z)r~cbV^H0qw1RNoTH3-wC~vc11Efk+uB)=Br$kpA~uw(<5V{7wc;|` zS6=RD&MV5_63cUz)~&DN@~Rcj3Q$1?xNdzl1p>Rc3_^}F>d}sJCvO$&VSRjpW<>>F zHsm#e&a(u4^jzWEZJTIe@pJq==e~)w=}30CDlc2j-~F#2D(tR9-{c)!2B95%NJaAt zxej_lp_Z=1T3LuTT{brjTY{O?e;WzJ*1f-lh79gU`S(qw(%0TqD`8$45Zb{9{_2`q zu7e(r=ccX(i5{1oX@D{ffqOXI&iSR6T}R7GUSdCsnQCYXDf`Bv!>zz^holuf~zq6&m*Spy5H8w|LVYk~&Qzj0lnyueZ;oL_Yb#k)( z3@v}&$H_=zaxz&TNb1K0!HIdK#o~}lh1r$MT>8dG)Vo)*txQA10rLC(RK4XZ`&AV3 z*b~yMpx*Ke>N11%OP*kAk3UJ5eXa-n~c)p5%|Dw z1Ppz0MbM9N^V<yY|h`N~s~Lq>Rls;Vl=%gdwCPse%oCQrx~wwhwH-4w2` ztgK`{@Iww>#Hi2QPYm)WAix$Mt?@W-zWaCj`Do;LZE0y?dvy1^g3|k4#T!c6XUx-7 z47BLc`>CPvdl8TS%H@oV3~syjss!4%v8NNz{ayMSTSNTWPEy}X7e`#3@3psS=brDl zqL{u`1Ti9?HNa$yG4d8+~(NS0meUc6PSfH~ThTn0M2C-LBnWIiE5JNJH1zEv+X z$fZl3f%Y_!SSy7r_`wy zZ1{nJU{fKVHsuzo`Ml27EWqcQSdc2A6908ms1DSX1)$af!1xt>qJxO;#9SHUSIP8hnw&w=9mPB4(ibkKDnul z@^Q#({`Fz`)a%3rg7BE`eW63yw?FWW0*J6x#u$1Za#K#j^C#Ra6F>V ziKlgG>1lfB(=+PG_6NRZ;5bxpWXlV!3_W4TFfRwRP5>_G@}s&_;6=}O(1xvls-P&? z)S|9bo*@}@_()gy-p-c*8Np%WRj%&g#E#?s z3F!7emw3R|7!M0hn}!T>#vs>-9JRe8K-C8odf$r!og5 sstbh8%>J|g5&zeJZ2t@Y#{U*z0L|-lA4SF1=Kufz07*qoM6N<$g7K;|fB*mh literal 3127 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 XEvI*HJ>T1;00000NkvXXu0mjf_%hOV diff --git a/core/ui/src/main/res/mipmap-xxhdpi/ic_yellowowl.png b/core/ui/src/main/res/mipmap-xxhdpi/ic_yellowowl.png index 8f6166d44ed430becb9df8e89580cf3531cf5d49..bcc0263e88cad15f816c69e8c673a715db13c07c 100644 GIT binary patch literal 6480 zcmV-W8L#GvP)|G0xR8@LD3=FVFU}TdD77H{)vbumY7+);d4Xi0Nz>K((Rlw=N#cYAj@G>bN zKr@KCrN|5{Bw3bu2>3vR9%luT4bUSXK1%2jF}vjkW<*L;+28=y%1g-o?%dP%H1|C2 z>)hM3{#Dl=>D%|7bMANl_y3;`SFT(k?VbMTt!@R{M_4=PC#8^aWK)xIP)cb>3qJpH z#MzeizFr;L8z?jYM757-#siOdaGQn<;3PGmB)?^7Ow456mNduGjuw z`^4Y)&IPK)9D@jsK!L(7FaQ9%-uznsJo@{~u8$L788NIQ8FyDl{jdQGvrxi^Vrk7*3`dI|?K?0l32YEtiyX1uNWR#^g>q_pk{L zD5NpJoMOsBVQ_~UyQU>L!;;k(0tp5)aFmyJCVzi#Cnu(COf}a~3JNFO0Xjq3it~XG z6Lu8S^0Ll$l~UzgLm4PEKtPdPYUj7lRb3z}t1dbo!^k`OlW_PJQc%#148LuH_F14G z;qW&xvX+(>l1ioYzYo2;lQcCQ*Z%)~vj6Slj_*I?fqWetHffm#jCi{Mg&{8B$&0Aw z4nuy>n-o9%5E=8g54L&mb_rnF^B*sf+816VM?N}fn`=}q>SEVYK_ITkYjNT!C^SHX z4M12H7ceaW2&=k7pWfX`EH<5#JW@(Rp^#^DYiepD+h408l@+VWCnv2vBZs<1vjL1$ z&Vj;+Rn*uqHK9z-e(JoX-;BERMlxsKVp25eLFGC_GMOYx7tJL54*u5C@8(U<*G*WP zrfbZrSc)g0&;SwBKC12f7TjUW&P(zl;->3K<=V|88jbp{Py!rfk4>{AS|;DqNf#$J zsYC-tjob6c%T+*h@0L%VU->j?JbE$^fB<0}jUS%S$A$695ax?{+oWn^y@SgsoLCrE z05Rd7+ez)_ox0^JKSSZj->?ohv#0#Z@AR%i}G&xni)lOsnz5&ALyv-&%FVvkK4=ERR-8x%$kM2gr9d6z6W zr#q-bY`S6p5iTHfg>LFZQom!r@7BkJdq!yU=CUv#xQ6!sNbUlpKq02Oy`u^prOWd z@*Wh1Vre^VZgHhJ7ouvzIw2sYKQdEOCNGj85|rFYKc1qGlSPK1zNKDypy36 z+i`B?Sp-DLF8ZjoA#zYnn=+AW>QO-C0%4pyU_dc_eC8CPs6_&@1FA5dn>UK4cJU-} zP@6gFv2)ziddS(-kz-6fB9{P>NqhF}VY=d>ctQ{1i9v@-C#XSFI-{<03Jnmmod5!| zQB-SDvvC^}5K!K75fC~@C>+OBJ~3a+TcmV4zT=EER~hve~7i$jNWfB^%z*MLLI zVQopB28trb;=@R`byU>*%1*wOF!jN4+#r+PNF`;@P+Xf%oFdz{ZWj6n%)kI^2)~~* zFK!DE)Y{8G-});Y@1UUHm)N;KtbXGV(L%EDg^|n@)sL*uEBC1 z;oo5~;5=1;NOKEqJ$QZ#ktbNjsU`AVh+?#Hrz1e2FV~iTbdl|AXQty*Q6Vd4;3G&5 zxaq2pw$%_l2x)j$M1^QQHod%?`Tfo}FX^?b4hhe-#uUN+g2d-VU{#i18#uHp`DmYW=tcR{L9Z_UNI&>l(NJnzz%6Sdw|JUZB z%7)fub)I)$y~ascol>&~ijXuY3=MU!)4PhYs(7Bh%m-08{w}ibtq;=+TpWvW>pBvN z1lhJ_ZJG^(15{L0N@q&3I7+N!x(2xOXb2%a<<;0g;(|uz1mI%`99ZEw7<(6i=Oy zX7Pxt)NZt1DuHaSBl1W2(d2AcNVJ@f8Z;{9FUb@n3 z3~hyYUO^F2Ku~J{X>V2(I6OEc=>QC%jhkQBAFx#&hCWbS2iLQrgkroHH^z^7U_O`^ zz``Tm`Zx%uoB1t5GA3!vtvm8+K*K|a3gv1mAo6uzX$|}`GWSm%Z3;;BbFdxhdRQ1ahw$?}I!XLZVr=y?o+?kxh zH7;@D^UFf-9qS=elW&=3O7gf#WaQ1HXV0FxrjDbaM^~=S02VIuKw7_lG7U_g=)(PQ zUpfZ3sUtu90XI)`&J$1RpRkTtx`oKUa@yTaJ~19Bid69|ra8I&<+Kli^)U2=-Jv(8 z&D6BGI(tFa8H%T|r&03LQvI`G-+SEg!8w+Bz8T>@xL>vt4V(y`QWh{^#$tYE-cVUk zxJ*T+pm0-kIH5!D?J+D5woEOX^$@q%hi7FJ-S?ALPImGPlhxy4((BXn&8!mKhpA6# zzb~3FhGSW^&X3l#`b=#^NG7L<24Qq)CDi(+^kqIUnLZGSZLctO3mOPxfr7GhoX657 zs(!UfI0krMS=@roFWJB@PoUgH5k<{FQA7enEbTjW_-(1*ANjA(nBUzzsJGNLc<0Gx zbS3xxyXn98{ENSC{o@KdN1~wnpZOv}GC>gu5-5)U{sZ%cx~`Yh??p8gPD%Fqq5j`D z{r4~a(Ci4<9#EtWC}gs6R1*SAEL&fO?)u?i_FFFKbk}tJx5D!#jvpiKo3JuJKZ)Xi za*A+J23AmT9aq-Mq^*JG{^N5@okT>(K7LPlemTcnri3Uk%Zf;)8r#e_AQbi$6fFBZ z93GmM*{pL`uYFOI_x;&Eh7IeO=Iq|x)&gRz^YO589~O-oF<4LKW6hnKymY>1ei*+& z5mJ43)*FbHLf@Eu|HiZ+Qb+zKmx6Oq9Rn_L zjH_Y)2TaQaz8GrqX3p0ND0;ZF=g3u9$A3C`rDP7anTnptZsYN|w($SJTwFX9D>)Kq zHDoo-ALrwDEO$G``@-fOmN+Dmg+w}sD2nPZ)t{?u=2@*Xl-AA#NJg;^OEIHw9THl~ z9*?;)9=v(+_!3*c#qVTv5g9^slmZj;Wa%7!IkkX?JU>K-ZjycR2Pw+|UPHX8PW6|< z2~pcs>i8X!bwqEkh~NdyOta%zNG&aAncpE#(?ilh;aLtlO5NBx#rw?fCOz=ewwA=a z1?e!h9o;1|a)_{VOeS6T-9A_Q3_dz3Y)Hc85R2ztRSTOvPucb9(<{$QP!!~OX?gVM z#{Lcowk$G>H{cB$I=GK?f(+hjJP0&4vDzVT*ey|}ei6OvHvPJ?Tm$1p)Rbm#iRLM@ zK7$8(3W~6&SLZ21(7ss<3&qmR7lDV1@HD`&YGwSYw^pwkO(e*}58X{d{dyS@Om`cb zocZ#SeqCH2+{+B47#BnZz<}|Z#cE(Fu@q>`gBS4Y-pyOl-pR|04;~2dagoc~S^k8% zPdvq}!Uj0zJy8x9l5bufJT!1Gnesz3;uS%OM3f6V9C8V-a?~?UaYLRh3xrxBG$E$F zktlJ8w=N2Fim0boN5KluG(CLyUB2UJ?ThUa6ry>duLjT5ccBnS$SFLf5yRNGpsrpX zw-EJ&$~D4#L_s}XSf00@IRuK1T)8Z=CJ;Zc+Ec=c|H8_@JEiX3x-jD*nbwM*`h@3- zrpzR^Z{5I^ue2u=uZ+$vt$KE0`mN23HB_(vxhHFps1t8TA<`$>1tN3$fh}O|1N-BXKHiYL9nt#X=Dz6>XBGCaypx6G1Oi-kPz%9_=LzZYI zIh3~`(&7a_vs|Gr5*;ozDUqR6htCgO3zc}U*LM=NI&C2FmE0pREiF8 ziafhp3VC6Lh$_K(;sosikhH5hh=%*&zD{~>isn6Ia=xqfeDHlgYpzk zy8Ez2Cg9&)}A67l85d@*_kFHrA{AwaP?? zzPNgKJYz42RVwZ(+KUv6k3~0Q#aQ6*&_Q~3wUu3rL9{zBVhae_qvvMxiT~AfnJ=&Q zFWhuJ>CvOBcCR6%{|#X>dTfy`Zh(a2__F2NxIZkl73oSAW6RyxzRE`fDeJOI)H&NB?ZqHW4IlK`jxMHBnI^FYVBkrn>51xT0X+k z#6+`n+Mg4peosDAZE4rSW#!K>xdar^0CI^o&pn${z`i@Iax@}t!PDSDs1}ng3*=o# z6p)f7xV_=!l(C!w!X-e%G)|E+U zX_L6W^@&R~X9B`Ze1K|HjtC1;Udn$n>UZpCDvYo)L=jSSmto~dLdI9FUgyeOcr_gu z|Goo!AL0Dz`6^x7%;$a8CNM@5ljEvKCfcTw=g<=E7tY&(NVIdXEQ$7M7l|hq_Xe{{ z{j($Gc_v;hoKUBFWTKsJu%N8g%DU27xt96%vH*d%*9}1EuUqXVwsI*Uo?P1L$12sC zrA~OdhnQ6=S#VCc?|)cl?%lpwTvV3v-d;BV0pQ`jcE;;7muNNv1QQen#Z`|IDQ7b#^ZotU z&Vkhf3jj#e?MPc2ysaVJsy5>R597?d4Py7 zUFZrR^vW-ej|AfrwN~;;YzUt#7Zk>}$Bn8-j7q2(59ABQh}G>RAvVgFKjYlD(ycS8 zt4}h&$GAjd1M^c=@s&l5tnI9&#D|}j2&&Y_YGQ=vy8t1RS~mO2Eo)=j*3Hbo8i0rB zDHl}NLTr4;4@VW#;;WJneqrwd{7W%OrH>=jjn>87*>BVM}UJM!QFJ+IWt{6;K#n zFW;0-QJ1~?H}(o!HPel1o%kbI4k~K#@HU#G*2eO(&cr8*%NBkKb&4$g0<1^*wo)hy znDqEL?vBVJ{X*~A8M%X-%fK^%lMU~1uPxFeK(DRo>X&lapaCK(d$QI1@t7ZC1ZnPw zAc`m&8Nu0HCQK4__Tn5B6_wmA7-aMaIH`OB#A#x26JkrCFxZbT_5Y}+6v^T6mJJ( zJYd;|CpeE+i3W>CAsjJ^@`##yJegSk)xdI4RIECLF1CA|Gi2w+$aGt5kBm7PV5NI8c>ws_-6n+8& zil+=PV5(XL2F@47G^k>!xOIRhfN&iYegXrUzKlg8@?m8AB4hvoPpeN^RIUTURh_~_ z$G|IDquP%#>9KRY-MIo#b5Xw1)UtGftj-eP3%DIDYoPxnMmJyFr z{G4(Og@8D1tVh@{K={fjvbaWwv}TJJ2aRLE?1W=V0U#hM;wrb=2s9{Ef&;)PTX9~> zT&12$kNpsV0Ye}`p%NU(-rBYA(p61T==KwcV|X0g3LF>$4T>yq#Ehe#m)zsDCQ|zJ z@_bvSW<$BI2_hJB0u)&QDKfxONOF(r3?L+OVX!#^iVSeTZC+#?g#iZwK#=g-E&V4C z3I+#>8plu{hk}%Pn32g`;Rx*(6eb{{00|j~7lAkgrkac+>8DTOTTnO?IdGKGPf8Rx q*+d^WC4{LV0#dmq3hdDT3oronAJ_Z^xldyN0000kL4?Z@k=|#^$}5SmkT};-uz$oz%PqNzMPx*W#r~Enn$t<&VBrua!2G`HF9R z9U>8_sK8T`VyQ(_Pc55!YTq`bPVGE(-X^3SwhgIEr;u8<@Z{xWMzejgipP0S2&qiI zmdMj=Nn_h=Sp6_Bx?Qu{Ua8iPYj0%PTTS}=o_B|&U4BBkzxf3ZxA6TBz7{S?YTiO$ z-!4w-yYGFiSm|rUDqpMC_*%P;kF>tjS81747LyVQDY^0XL!J~4OVNl_SSU3rlo}U# zYFg~6SyN9fno6x>T=VPo1{*w0(z=I&B?N>z1Cvq1rA{ZjSfz8~L+8>X&S=g)TPl1XXRYF|rN_*(M4uP?t%>dW~_&6$_f z+;5TwP=F+t18}w8O6syrNL{xtmr8uLZXHtFR-Rfk+pJ*XRWO`16!Id;q_1^r{ZqOO zUHedNL6r3ZTRpl_@=V?co|x||n#+aBbq}P1NMt(zdge$ZX^{HY*rv~+p$o{iz01TtcVTmepKni+Hj(*0ED##li$dB zK1OZ%zQ0+)6HiF<7AEz^w1nQ67B>Z5)O&TMaJZ;w@q&_{v z>enNp9k&aaziq~W{EaUAL0{Z;+nPOYc}b;qO*6fx>;P15aU~YM(e#(mi0<2{wl>R@ z01o)gN3)aq;M0UYnw>DJYSn59P-QZBD;hOwq{6~N6%-UG4Dk_sD4|#^rqa?(w;kq)qS^+_Sr3Lcv8V;lGmY-7hkp7kIY}3ICt==>u;S@qVT|y z|5?#BeZ1@d%N&UFC`bUpO zqiWo^v6?h#qT=FW^Y5afA_Jag&6=72=l2Nam!x<+Zosp4?OLr`waS3Ve)vE8DJv_h z_TosSUAlyHaNme}?Hx9f3F~cBlWosaJQi1E-onJ>J}0a{$oGx2F|#)#8!zJ{+DY4Ox1HLwX=5Z$z+$OzGT--&B>MjQ?=^q^e9fIZSF>i#(#IcvY(5JYF2sna z{szz=5$V8v!a8bbM8o?=)T~KX?{bZzO(kGrns) znn<5X4;6OqwqwDEzV8=<-fX~_&C_FMI~_#X3ZL{Sg}H1fBm&)%$T8R z)28XuPd_#PU)g{oHE$wq+aaU_yN7kch^V&h;Hgnj#!HgTG;)j|3VGh5C5d$tr>;BT zqH8s)q(pv6NoG61@BF_LM)f(1qe zroGRo)UlnXK0U%lt##WetgTyTyet_%3TqY)d*0$@$=J9_WqmHaAvR;oDEY^ZRYuG) z<2&65pwPqD7wy5DveYvy&SCMqH1-7}MJI=`AaWZ}aBOwe7as8WnZ$ z!3V2%@7_k@AYnGefHVF0wm@VvFT$*DOu+LnpC35z!HV;y}Edpk^MvOZ7Kl0^m<&+ zz8cf`Hxfqbq@x6g28>(=VktCtQx{BWbT;5l1uwbf6icvT?5 zOh;m%g7~any;|$mt@}w@V2#0%;7q7LK#H|yt+cAnjmeMY_RTln7vCwpDX!_nksIVPsUjyGPWnj?`HYK#x3EI_R2vfgV=h71{^e*OBXMT-_ysw;>umK0Xgci(-dWy_YC-%&9vHh+h+SapM1 z#5V-t1~{A_z+$y+z4g{VefWE21RRiZ{yJ5oyBU!%v_FH2mz5o9EM!i6KkvuGNO-3jbG9beI-)pbEwD;b7t9$qE>eQ)| zQJGkEmGLb=$+aJT_+dT!?6Zbob6@Gkafd{7)R2e{=pHd$7UZ0X?Z?lTf7 zzNu7LodO6a;pbl^HTs2^#*B|?<&Wu?6^?V%QAg>RV~#Nv7gC}!2>^+G_uY5(!V53x zgAYD1QU_-sk_K>P>RskK0GJQz4YdZ4h7TXE0}njVNX2vmZiK^e`SRs@;)y5p^wUr4 z_19ld`(4cZkpm+-^~k7p=@QN$muh7KL7 z?YG}PtyvC0;2N*I@`~}#z(MBCn`hKjO}xf6kw*4ANIujW4oRGoNTk7o2OFt`YI6tD zj(eFjX_B6K<{7>8(o1Qrvo4)H_3jbYZ%!ys$9B03ebie3k*o9iw7712xJ+L!NR6VS z9(LVzSN-Z&zcS##zY`qR6TEowVxuZ7=a@5Rjsec57?5}F3r>bK!Vd+I7_NkbT*HU% zy6djA&PP;N`?j8bdt!kG_X=y9_PKHR*GmAwd*1mlp=<9e)hBb3TIWy$-f|p)=bUqn zMvfe5-gXx}a14m>tFOMQC!c)M@Qif6mrVgA?swR*VMfK`kFw<61rcCJ0^N4oZ3aZH zbR^)~ZKsgVJ-I-GdPRh}U)xbH0W|xoq{h7#(;cH@CbnfW0_|k+Rs)=K&pp>zK5(Ak zfXiT2J@UvS8b5x#@dW?y!wslR;Qxl1aG=k`(Ze4;6U;zEiH{WbH+D9LKRNiY2 zipL#yoOuRZ4#DT(UQxA>>U-|F$2c5a^S-E18ggJ*=bu`rF5A>D@LI0`M3n@R=c$Qt zeLSb4^kI_mt^DUd{}Gl~+qP|g!i5D7YU=vyuh-bIV~vl;M%05Kv*886R@0P=OaaLC z@DcF|M)mEr`PrdE2lF!g-~aue@sz`pf}DtFdGpOT4bMXzyZo)|_MVP7D5~Q}MAe~f z_728+10bZ&*WV^}*)64-{z*b>)>T|K-r6IMI6}Yq&2LOJJ;)ze5d0~(-g>JhPo8W% zy>KI&s$u;?yvcA3d_Oqu@Id2G%;n%(9Xob3))vl9xQ|s+a2(Vr_ljEqOOgQZ?|%0? zZL`fb6#xWa@LAn)#~sE9z|;?p#zoSuJA`!kxrN$e=j?q$^#(wTmzA6CH$PBrwg-tb zPC7*W-~ax1!y9;Gg9F}!X%1m#fmj$~Rl$rx-fq+xJ|Vut8_t^zkO(Dw{`u!-VKY^E zNDl6Y#59O8(SN|p^$B-yFE(WaPyk|^H$kWXWeUi|BpN#3XcjGCsF5YM&>(^a(ommW2LvUD7AWf{)sfko! zfq1iVF5)L5tB~K3P}Q0I00)rZLfCD$-He}ya0b$mV5@tN>Fx&raV;C5bsdd(#R1LV z{`NPcmhlw@2h|+|dxdrC5e25|Bb!k#07P#3bFam9+07dac(BBRgE#cozy7t3Jo3nF z=BV0ZEH~jTfBf;sP09t*sH(6A-sVFNIYcL(c%tz%SCzq7?G04(g%@9ZQUCq#f6aXb z2l>-2nn@R*S*Vi^jmmkiYINCp0ibUdCN*|KTsJ*XW-2IxAq(D0c+Yv~oo9$=T?|X6 z;YX-6{6<)Ds1JY?95?~@+;dNza>^+tOo7U>Dz&osTW#+dRf|P-%{AAgq{rf+{`IJ+ zPC6`V3K%mT^#VY|x=4zD=9P+3a4avl&sk@krISxSxkh<6b^@(bK?R_W_#J|a>ZwY- zz<~hLlqpk8fD@?%s2K1Ra*Z&*Nf*H!cB@4ovCz=LDA9X%aAG^%rck$G%miw6+us^peZli$43aTue%Zn@#3BZw}5as5DW z3LK3r1Qs5WgI$krfQ#fIXv+eB_St8~$qC>w=Y!Wro!Tr& zd^}iSJSPrCp3w~o2cH)(Q{e&k;u=Ado<#fs`-gSa1%(-#^IJTCXnJt_=$NLwSCRif zOsU_x>86`Z#$ROwmB~cnAmTCSF{8=DA#e%l#-wJEthX8`BY?y2gOmVF{2eoVz<>dU z6bE^VEoEjgZQ__+Sb)RvTp!7Y>cWkHbOUUh3ozSI1zZLIkxb1jSs63+l%aO}H#NEe<~pn>~m#)Gza0KtErn2;JcvnA$s3BA>{0QJy zr;<1x3CQt;XYBE(opzd$gy~Xpu?TOt;RX|EMLh<`t~+=->F}sdKRPoWw8aDHvYSdZ z`MvUt!{8wK3iF+^9G9c;J#v@fC#X0U3@Z)ux~5eUoCApf2*`*2*T4Q{q!pk&>7FMzU3~GyrhEtqC73yLra2E1$tK95{@j6tBdl@fop+i% z?%>$2gQuZ=BKpU96;oTPdy%$y0G)Qpdec#3;gX5~VlnW*9&o?`CY}@=s46C#zawqP zv4Ic+fSSDd!E+(W03&8Q3GSQ^Fp}4tF4e*UkL$DO=A)DMfE>Gk1INI$NRG$fIX zkPRdoD=jzx+dJ>PqpPmE%49DFN4r+iKHb9l?^Ts^#q_GNyfT%-!YwkXe#DvUOh2FH zD=R)8d<6bO=AlcVv93^CSZJu75hF(Ylqzb^Vr$old9gtJ4zIHDF&9Lb{-`2|D*Op+ z2WjG}G0p>k335W*;W#Wf=XKSN?c@PK8CaEkACBevqOh_c;=B|*6EB6!hak>ad4K-% zpG|RMaL`__%eEoCcvrcFSktk^OQ2rIt~Cvy+~_;ui~H}tKc%*d1;j7&=%bGs@qgik z7aG+O99A_zR*@9Mw|LV527rXzx^FkfQ>O(VvYu#)5?xRrvEU+b6;vxuMF8v$$TA%3 z%P+q)Qic1*szlAAa?=5hSlmDU@elLDAW_MCVptH{nlb=}^b3wgMN-?Ap57gsnz&yT zn6`KT?RLl-10J_m;bDgzrqQEEr@XBI0p5c{jR|J)T=RG7(xs*|2Js`TG@FqKIYlMH zb2z^{Ahjg5L(Ffy@kZ^x|Nce_1qV(%7MgTg2>1EtpKm{^fROe z%nn36fm3pt-5@1zKZ}f{zns=)h2yaBr~!O6)+xyG91A!h zsqi3zrAVyczy*M$LOKFOR9(>Q$6v#Du$Bmd;_tD8XMxY*G5`cfnP7Jiq!xr6dpd&zZ0u-(>v%H@y(M}yUb^U$?+2wwmWfJq1i|4eY;zahMV*7F*tAy01zy&Q%^nBsJ!67>Oumtcq}yc z=}IWbKlkQl5eC0UQ2+qKS?Ug47f43_&h^~@EceYbrYjcs?#%`Up!P^0r{c6K2}GXo zm@#7v(M<;+-g+cgZ2$y8M{TgkefspNu)drh)rq74gxLZJ5)MFI1AvPGAOK7b6xVkF zRG9?g*aionZThdN&<&nRfES=1SV(u^K*L|dPfB;-2tnTqF)sd&HB(tPFk6(!LfJ}D zdmWsEs7S1&GtWHJ#L0q#>_vjBI3TgWNGJ;qR4Bj(WHyH8J_FBp!37r>0Fef32V4yv z2Dc*b2%sRLTmb#{x4$*gIrx0GIn}pQ8khv?I&_WJmsZR|$9-g~d{ zLZfPkYzK)jlZrzQXB&LQ74r~oNGt>uei0<#a1cNXKsYZ8l@35iH|ouBAVP+N0LJ2i zr(J#Z)yA&_(1HW$irNG~05IsRgn$D;tV=9QtT0>;mIK*{KG#Ib2D^w5P{ox0;^hVg zpuG-Tqg88^QUiv0Zn;Qsfe0w##KVk5$_yMhFvT3k|AMEM9BLLbm?%%IjD<%%xr4<= zah!A~ail1nZzy?BC!hD@w|TUkiJ#P2L1;S9I>0abwdzJL^uNgR|X)! z3xKHmf<$AIqng|}7!nN?hSX%hYq$r1K))QS_D1)5n7aCe9 zv#4#QLa`Oklv+!}(U!9n5}i%nh((Q7yZxytEEeo{n(^B(|`I2dn# zNlA%WL>8*XsTW+eL2rLZqwtEhJix(`hAJTd862dmVrfySfHc7p!Xpg7$h7Y>{0Q(s zs_|SC27#2<1V998k!TbN4+5d zX&oFK^qB6qZ&){6lG?1Hs(aYtLmB_Rr_}U({&a3d0AYPFk$?kL5gd?Y-axnjs)wK_ z4maASz=z;XH5n`xpuz0se5euBVkQ7W-C)VF*n~bH$HDMJRrdh^G4=7B0|+=1fP$oB zM7UuT;&2!ifDMTi96M~|>9D~OU3^9Z%LjV!+472vX`fWA$UvIl3xbEZ3H69_CJ=Mh zCe9-Xh;acVh$NPhPV|{3U!pL zkxKy8^qz1BU@%Zw!f;b*QD2lUkqZ=5*?gBxeh(cK(Nz~@W`S{Ry#NrUJphR0`rzO# z#FQs(0)m=ukTOAFk@ytqAs1c801#Fc1Rfq19MqB_C5Xkjaju$z#r+;?7M~BXw{(1u z@59?jP@}=HH!^SxHa50nm$6%C~NsFts8Nf_xG&Cw7ImIo*Iyz=iNm z)7jKbvdU&r;V%FO@Va3NvH&3VI2_#?^=z)iGh+VZg1~gItP+Il5kMu(;_{#V`-ROG zQGh7ZQ7cxd-41~@nP7Z7s7x#|{82VU zfwhM92j_y&*0#$%Kqcx=K$e(WWu?tXRWcLEa>Vp^uY3H6h-vS#@9vp5nW`56TDHPB zTUTCrXKH^S!WdMiqE6iGLkk8L77~5;-FKTdC`@u?xj;1mko^v1miSdLodPupU~4-d z)>xSYP00%au$6^DNJ$|JlF*JVQL@*EK>z;as7^VeAgdh?>ji+wNTjXrr8jOc8>+b5 zbQ2c>K=@TE8(1Z%6!;028;-hM@S)lQCEf8zQWDw7dBT^)i&52{V@Oq;i?&OMJtrN? znm3jHa&~!#vTXWA*9!nKAycO(bnC-qnlUSplG=e4Mk$P&z#d#2+dP4qaikCvj^&bR z)6BX6Oz@njLnIr|L$4vLBCG0dMv#>pXm=wP`bFbFJoC5$4eOJc1JT}7y#df?UnVtn zd`wSHNHyoNOh}u6yfUhqY+LqBm5Theb7NctqWI&7A*mu6hHYrOSQ2^+7_{+*7Kr7F68YiAly9!smm@TV0zt zNG3dmtUan&F@asvcT)m~YuQ%7wu1-cxiX8(-kaUDm)vMxh@gdux}qNbqB9CLaKA{_ z&Bp5ufG8}Sw;-wWuGnDwL2jp3_zzYH{vfwcbUHAg(pUf{9uuEr`OP`7=rGku)2Oab zqrFcEGhqu-TnYLH2RYDeb8yq8McSil*zES4&8Rm3;^C1(H$7OUiEqUQDYK#Sd8=(d^)y_STW7IEM1(Y(|RMwid1V)OI|Bd=0d=VV&+erQQ ziSxoLzPe?CBomP*08Cm3l9Mon-AA>$on z9Z{omXjVrW*|}t3BccR3s_$g*8>=23X=RqvKo0i{Dj!^e|D3X%Dl?9GzV46 zJ(GLwN+7O>?}xxC7Nnc-)~{z+#~u>VFL1CBr^ zWZL!M5+%oSVbbAB#L`&gsyw~+x_||5HeiBt*e2yc0KvUbRS;xAL#U&w7R2`4NE-l( zR~hL7khnLz(e8ls+YAGDJ1Qj3na4$S>~OXK&n$T?y|J-{x4299P;enqT`#`2eDf7I zw1GuKa1|iAd&JxJDgN-|Z>;W93c%y@< zt5(fob&)(z&^9>i<|>!{u26>$iV9D3ZAZP7K*YvAo|DjBV`2tK#K(dIl>s;?Lq-w= z)dfVDv<~*zB4W<;}Pyg4U#MT25XN zg^O<9Gu5Yq4+!h@V+yq2o^1D7`#Y_d0AgC`oA~wz30-wpsi_$Ywtzt$5ktboPeGyE z2AFbUI0SW8a2j|Co?qMmSVfrDR<%{<4bF6l05CB)?t!vuep2a*^#`}YTEntJdSd1W zhm}&7UV5of!@;x-z|yv5dEm5v&xk2w&c&#=078u|U7plmZz$FKA1Ab;;{GDWT((m3c+7kJi4dy*4qvps4&WHP#chOTYAH}P;mq~S>Wng_1Z2OwhJrQWAXU_9 z4t^YfV|fhc=Gqi7Vy(fS>_GZZs)JO;;ps{ry0GrHV@OwCP^2!~gv@Tuxft~pKuk_) znRMS%WqM&!Jf&{TI_zu_o?HHGdnwY43P)VJf#gCmQAdVE!Xn~#*K&gZ+iD8blC8T3 zFnEgr42uu{!ZqM-hGMUc^drL(SA<*ZhWh|jN39!@%FQBRkN89SNA#S7^k^!=uWWaJCn4ThSpMSXAO?kkWK%9e@xOW&@p6cuK?R&2TOL4O!-Ay2=Z97b&Z#CmfA#g9lU=VCRK!kB2-TJ~*PY zPr&lZeuLcxV}%7DblrMiV_%Nz!KcbJ%PD{6d#D5&EYPdR)_?K;*7~7hgIpTI7?llL zz1T8p7T4W=8)qXx#3zHKuzP@I;5W0~KeThUpq}cJ1uxgppC5d{|V) zjl7(YXFC`5S_0XJobhQwPfv`SO?i<@K|;-&jY*7SG2OOMNDWGXsoFqtxQkAD2xdOH zMv&~FDg=b6KNc4tR;HS&<042K01klMrkY4bKtqUzYq^;WJ!5XnFl z1gec%tZcFy;Zsq)p)ZN16oN!60$4XsDs51q*vk*a7#Um=B)}q}Js=b^{jj ziLwC?*TD-804Yl%8!@OJ;ZazNfBfSg%}+Px)v~!XVnDeT}o=oYfh$;dMcz1Ce2Bi>E2d5$};{b*29#0qne+>CLwgCdyLTbTv zFsVtL?mQ^iVSuK;k;B^?A+PYA5Sk-&ppDmO4+FD zJ{t^x;5}q1QU*Qo&A7h&wqn8=(gQM#8pBj}n-f5MQ4;`yPyzu_{6wT(u=&dWNM-qM zJQNU8XGThFW%cY;EeukTG+eR}@q)W<20YRv$)noHRdOX<$F`mZ9T3(fXBVn@6R%FB zPrWze(=E_@GZPy9LQIc7A5Xh}NEOO}+#sb*_kgTIs`33mypasS!S^7`01=?ExY-Pv zUg2@390?xe#@`6~Vja4>?$~P$?HxAN7W?lNHqxlBMuU++b^^&-e139V_lzmi?63S3 z-w@70BoNh}B%RqL;^z0=}s1OE7)%H zrymnFUS|TPbv+s+fN(BCq%XULLKZzpKd|yB9f~^=@5zR z*?>7Sbv z(}PdP^!eA02-;YOg#>~RAqlFsM9TAau+j)85D3j?kl+UQ!sq0snQ%V4lMtB#>9`de z=bn0G)HKWN*f#r0i%jmlK}sMdh-m$i?~~h8-xz<0K3}?1Sc6u0Plg9 zpjO;0z?v)w4otEGh|LjRaWf#<1coR(RVDbPT#qw(&V74Cbn%%5YTqWL!pvL!)Z{i( zzSCd<#7tn?zc4wju@ho??d?QLF(Ti=l*T_qYq)eB;%&jSG=!HRIdJS{QyuiIgm30ggHL>BB7V3#&ypVv6S>zzD}3|5W!7QWkJh}MaD8B)Ir3Z zg!fFM>?EeKrv)8E+1C5qgBdE;G=8WP5#Q2?4Lw5;jP=kj~B3uem%ywr5P-%wid?2u}b#cb@$ zt!(Anq;BA&!8=TrVPzoR$2@&F3V5Pay;XQ5=8sNd| zqA}+2Bcj@SmvEg0N~;4;UWKKZp|$IM5paEUTug6FPo$7))DOU+Ll`B}c#eamJvPM@ zwSxq)8=-J1z=Nel`YRv;JVA>N-ws5XqDJ<#hxerH!%-yl-8XE&!_Q1R%hv=HnS3WN zfzr$tUTQ!@GXBS(CsTSZqPj>XvwN2!NrIdE+Q>a-H+%>SjX^~${vOm5;qIu1o;qem4)GN@kA)GSPveU?m#+H)AG95gYf z5|kP(x5)wVFw!n=x#bpf6(kl`SFo?4HOuj4+Z_k7zFf(JzlV-Jk$k`W2VakjD{tI6cYbQT3=cBt79`~ZB2qhoJ|aMXc~4pg1BW4rYOWs% z>2up{x0$+kRA0It)x^2j&w{e#)?0aXn&Xp+M9KrGirIodPoI_0bFaoVW_(Pm*C<62 zA$f@0ll+B6g?S(3HCR+OZbgV9SXYnqvAZ792ps%nJ~Zjj&8 zxszwMVZzhAxh<}A_m~Gz4OSZe5a#`q_Y!()VoVd?Odq+&OefSqDk|+`+&xR}rBG=k z+fy?}D;XS)?!ed6r$^W{0UyvaqUO!KO&;f}!PIR2+W0%KXuR8zgTn9lz8~G3p^WM# z3qG`brLWiCjq9liaZPzYk>X_J9QcUnoI$xXAquy346W~|b|rI>W}SpQ+<~+3!0sU( zc2HEq`$W`gtDh%$xbJ`jiaj!}bnrFz#NXc}v9K{?6h8J?MgQ}+g04poE1(N@>@AtE~!`FP3YE#XyWOc@P|7{fhA^!Bnqa)lIlUcjI2e9pl=o?)<5#xy1_R-s1HVsQf%y4r8cOn;@lZKB}z&ZDk)LHklt$f zz|~FO4u`d^?~CTnKkFGooh@3H)XP&7x@T;ezH;iz>>Lrn$7x718k^uUXuAt=2#~tL zQF~m6w$d4+3N);5MB8_)n`+VwF;d;vlb)y0?5~oG&M8^f?~}P=FDqWFijBIfIZMU> z0w@Cps9^GB6@U3k@z^Gfy@Bj5K-ZP(?s#+m-88RSk<{3i;-)M9j9KaDib6$7rtL;> zRJRf*<7c`-CF$^f5#uQA*e;Zl9)@*2SD}y>-%#pDX3R>wd&D{GM+_LCwUZ}rA^@Fv zsEY0yr$*!NX>|IYJBR-j4lC~aKYsw(Mfr4YQm?!n*R!w0($<*qJ<>pIZ5a;2%65GQ zJcAF2=!kbBFSPYlZjXz;>t*o!Y*l8j7wKXLW>S8TZU&>mVpZo05j>s$hP-MT3{ zYnF=JG*hdWA1r>QT`O<9P-x4LLO~FXn-nu1>lG_gJHl4CFk}!CZtUH7@8u4RzUsp0@L_!l z?xgvn=aoyMTyznw>%~Bw&0m}}oBral{>ItlrMm00>B*r3qdM-8sCL|L(^XSccVAWg z-GYZE`5(_oYW(YE=U;Pg?5S>@w0714t(J@s*dzerbt~%BO3fE6SMg1k6rIv@&+uP6 zZtbb4z%wk~_kEA;D{Aw=b$u+^i(fBH>ZK`hz4~@sGv|;LR`pdQ5oy;hAr0&m)}e!< z>fF(*lm0!qe0I;1?|Gg9Mp?`cQ&0ESjQF*e-CTNit43P8e7$I8iuz*h>Ks7a2No9< zOvUY*tND^uYV?<1M~58PGkVe1t-THe4I39#y~AKGC#bgPqGbB558`^~!-VE7^tEh7 zQma-=8%oRPvarxovtpTG==PmLrtJ!888pD$QU=embcL^Z3;e}Xr-F~%`tb9F=6#zq4oF6eW-_Mvo;!!tuV+LZ+x`5dj=6D9ULx+t z*R0j56|1%Qi+PDRuD!c-^y>9m-Lz1pt4l>I_cb)e%|?CI20&H{(Y3e{lBiWvHC?`1 zk!aL3B?+}^9&5hOZfX-Q42KgLxu!M;eCp>lLm_#|vP69PEPcOZxmHG_(PS(Zi??d3 z`0~|;^B{TX{Rer@$ojG~maPP`;6sK3q9Q!f{A}4ojY@rm)~=NojYhW|8DBp!WS%M( zizSPTW`CTPar?X;)8|w@x3+N)&#go&XUxCZORb zzw`fDNuFFuAon}~Cinp~c>vWZPAWZl5I`100LFeeuvXy7l>`btfeV(r)Y&}XajzN# zQ%-=BYY9}@H01&G^8!%L?HIe*$bfO0;i4eNw?05z=j&iT{+Kb(F|ttd{iEdT%j07*qoM6N<$ Eg58YYYybcN diff --git a/core/ui/src/main/res/mipmap-xxxhdpi/ic_yellowowl.png b/core/ui/src/main/res/mipmap-xxxhdpi/ic_yellowowl.png index 304b0975dd33add82a2aad4151fe87ef83f8efd3..609afcb78ccfc6abe98a77a8f3e891510d6c483b 100644 GIT binary patch literal 8786 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 info.nightscout.core.ui.R.mipmap.ic_blueowl + config.NSCLIENT -> info.nightscout.core.ui.R.mipmap.ic_yellowowl config.PUMPCONTROL -> info.nightscout.core.ui.R.mipmap.ic_pumpcontrol else -> info.nightscout.core.ui.R.mipmap.ic_launcher } From 968c9fb4c1d85c01fb7e99152db7de224abc9edd Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 14 Aug 2023 16:28:29 +0200 Subject: [PATCH 07/12] Resolve onBackPressed deprecation --- .../nightscout/androidaps/MainActivity.kt | 65 ++++++++++--------- .../activities/PreferencesActivity.kt | 52 ++++++++------- .../activities/SingleFragmentActivity.kt | 43 ++++++------ .../activities/PrefImportListActivity.kt | 26 +++++--- .../setupwizard/SetupWizardActivity.kt | 17 +++-- .../sync/openhumans/ui/OHLoginActivity.kt | 40 +++++++----- .../activities/ComboV2PairingActivity.kt | 15 +++-- .../pump/eopatch/ui/EopatchActivity.kt | 20 +++--- .../pump/medtrum/ui/MedtrumActivity.kt | 14 +--- .../activity/OmnipodWizardActivityBase.kt | 12 +++- pump/pump-common/src/main/AndroidManifest.xml | 4 +- .../pump/common/ui/PumpBLEConfigActivity.kt | 28 +++++--- .../dialog/RileyLinkBLEConfigActivity.kt | 28 +++++--- .../ui/activities/TreatmentsActivity.kt | 28 ++++---- 14 files changed, 223 insertions(+), 169 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.kt b/app/src/main/java/info/nightscout/androidaps/MainActivity.kt index 2079a9a865..4d3cfc9ca6 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.kt @@ -21,6 +21,7 @@ import android.view.inputmethod.InputMethodManager import android.widget.EditText import android.widget.LinearLayout import android.widget.TextView +import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.widget.Toolbar import androidx.core.view.GravityCompat @@ -151,7 +152,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() { .subscribe({ processPreferenceChange(it) }, fabricPrivacy::logException) if (startWizard() && !isRunningRealPumpTest()) { protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, { - startActivity(Intent(this, SetupWizardActivity::class.java)) + startActivity(Intent(this, SetupWizardActivity::class.java).setAction("info.nightscout.androidaps.MainActivity")) }) } androidPermission.notifyForStoragePermission(this) @@ -163,6 +164,17 @@ class MainActivity : DaggerAppCompatActivityWithResult() { androidPermission.notifyForBtConnectPermission(this) } passwordResetCheck(this) + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (binding.mainDrawerLayout.isDrawerOpen(GravityCompat.START)) + binding.mainDrawerLayout.closeDrawers() + else if (menuOpen) + menu?.close() + else if (binding.mainPager.currentItem != 0) + binding.mainPager.currentItem = 0 + else finish() + } + }) } private fun checkPluginPreferences(viewPager: ViewPager2) { @@ -219,9 +231,11 @@ class MainActivity : DaggerAppCompatActivityWithResult() { menuItem.setIcon(info.nightscout.core.ui.R.drawable.ic_settings) } menuItem.setOnMenuItemClickListener { - val intent = Intent(this, SingleFragmentActivity::class.java) - intent.putExtra("plugin", activePlugin.getPluginsList().indexOf(p)) - startActivity(intent) + startActivity( + Intent(this, SingleFragmentActivity::class.java) + .setAction("info.nightscout.androidaps.MainActivity") + .putExtra("plugin", activePlugin.getPluginsList().indexOf(p)) + ) binding.mainDrawerLayout.closeDrawers() true } @@ -318,26 +332,28 @@ class MainActivity : DaggerAppCompatActivityWithResult() { when (item.itemId) { R.id.nav_preferences -> { protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, { - val i = Intent(this, PreferencesActivity::class.java) - i.putExtra("id", -1) - startActivity(i) + startActivity( + Intent(this, PreferencesActivity::class.java) + .setAction("info.nightscout.androidaps.MainActivity") + .putExtra("id", -1) + ) }) return true } R.id.nav_historybrowser -> { - startActivity(Intent(this, HistoryBrowseActivity::class.java)) + startActivity(Intent(this, HistoryBrowseActivity::class.java).setAction("info.nightscout.androidaps.MainActivity")) return true } R.id.nav_treatments -> { - startActivity(Intent(this, TreatmentsActivity::class.java)) + startActivity(Intent(this, TreatmentsActivity::class.java).setAction("info.nightscout.androidaps.MainActivity")) return true } R.id.nav_setupwizard -> { protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, { - startActivity(Intent(this, SetupWizardActivity::class.java)) + startActivity(Intent(this, SetupWizardActivity::class.java).setAction("info.nightscout.androidaps.MainActivity")) }) return true } @@ -384,9 +400,11 @@ class MainActivity : DaggerAppCompatActivityWithResult() { R.id.nav_plugin_preferences -> { val plugin = (binding.mainPager.adapter as TabPageAdapter).getPluginAt(binding.mainPager.currentItem) protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, { - val i = Intent(this, PreferencesActivity::class.java) - i.putExtra("id", plugin.preferencesId) - startActivity(i) + startActivity( + Intent(this, PreferencesActivity::class.java) + .setAction("info.nightscout.androidaps.MainActivity") + .putExtra("id", plugin.preferencesId) + ) }) return true } @@ -397,35 +415,18 @@ class MainActivity : DaggerAppCompatActivityWithResult() { } */ R.id.nav_defaultprofile -> { - startActivity(Intent(this, ProfileHelperActivity::class.java)) + startActivity(Intent(this, ProfileHelperActivity::class.java).setAction("info.nightscout.androidaps.MainActivity")) return true } R.id.nav_stats -> { - startActivity(Intent(this, StatsActivity::class.java)) + startActivity(Intent(this, StatsActivity::class.java).setAction("info.nightscout.androidaps.MainActivity")) return true } } return actionBarDrawerToggle.onOptionsItemSelected(item) } - override fun onBackPressed() { - if (binding.mainDrawerLayout.isDrawerOpen(GravityCompat.START)) { - binding.mainDrawerLayout.closeDrawers() - return - } - if (menuOpen) { - this.menu?.close() - return - } - if (binding.mainPager.currentItem != 0) { - binding.mainPager.currentItem = 0 - return - } - @Suppress("DEPRECATION") - super.onBackPressed() - } - // Correct place for calling setUserStats() would be probably MainApp // but we need to have it called at least once a day. Thus this location diff --git a/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.kt b/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.kt index 7ea1d46f61..a6493ef61a 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.kt @@ -2,8 +2,10 @@ package info.nightscout.androidaps.activities import android.os.Bundle import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem import androidx.appcompat.widget.SearchView +import androidx.core.view.MenuProvider import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceScreen import info.nightscout.androidaps.R @@ -33,25 +35,37 @@ class PreferencesActivity : DaggerAppCompatActivityWithResult(), PreferenceFragm it.putInt("id", preferenceId) } if (savedInstanceState == null) + @Suppress("CommitTransaction") supportFragmentManager.beginTransaction().replace(R.id.frame_layout, myPreferenceFragment!!).commit() - } - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_preferences, menu) - val searchItem = menu.findItem(R.id.menu_search) - searchView = searchItem.actionView as SearchView - searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + // Add menu items without overriding methods in the Activity + addMenuProvider(object : MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + // Add menu items here + menuInflater.inflate(R.menu.menu_preferences, menu) + val searchItem = menu.findItem(R.id.menu_search) + searchView = searchItem.actionView as SearchView + searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { - override fun onQueryTextChange(newText: String): Boolean { - myPreferenceFragment?.setFilter(newText) - return false + override fun onQueryTextChange(newText: String): Boolean { + myPreferenceFragment?.setFilter(newText) + return false + } + + override fun onQueryTextSubmit(query: String): Boolean = false + }) } - override fun onQueryTextSubmit(query: String): Boolean { - return false - } + override fun onMenuItemSelected(menuItem: MenuItem): Boolean = + when (menuItem.itemId) { + android.R.id.home -> { + onBackPressedDispatcher.onBackPressed() + true + } + + else -> false + } }) - return super.onCreateOptionsMenu(menu) } override fun onPreferenceStartScreen(caller: PreferenceFragmentCompat, pref: PreferenceScreen): Boolean { @@ -60,18 +74,8 @@ class PreferencesActivity : DaggerAppCompatActivityWithResult(), PreferenceFragm it.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, pref.key) it.putInt("id", preferenceId) } + @Suppress("CommitTransaction") supportFragmentManager.beginTransaction().replace(R.id.frame_layout, fragment, pref.key).addToBackStack(pref.key).commit() return true } - - override fun onOptionsItemSelected(item: MenuItem): Boolean = - when (item.itemId) { - android.R.id.home -> { - @Suppress("DEPRECATION") - onBackPressed() - true - } - - else -> super.onOptionsItemSelected(item) - } } \ No newline at end of file diff --git a/plugins/configuration/src/main/java/info/nightscout/configuration/activities/SingleFragmentActivity.kt b/plugins/configuration/src/main/java/info/nightscout/configuration/activities/SingleFragmentActivity.kt index cab20ee2e1..1e7e93ccbb 100644 --- a/plugins/configuration/src/main/java/info/nightscout/configuration/activities/SingleFragmentActivity.kt +++ b/plugins/configuration/src/main/java/info/nightscout/configuration/activities/SingleFragmentActivity.kt @@ -3,7 +3,9 @@ package info.nightscout.configuration.activities import android.content.Intent import android.os.Bundle import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem +import androidx.core.view.MenuProvider import info.nightscout.configuration.R import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.plugin.PluginBase @@ -33,29 +35,32 @@ class SingleFragmentActivity : DaggerAppCompatActivityWithResult() { supportFragmentManager.fragmentFactory.instantiate(ClassLoader.getSystemClassLoader(), plugin?.pluginDescription?.fragmentClass!!) ).commit() } - } - override fun onOptionsItemSelected(item: MenuItem): Boolean = - when (item.itemId) { - android.R.id.home -> { - finish() - true + // Add menu items without overriding methods in the Activity + addMenuProvider(object : MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + if (plugin?.preferencesId != -1) menuInflater.inflate(R.menu.menu_single_fragment, menu) } - R.id.nav_plugin_preferences -> { - protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, { - val i = Intent(this, uiInteraction.preferencesActivity) - i.putExtra("id", plugin?.preferencesId) - startActivity(i) - }, null) - true - } + override fun onMenuItemSelected(menuItem: MenuItem): Boolean = + when (menuItem.itemId) { + android.R.id.home -> { + onBackPressedDispatcher.onBackPressed() + true + } - else -> super.onOptionsItemSelected(item) - } + R.id.nav_plugin_preferences -> { + protectionCheck.queryProtection(this@SingleFragmentActivity, ProtectionCheck.Protection.PREFERENCES, { + val i = Intent(this@SingleFragmentActivity, uiInteraction.preferencesActivity) + .setAction("info.nightscout.configuration.activities.SingleFragmentActivity") + .putExtra("id", plugin?.preferencesId) + startActivity(i) + }, null) + true + } - override fun onCreateOptionsMenu(menu: Menu): Boolean { - if (plugin?.preferencesId != -1) menuInflater.inflate(R.menu.menu_single_fragment, menu) - return super.onCreateOptionsMenu(menu) + else -> false + } + }) } } \ No newline at end of file diff --git a/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/activities/PrefImportListActivity.kt b/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/activities/PrefImportListActivity.kt index 27ec178c8d..acee12e375 100644 --- a/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/activities/PrefImportListActivity.kt +++ b/plugins/configuration/src/main/java/info/nightscout/configuration/maintenance/activities/PrefImportListActivity.kt @@ -3,9 +3,12 @@ package info.nightscout.configuration.maintenance.activities import android.content.Intent import android.os.Bundle import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import androidx.core.view.MenuProvider import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -41,6 +44,21 @@ class PrefImportListActivity : TranslatedDaggerAppCompatActivity() { binding.recyclerview.layoutManager = LinearLayoutManager(this) binding.recyclerview.adapter = RecyclerViewAdapter(prefFileListProvider.listPreferenceFiles(loadMetadata = true)) + + // Add menu items without overriding methods in the Activity + addMenuProvider(object : MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {} + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean = + when (menuItem.itemId) { + android.R.id.home -> { + onBackPressedDispatcher.onBackPressed() + true + } + + else -> false + } + }) } inner class RecyclerViewAdapter internal constructor(private var prefFileList: List) : RecyclerView.Adapter() { @@ -106,12 +124,4 @@ class PrefImportListActivity : TranslatedDaggerAppCompatActivity() { } } } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == android.R.id.home) { - finish() - return true - } - return super.onOptionsItemSelected(item) - } } \ No newline at end of file diff --git a/plugins/configuration/src/main/java/info/nightscout/configuration/setupwizard/SetupWizardActivity.kt b/plugins/configuration/src/main/java/info/nightscout/configuration/setupwizard/SetupWizardActivity.kt index a3ae79c65a..0bd2c50e21 100644 --- a/plugins/configuration/src/main/java/info/nightscout/configuration/setupwizard/SetupWizardActivity.kt +++ b/plugins/configuration/src/main/java/info/nightscout/configuration/setupwizard/SetupWizardActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.os.Bundle import android.view.View import android.widget.TextView +import androidx.activity.OnBackPressedCallback import dagger.android.HasAndroidInjector import info.nightscout.configuration.R import info.nightscout.configuration.activities.DaggerAppCompatActivityWithResult @@ -64,6 +65,12 @@ class SetupWizardActivity : DaggerAppCompatActivityWithResult() { generateLayout() updateButtons() } + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (currentWizardPage == 0) + OKDialog.showConfirmation(this@SetupWizardActivity, rh.gs(R.string.exitwizard)) { finish() } else showPreviousPage(null) + } + }) } override fun onPause() { @@ -134,10 +141,6 @@ class SetupWizardActivity : DaggerAppCompatActivityWithResult() { } } - override fun onBackPressed() { - if (currentWizardPage == 0) OKDialog.showConfirmation(this, rh.gs(R.string.exitwizard)) { finish() } else showPreviousPage(null) - } - @Suppress("UNUSED_PARAMETER") fun exitPressed(view: View?) { sp.putBoolean(R.string.key_setupwizard_processed, true) @@ -147,7 +150,7 @@ class SetupWizardActivity : DaggerAppCompatActivityWithResult() { @Suppress("UNUSED_PARAMETER") fun showNextPage(view: View?) { finish() - val intent = Intent(this, SetupWizardActivity::class.java) + val intent = Intent(this, SetupWizardActivity::class.java).setAction("info.nightscout.configuration.setupwizard.SetupWizardActivity") intent.putExtra(intentMessage, nextPage(null)) startActivity(intent) } @@ -155,7 +158,7 @@ class SetupWizardActivity : DaggerAppCompatActivityWithResult() { @Suppress("UNUSED_PARAMETER") fun showPreviousPage(view: View?) { finish() - val intent = Intent(this, SetupWizardActivity::class.java) + val intent = Intent(this, SetupWizardActivity::class.java).setAction("info.nightscout.configuration.setupwizard.SetupWizardActivity") intent.putExtra(intentMessage, previousPage(null)) startActivity(intent) } @@ -164,7 +167,7 @@ class SetupWizardActivity : DaggerAppCompatActivityWithResult() { @Suppress("UNUSED_PARAMETER") fun finishSetupWizard(view: View?) { sp.putBoolean(R.string.key_setupwizard_processed, true) - val intent = Intent(this, uiInteraction.mainActivity) + val intent = Intent(this, uiInteraction.mainActivity).setAction("info.nightscout.configuration.setupwizard.SetupWizardActivity") intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity(intent) finish() diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/openhumans/ui/OHLoginActivity.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/openhumans/ui/OHLoginActivity.kt index 1dc79a3912..b7df7d81d8 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/openhumans/ui/OHLoginActivity.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/openhumans/ui/OHLoginActivity.kt @@ -3,11 +3,15 @@ package info.nightscout.plugins.sync.openhumans.ui import android.content.Intent import android.net.Uri import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.widget.CheckBox +import androidx.activity.OnBackPressedCallback import androidx.activity.viewModels import androidx.browser.customtabs.CustomTabsIntent +import androidx.core.view.MenuProvider import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat @@ -94,6 +98,25 @@ class OHLoginActivity : TranslatedDaggerAppCompatActivity() { if (code != null) { viewModel.submitBearerToken(code) } + // Add menu items without overriding methods in the Activity + addMenuProvider(object : MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {} + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean = + when (menuItem.itemId) { + android.R.id.home -> { + onBackPressedDispatcher.onBackPressed() + true + } + + else -> false + } + }) + onBackPressedDispatcher.addCallback(this, object: OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (!viewModel.goBack()) finish() + } + }) } override fun onNewIntent(intent: Intent) { @@ -103,21 +126,4 @@ class OHLoginActivity : TranslatedDaggerAppCompatActivity() { viewModel.submitBearerToken(code) } } - - override fun onBackPressed() { - if (!viewModel.goBack()) { - @Suppress("DEPRECATION") - super.onBackPressed() - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean = - if (item.itemId == android.R.id.home) { - @Suppress("DEPRECATION") - onBackPressed() - true - } else { - super.onOptionsItemSelected(item) - } - } \ No newline at end of file diff --git a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/activities/ComboV2PairingActivity.kt b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/activities/ComboV2PairingActivity.kt index 48e7158d1e..cc5c220f89 100644 --- a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/activities/ComboV2PairingActivity.kt +++ b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/activities/ComboV2PairingActivity.kt @@ -9,6 +9,7 @@ import android.text.Editable import android.text.TextWatcher import android.view.View import androidx.activity.ComponentActivity +import androidx.activity.OnBackPressedCallback import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat @@ -186,13 +187,13 @@ class ComboV2PairingActivity : TranslatedDaggerAppCompatActivity() { .launchIn(this) } } - } - - override fun onBackPressed() { - aapsLogger.info(LTag.PUMP, "User pressed the back button; cancelling any ongoing pairing") - combov2Plugin.cancelPairing() - @Suppress("DEPRECATION") - super.onBackPressed() + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + aapsLogger.info(LTag.PUMP, "User pressed the back button; cancelling any ongoing pairing") + combov2Plugin.cancelPairing() + finish() + } + }) } override fun onDestroy() { diff --git a/pump/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchActivity.kt b/pump/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchActivity.kt index 1f9cc7f15d..f30e06a5ff 100644 --- a/pump/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchActivity.kt +++ b/pump/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchActivity.kt @@ -6,6 +6,7 @@ import android.content.Intent import android.content.pm.ActivityInfo import android.os.Bundle import android.view.MotionEvent +import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AlertDialog import androidx.lifecycle.ViewModelProvider import info.nightscout.androidaps.plugins.pump.eopatch.R @@ -103,6 +104,16 @@ class EopatchActivity : EoBaseActivity() { } } } + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + binding.viewModel?.apply { + when (patchStep.value) { + PatchStep.SAFE_DEACTIVATION -> this@EopatchActivity.finish() + else -> Unit + } + } + } + }) } override fun onNewIntent(intent: Intent?) { @@ -274,15 +285,6 @@ class EopatchActivity : EoBaseActivity() { this@EopatchActivity.finish() } - override fun onBackPressed() { - binding.viewModel?.apply{ - when(patchStep.value){ - PatchStep.SAFE_DEACTIVATION -> this@EopatchActivity.finish() - else -> Unit - } - } - } - companion object { const val RESULT_DISCARDED = RESULT_FIRST_USER + 1 const val EXTRA_START_PATCH_STEP = "EXTRA_START_PATCH_FRAGMENT_UI" diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt index a7fd32336f..683da88042 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt @@ -29,7 +29,7 @@ class MedtrumActivity : MedtrumBaseActivity() { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) binding.apply { - viewModel = ViewModelProvider(this@MedtrumActivity, viewModelFactory).get(MedtrumViewModel::class.java) + viewModel = ViewModelProvider(this@MedtrumActivity, viewModelFactory)[MedtrumViewModel::class.java] viewModel?.apply { processIntent(intent) @@ -88,20 +88,10 @@ class MedtrumActivity : MedtrumBaseActivity() { } } - override fun onDestroy() { - super.onDestroy() - } - - override fun onBackPressed() { - binding.viewModel?.apply { - // Do nothing - } - } - companion object { const val EXTRA_START_PATCH_STEP = "EXTRA_START_PATCH_FRAGMENT_UI" - const val EXTRA_START_FROM_MENU = "EXTRA_START_FROM_MENU" + private const val EXTRA_START_FROM_MENU = "EXTRA_START_FROM_MENU" @JvmStatic fun createIntentFromMenu(context: Context, patchStep: PatchStep): Intent { return Intent(context, MedtrumActivity::class.java).apply { diff --git a/pump/omnipod-common/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/common/ui/wizard/common/activity/OmnipodWizardActivityBase.kt b/pump/omnipod-common/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/common/ui/wizard/common/activity/OmnipodWizardActivityBase.kt index 7b56898a59..1399ad58a8 100644 --- a/pump/omnipod-common/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/common/ui/wizard/common/activity/OmnipodWizardActivityBase.kt +++ b/pump/omnipod-common/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/common/ui/wizard/common/activity/OmnipodWizardActivityBase.kt @@ -1,5 +1,8 @@ package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.activity +import android.os.Bundle +import android.os.PersistableBundle +import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AlertDialog import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment @@ -8,7 +11,14 @@ import info.nightscout.core.ui.activities.TranslatedDaggerAppCompatActivity abstract class OmnipodWizardActivityBase : TranslatedDaggerAppCompatActivity() { - override fun onBackPressed() = exitActivityAfterConfirmation() + override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { + super.onCreate(savedInstanceState, persistentState) + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + exitActivityAfterConfirmation() + } + }) + } fun exitActivityAfterConfirmation() { if (getNavController().previousBackStackEntry == null) { diff --git a/pump/pump-common/src/main/AndroidManifest.xml b/pump/pump-common/src/main/AndroidManifest.xml index 43a77bf6e2..c5b155f377 100644 --- a/pump/pump-common/src/main/AndroidManifest.xml +++ b/pump/pump-common/src/main/AndroidManifest.xml @@ -2,11 +2,11 @@ - + diff --git a/pump/pump-common/src/main/java/info/nightscout/pump/common/ui/PumpBLEConfigActivity.kt b/pump/pump-common/src/main/java/info/nightscout/pump/common/ui/PumpBLEConfigActivity.kt index 68c6f30eed..42928f570f 100644 --- a/pump/pump-common/src/main/java/info/nightscout/pump/common/ui/PumpBLEConfigActivity.kt +++ b/pump/pump-common/src/main/java/info/nightscout/pump/common/ui/PumpBLEConfigActivity.kt @@ -13,6 +13,8 @@ import android.content.Context import android.os.Bundle import android.os.Handler import android.os.HandlerThread +import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup @@ -20,6 +22,7 @@ import android.widget.AdapterView import android.widget.AdapterView.OnItemClickListener import android.widget.BaseAdapter import android.widget.TextView +import androidx.core.view.MenuProvider import info.nightscout.core.ui.activities.TranslatedDaggerAppCompatActivity import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.interfaces.plugin.ActivePlugin @@ -140,6 +143,21 @@ class PumpBLEConfigActivity : TranslatedDaggerAppCompatActivity() { updateCurrentlySelectedBTDevice() }) } + + // Add menu items without overriding methods in the Activity + addMenuProvider(object : MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {} + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean = + when (menuItem.itemId) { + android.R.id.home -> { + onBackPressedDispatcher.onBackPressed() + true + } + + else -> false + } + }) } private fun updateCurrentlySelectedBTDevice() { @@ -156,16 +174,6 @@ class PumpBLEConfigActivity : TranslatedDaggerAppCompatActivity() { } } - override fun onOptionsItemSelected(item: MenuItem): Boolean = - when (item.itemId) { - android.R.id.home -> { - finish() - true - } - - else -> super.onOptionsItemSelected(item) - } - override fun onResume() { super.onResume() bleSelector.onResume() diff --git a/pump/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/dialog/RileyLinkBLEConfigActivity.kt b/pump/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/dialog/RileyLinkBLEConfigActivity.kt index a9d0e976b3..da05125412 100644 --- a/pump/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/dialog/RileyLinkBLEConfigActivity.kt +++ b/pump/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/dialog/RileyLinkBLEConfigActivity.kt @@ -17,6 +17,8 @@ import android.os.Bundle import android.os.Handler import android.os.HandlerThread import android.os.ParcelUuid +import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup @@ -26,6 +28,7 @@ import android.widget.BaseAdapter import android.widget.TextView import android.widget.Toast import androidx.core.app.ActivityCompat +import androidx.core.view.MenuProvider import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.R import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil @@ -118,6 +121,21 @@ class RileyLinkBLEConfigActivity : TranslatedDaggerAppCompatActivity() { updateCurrentlySelectedRileyLink() }) } + + // Add menu items without overriding methods in the Activity + addMenuProvider(object : MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {} + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean = + when (menuItem.itemId) { + android.R.id.home -> { + onBackPressedDispatcher.onBackPressed() + true + } + + else -> false + } + }) } private fun updateCurrentlySelectedRileyLink() { @@ -148,16 +166,6 @@ class RileyLinkBLEConfigActivity : TranslatedDaggerAppCompatActivity() { } } - override fun onOptionsItemSelected(item: MenuItem): Boolean = - when (item.itemId) { - android.R.id.home -> { - finish() - true - } - - else -> super.onOptionsItemSelected(item) - } - private fun prepareForScanning() { val checkOK = blePreCheck.prerequisitesCheck(this) if (checkOK) { diff --git a/ui/src/main/java/info/nightscout/ui/activities/TreatmentsActivity.kt b/ui/src/main/java/info/nightscout/ui/activities/TreatmentsActivity.kt index f53797d513..ee79248e3f 100644 --- a/ui/src/main/java/info/nightscout/ui/activities/TreatmentsActivity.kt +++ b/ui/src/main/java/info/nightscout/ui/activities/TreatmentsActivity.kt @@ -1,7 +1,10 @@ package info.nightscout.ui.activities import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem +import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction import com.google.android.material.tabs.TabLayout @@ -61,23 +64,26 @@ class TreatmentsActivity : TranslatedDaggerAppCompatActivity() { override fun onTabUnselected(tab: TabLayout.Tab) {} override fun onTabReselected(tab: TabLayout.Tab) {} }) + + addMenuProvider(object : MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {} + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean = + when (menuItem.itemId) { + android.R.id.home -> { + onBackPressedDispatcher.onBackPressed() + true + } + + else -> false + } + }) } - override fun onOptionsItemSelected(item: MenuItem): Boolean = - when (item.itemId) { - android.R.id.home -> { - finish() - true - } - - else -> super.onOptionsItemSelected(item) - } - private fun setFragment(selectedFragment: Fragment) { supportFragmentManager.beginTransaction() .replace(R.id.fragment_container, selectedFragment) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .commit() } - } \ No newline at end of file From b2d9f1c39bd1d352c2b590dd1d77311f74263d3d Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 14 Aug 2023 16:47:18 +0200 Subject: [PATCH 08/12] Blue AAPSClient2 icon for notifications --- .../info/nightscout/androidaps/implementations/ConfigImpl.kt | 2 ++ .../src/main/java/info/nightscout/interfaces/Config.kt | 4 +++- .../implementation/resources/IconsProviderImplementation.kt | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/implementations/ConfigImpl.kt b/app/src/main/java/info/nightscout/androidaps/implementations/ConfigImpl.kt index 445b2bfe55..4d536a54aa 100644 --- a/app/src/main/java/info/nightscout/androidaps/implementations/ConfigImpl.kt +++ b/app/src/main/java/info/nightscout/androidaps/implementations/ConfigImpl.kt @@ -18,6 +18,8 @@ class ConfigImpl @Inject constructor( override val SUPPORTED_NS_VERSION = 150000 // 15.0.0 override val APS = BuildConfig.FLAVOR == "full" override val NSCLIENT = BuildConfig.FLAVOR == "aapsclient" || BuildConfig.FLAVOR == "aapsclient2" + override val NSCLIENT1 = BuildConfig.FLAVOR == "aapsclient" + override val NSCLIENT2 = BuildConfig.FLAVOR == "aapsclient2" override val PUMPCONTROL = BuildConfig.FLAVOR == "pumpcontrol" override val PUMPDRIVERS = BuildConfig.FLAVOR == "full" || BuildConfig.FLAVOR == "pumpcontrol" override val FLAVOR = BuildConfig.FLAVOR diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/Config.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/Config.kt index 0bfee9e610..a5c4b9c01c 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/Config.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/Config.kt @@ -4,7 +4,9 @@ package info.nightscout.interfaces interface Config { val SUPPORTED_NS_VERSION: Int val APS: Boolean - val NSCLIENT: Boolean + val NSCLIENT: Boolean // aapsclient || aapsclient2 + val NSCLIENT1: Boolean // aapsclient + val NSCLIENT2: Boolean // aapsclient2 val PUMPCONTROL: Boolean val PUMPDRIVERS: Boolean val FLAVOR: String diff --git a/implementation/src/main/java/info/nightscout/implementation/resources/IconsProviderImplementation.kt b/implementation/src/main/java/info/nightscout/implementation/resources/IconsProviderImplementation.kt index b252cb654c..5b7ad08334 100644 --- a/implementation/src/main/java/info/nightscout/implementation/resources/IconsProviderImplementation.kt +++ b/implementation/src/main/java/info/nightscout/implementation/resources/IconsProviderImplementation.kt @@ -11,7 +11,8 @@ class IconsProviderImplementation @Inject constructor(private val config: Config override fun getIcon(): Int = when { - config.NSCLIENT -> info.nightscout.core.ui.R.mipmap.ic_yellowowl + config.NSCLIENT2 -> info.nightscout.core.ui.R.mipmap.ic_blueowl + config.NSCLIENT1 -> info.nightscout.core.ui.R.mipmap.ic_yellowowl config.PUMPCONTROL -> info.nightscout.core.ui.R.mipmap.ic_pumpcontrol else -> info.nightscout.core.ui.R.mipmap.ic_launcher } From 275a7e39d822f0ed37f3ea6dabcccb06a0349e9f Mon Sep 17 00:00:00 2001 From: jbr7rr <> Date: Mon, 14 Aug 2023 21:10:04 +0200 Subject: [PATCH 09/12] Medtrum: Remove unused, typo's and other lints --- .../nightscout/pump/medtrum/MedtrumPlugin.kt | 4 +- .../nightscout/pump/medtrum/MedtrumPump.kt | 26 ++--- .../bindingadapters/ViewBindingAdapter.kt | 18 --- .../pump/medtrum/comm/ManufacturerData.kt | 4 +- .../pump/medtrum/comm/WriteCommandPackets.kt | 13 +-- .../pump/medtrum/comm/enums/AlarmState.kt | 8 +- .../medtrum/comm/enums/MedtrumPumpState.kt | 9 +- .../medtrum/comm/packets/ActivatePacket.kt | 4 +- .../comm/packets/CancelTempBasalPacket.kt | 1 - .../comm/packets/ClearPumpAlarmPacket.kt | 2 +- .../medtrum/comm/packets/GetRecordPacket.kt | 23 ++-- .../medtrum/comm/packets/MedtrumPacket.kt | 4 +- .../comm/packets/NotificationPacket.kt | 22 ++-- .../medtrum/comm/packets/ResumePumpPacket.kt | 1 - .../medtrum/comm/packets/SetTimeZonePacket.kt | 10 +- .../medtrum/comm/packets/SynchronizePacket.kt | 3 +- .../pump/medtrum/encryption/Crypt.kt | 4 +- .../medtrum/extension/ByteArrayExtension.kt | 2 +- .../pump/medtrum/extension/ViewExtension.kt | 23 ---- .../pump/medtrum/services/BLEComm.kt | 14 +-- .../pump/medtrum/services/MedtrumService.kt | 105 +++++++++--------- .../medtrum/ui/MedtrumPreparePatchFragment.kt | 1 - .../ui/MedtrumPrimeCompleteFragment.kt | 1 - .../pump/medtrum/ui/MedtrumPrimeFragment.kt | 1 - .../pump/medtrum/ui/MedtrumPrimingFragment.kt | 1 - .../MedtrumRetryActivationConnectFragment.kt | 1 - .../ui/MedtrumRetryActivationFragment.kt | 3 +- .../ui/MedtrumStartDeactivationFragment.kt | 1 - .../medtrum/ui/viewmodel/BaseViewModel.kt | 2 +- .../ui/viewmodel/MedtrumOverviewViewModel.kt | 4 +- .../medtrum/ui/viewmodel/MedtrumViewModel.kt | 13 +-- .../pump/medtrum/util/MedtrumTimeUtil.kt | 10 +- .../src/main/res/layout/activity_medtrum.xml | 3 +- ...fragment_medtrum_deactivation_complete.xml | 18 ++- .../res/layout/fragment_medtrum_overview.xml | 3 +- pump/medtrum/src/main/res/values/strings.xml | 32 +++--- .../src/main/res/xml/pref_medtrum_pump.xml | 4 +- .../androidaps/ProfileStoreObject.kt | 2 +- .../pump/medtrum/MedtrumPumpTest.kt | 6 +- .../pump/medtrum/MedtrumTestBase.kt | 4 +- .../medtrum/comm/WriteCommandPacketsTest.kt | 4 +- .../comm/packets/ActivatePacketTest.kt | 6 +- .../comm/packets/AuthorizePacketTest.kt | 2 +- .../comm/packets/CancelBolusPacketTest.kt | 2 +- .../comm/packets/CancelTempBasalPacketTest.kt | 6 +- .../comm/packets/ClearPumpAlarmPacketTest.kt | 2 +- .../comm/packets/GetDeviceTypePacketTest.kt | 2 +- .../comm/packets/GetRecordPacketTest.kt | 3 +- .../medtrum/comm/packets/GetTimePacketTest.kt | 2 +- .../medtrum/comm/packets/MedtrumPacketTest.kt | 7 +- .../comm/packets/NotificationPacketTest.kt | 5 +- .../comm/packets/PollPatchPacketTest.kt | 2 +- .../medtrum/comm/packets/PrimePacketTest.kt | 2 +- .../comm/packets/ReadBolusStatePacketTest.kt | 2 +- .../medtrum/comm/packets/ResumePumpPacket.kt | 2 +- .../comm/packets/SetBasalProfilePacketTest.kt | 6 +- .../comm/packets/SetBolusMotorPacketTest.kt | 2 +- .../comm/packets/SetBolusPacketTest.kt | 2 +- .../comm/packets/SetPatchPacketTest.kt | 2 +- .../comm/packets/SetTempBasalPacketTest.kt | 2 +- .../medtrum/comm/packets/SetTimePacketTest.kt | 2 +- .../comm/packets/SetTimeZonePacketTest.kt | 10 +- .../comm/packets/StopPatchPacketTest.kt | 3 +- .../comm/packets/SubscribePacketTest.kt | 2 +- .../comm/packets/SynchronizePacketTest.kt | 3 +- .../pump/medtrum/encryption/CryptTest.kt | 4 +- 66 files changed, 217 insertions(+), 280 deletions(-) diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt index 07446b938c..1b035cc580 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt @@ -295,7 +295,7 @@ import kotlin.math.abs val connectionOK = medtrumService?.setTempBasal(pumpRate, durationInMinutes) ?: false if (connectionOK && medtrumPump.tempBasalInProgress - && Math.abs(medtrumPump.tempBasalAbsoluteRate - pumpRate) <= 0.05 + && abs(medtrumPump.tempBasalAbsoluteRate - pumpRate) <= 0.05 ) { return PumpEnactResult(injector).success(true).enacted(true).duration(durationInMinutes).absolute(medtrumPump.tempBasalAbsoluteRate) @@ -436,7 +436,7 @@ import kotlin.math.abs if (isInitialized()) { commandQueue.updateTime(object : Callback() { override fun run() { - if (this.result.success == false) { + if (!this.result.success) { aapsLogger.error(LTag.PUMP, "Medtrum time update failed") // Only notify here on failure (connection may be failed), service will handle success medtrumService?.timeUpdateNotification(false) diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPump.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPump.kt index fd24934cda..fb1ce89d05 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPump.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPump.kt @@ -291,11 +291,11 @@ class MedtrumPump @Inject constructor( } fun loadUserSettingsFromSP() { - desiredPatchExpiration = sp.getBoolean(info.nightscout.pump.medtrum.R.string.key_patch_expiration, false) - val alarmSettingCode = sp.getString(info.nightscout.pump.medtrum.R.string.key_alarm_setting, AlarmSetting.LIGHT_VIBRATE_AND_BEEP.code.toString()).toByte() + desiredPatchExpiration = sp.getBoolean(R.string.key_patch_expiration, false) + val alarmSettingCode = sp.getString(R.string.key_alarm_setting, AlarmSetting.LIGHT_VIBRATE_AND_BEEP.code.toString()).toByte() desiredAlarmSetting = AlarmSetting.values().firstOrNull { it.code == alarmSettingCode } ?: AlarmSetting.LIGHT_VIBRATE_AND_BEEP - desiredHourlyMaxInsulin = sp.getInt(info.nightscout.pump.medtrum.R.string.key_hourly_max_insulin, 40) - desiredDailyMaxInsulin = sp.getInt(info.nightscout.pump.medtrum.R.string.key_daily_max_insulin, 180) + desiredHourlyMaxInsulin = sp.getInt(R.string.key_hourly_max_insulin, 40) + desiredDailyMaxInsulin = sp.getInt(R.string.key_daily_max_insulin, 180) _pumpSN = pumpSNFromSP } @@ -502,12 +502,12 @@ class MedtrumPump @Inject constructor( AlarmState.PUMP_LOW_BATTERY -> R.string.alarm_pump_low_battery AlarmState.PUMP_LOW_RESERVOIR -> R.string.alarm_pump_low_reservoir AlarmState.PUMP_EXPIRES_SOON -> R.string.alarm_pump_expires_soon - AlarmState.LOWBG_SUSPENDED -> R.string.alarm_lowbg_suspended - AlarmState.LOWBG_SUSPENDED2 -> R.string.alarm_lowbg_suspended2 - AlarmState.AUTO_SUSPENDED -> R.string.alarm_auto_suspended - AlarmState.HMAX_SUSPENDED -> R.string.alarm_hmax_suspended - AlarmState.DMAX_SUSPENDED -> R.string.alarm_dmax_suspended - AlarmState.SUSPENDED -> R.string.alarm_suspended + AlarmState.LOW_BG_SUSPENDED -> R.string.alarm_low_bg_suspended + AlarmState.LOW_BG_SUSPENDED2 -> R.string.alarm_low_bg_suspended2 + AlarmState.AUTO_SUSPENDED -> R.string.alarm_auto_suspended + AlarmState.HOURLY_MAX_SUSPENDED -> R.string.alarm_hourly_max_suspended + AlarmState.DAILY_MAX_SUSPENDED -> R.string.alarm_daily_max_suspended + AlarmState.SUSPENDED -> R.string.alarm_suspended AlarmState.PAUSED -> R.string.alarm_paused AlarmState.OCCLUSION -> R.string.alarm_occlusion AlarmState.EXPIRED -> R.string.alarm_expired @@ -528,10 +528,10 @@ class MedtrumPump @Inject constructor( private fun loadActiveAlarms() { val alarmsStr = sp.getString(R.string.key_active_alarms, "") - if (alarmsStr.isNullOrEmpty()) { - activeAlarms = EnumSet.noneOf(AlarmState::class.java) + activeAlarms = if (alarmsStr.isEmpty()) { + EnumSet.noneOf(AlarmState::class.java) } else { - activeAlarms = alarmsStr.split(",") + alarmsStr.split(",") .mapNotNull { AlarmState.values().find { alarm -> alarm.name == it } } .let { EnumSet.copyOf(it) } } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/bindingadapters/ViewBindingAdapter.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/bindingadapters/ViewBindingAdapter.kt index f4b51efe1a..17f5090276 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/bindingadapters/ViewBindingAdapter.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/bindingadapters/ViewBindingAdapter.kt @@ -1,20 +1,7 @@ package info.nightscout.pump.medtrum.bindingadapters import android.view.View -import android.widget.TextView -import androidx.annotation.ColorRes import androidx.databinding.BindingAdapter -import info.nightscout.pump.medtrum.extension.setVisibleOrGone - -@BindingAdapter("android:visibility") -fun setVisibility(view: View, visible: Boolean) { - view.setVisibleOrGone(visible) -} - -@BindingAdapter("visibleOrGone") -fun setVisibleOrGone(view: View, visibleOrGone: Boolean) { - view.setVisibleOrGone(visibleOrGone) -} @BindingAdapter("onSafeClick") fun View.setOnSafeClickListener(clickListener: View.OnClickListener?) { @@ -22,8 +9,3 @@ fun View.setOnSafeClickListener(clickListener: View.OnClickListener?) { setOnClickListener(OnSafeClickListener(it)) } ?: setOnClickListener(null) } - -@BindingAdapter("textColor") -fun setTextColor(view: TextView, @ColorRes colorResId: Int) { - view.setTextColor(view.context.getColor(colorResId)) -} diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/ManufacturerData.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/ManufacturerData.kt index 098d31d984..a6ef2f3ae8 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/ManufacturerData.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/ManufacturerData.kt @@ -3,7 +3,7 @@ package info.nightscout.pump.medtrum.comm import kotlin.experimental.and import info.nightscout.pump.medtrum.extension.toLong -class ManufacturerData(private val manufacturerDataBytes: ByteArray) { +class ManufacturerData(manufacturerDataBytes: ByteArray) { private var deviceID: Long = 0 private var deviceType = 0 private var version = 0 @@ -12,7 +12,7 @@ class ManufacturerData(private val manufacturerDataBytes: ByteArray) { setData(manufacturerDataBytes) } - fun setData(inputData: ByteArray) { + private fun setData(inputData: ByteArray) { var index = 0 val deviceIDBytes: ByteArray = inputData.copyOfRange(index, index + 4) deviceID = deviceIDBytes.toLong() diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/WriteCommandPackets.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/WriteCommandPackets.kt index ae0f18e9f4..31655f3ed9 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/WriteCommandPackets.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/WriteCommandPackets.kt @@ -9,21 +9,20 @@ class WriteCommandPackets(data: ByteArray, sequenceNumber: Int) { init { // PackageIndex: 0 initially, if there are multiple packets, for the first packet it is set to 0 (not included in CRC calculation but sent in actual header) - var pkgIndex = 0 - var header = byteArrayOf( + val header = byteArrayOf( (data.size + 4).toByte(), data[0], sequenceNumber.toByte(), - pkgIndex.toByte() + 0.toByte() // pkgIndex ) var tmp: ByteArray = header + data.copyOfRange(1, data.size) - var totalCommand: ByteArray = tmp + calcCrc8(tmp, tmp.size).toByte() + val totalCommand: ByteArray = tmp + calcCrc8(tmp, tmp.size).toByte() if ((totalCommand.size - header.size) <= 15) { packages.add(totalCommand + 0.toByte()) } else { - pkgIndex = 1 + var pkgIndex = 1 var remainingCommand = totalCommand.copyOfRange(4, totalCommand.size) while (remainingCommand.size > 15) { @@ -52,13 +51,13 @@ class WriteCommandPackets(data: ByteArray, sequenceNumber: Int) { } fun allPacketsConsumed(): Boolean { - return !(index < packages.size) + return index >= packages.size } private fun calcCrc8(value: ByteArray, size: Int): Int { var crc8 = 0 for (i in 0 until size) { - crc8 = CRC_8_TABLE[(value[i].toInt() and 255) xor (crc8 and 255)].toInt() and 255 + crc8 = CRC_8_TABLE[(value[i].toInt() and 255) xor (crc8 and 255)] and 255 } return crc8 } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/enums/AlarmState.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/enums/AlarmState.kt index 50ae4e30f6..ebc4fc5601 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/enums/AlarmState.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/enums/AlarmState.kt @@ -5,11 +5,11 @@ enum class AlarmState { PUMP_LOW_BATTERY, // Mapped from error flag 1 PUMP_LOW_RESERVOIR, // Mapped from error flag 2 PUMP_EXPIRES_SOON, // Mapped from error flag 3 - LOWBG_SUSPENDED, // Mapped from pump status 64 - LOWBG_SUSPENDED2, // Mapped from pump status 65 + LOW_BG_SUSPENDED, // Mapped from pump status 64 + LOW_BG_SUSPENDED2, // Mapped from pump status 65 AUTO_SUSPENDED, // Mapped from pump status 66 - HMAX_SUSPENDED, // Mapped from pump status 67 - DMAX_SUSPENDED, // Mapped from pump status 68 + HOURLY_MAX_SUSPENDED, // Mapped from pump status 67 + DAILY_MAX_SUSPENDED, // Mapped from pump status 68 SUSPENDED, // Mapped from pump status 69 PAUSED, // Mapped from pump status 70 OCCLUSION, // Mapped from pump status 96 diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/enums/MedtrumPumpState.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/enums/MedtrumPumpState.kt index b52b9c1793..c17caa6ad9 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/enums/MedtrumPumpState.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/enums/MedtrumPumpState.kt @@ -10,11 +10,11 @@ enum class MedtrumPumpState(val state: Byte) { EJECTED(6), ACTIVE(32), ACTIVE_ALT(33), - LOWBG_SUSPENDED(64), - LOWBG_SUSPENDED2(65), + LOW_BG_SUSPENDED(64), + LOW_BG_SUSPENDED2(65), AUTO_SUSPENDED(66), - HMAX_SUSPENDED(67), - DMAX_SUSPENDED(68), + HOURLY_MAX_SUSPENDED(67), + DAILY_MAX_SUSPENDED(68), SUSPENDED(69), PAUSED(70), OCCLUSION(96), @@ -28,6 +28,7 @@ enum class MedtrumPumpState(val state: Byte) { STOPPED(128.toByte()); companion object { + fun fromByte(state: Byte) = values().find { it.state == state } ?: throw IllegalAccessException("") } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ActivatePacket.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ActivatePacket.kt index 838fff9727..8ec37c2e2c 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ActivatePacket.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ActivatePacket.kt @@ -55,7 +55,7 @@ class ActivatePacket(injector: HasAndroidInjector, private val basalProfile: Byt * byte 6: predictiveLowSuspend // Value for auto mode, not used for AAPS * byte 7: predictiveLowSuspendRange // Value for auto mode, not used for AAPS * byte 8-9: hourlyMaxInsulin // Max hourly dose of insulin, divided by 0.05 - * byte 10-11: daylyMaxSet // Max daily dose of insulin, divided by 0.05 + * byte 10-11: dailyMaxSet // Max daily dose of insulin, divided by 0.05 * byte 12-13: tddToday // Current TDD (of present day), divided by 0.05 * byte 14: 1 // Always 1 * bytes 15 - end // Basal profile > see MedtrumPump @@ -98,7 +98,7 @@ class ActivatePacket(injector: HasAndroidInjector, private val basalProfile: Byt medtrumPump.currentSequenceNumber = basalSequence // We are activated, set the new seq nr medtrumPump.syncedSequenceNumber = basalSequence // We are activated, reset the synced seq nr () - // Sync canula change + // Sync cannula change pumpSync.insertTherapyEventIfNewWithTimestamp( timestamp = System.currentTimeMillis(), type = DetailedBolusInfo.EventType.CANNULA_CHANGE, diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/CancelTempBasalPacket.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/CancelTempBasalPacket.kt index f6b54aaa18..e271d53db7 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/CancelTempBasalPacket.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/CancelTempBasalPacket.kt @@ -7,7 +7,6 @@ import info.nightscout.pump.medtrum.comm.enums.BasalType import info.nightscout.pump.medtrum.extension.toInt import info.nightscout.pump.medtrum.extension.toLong import info.nightscout.pump.medtrum.util.MedtrumTimeUtil -import info.nightscout.rx.logging.LTag import info.nightscout.shared.utils.DateUtil import javax.inject.Inject diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ClearPumpAlarmPacket.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ClearPumpAlarmPacket.kt index 15f860fc50..023572873b 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ClearPumpAlarmPacket.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ClearPumpAlarmPacket.kt @@ -4,7 +4,7 @@ import dagger.android.HasAndroidInjector import info.nightscout.pump.medtrum.comm.enums.CommandType.CLEAR_ALARM import info.nightscout.pump.medtrum.extension.toByteArray -class ClearPumpAlarmPacket(injector: HasAndroidInjector, val clearType: Int) : MedtrumPacket(injector) { +class ClearPumpAlarmPacket(injector: HasAndroidInjector, private val clearType: Int) : MedtrumPacket(injector) { init { opCode = CLEAR_ALARM.code diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/GetRecordPacket.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/GetRecordPacket.kt index ad127fed14..3c3757f66e 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/GetRecordPacket.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/GetRecordPacket.kt @@ -15,7 +15,6 @@ import info.nightscout.pump.medtrum.extension.toLong import info.nightscout.pump.medtrum.util.MedtrumTimeUtil import info.nightscout.rx.logging.LTag import info.nightscout.shared.utils.DateUtil -import info.nightscout.shared.utils.T import javax.inject.Inject class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int) : MedtrumPacket(injector) { @@ -38,9 +37,9 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int private const val RESP_RECORD_UNKNOWN1_END = RESP_RECORD_UNKNOWN1_START + 1 private const val RESP_RECORD_SERIAL_START = RESP_RECORD_UNKNOWN1_END private const val RESP_RECORD_SERIAL_END = RESP_RECORD_SERIAL_START + 4 - private const val RESP_RECORD_PATCHID_START = RESP_RECORD_SERIAL_END - private const val RESP_RECORD_PATCHID_END = RESP_RECORD_PATCHID_START + 2 - private const val RESP_RECORD_SEQUENCE_START = RESP_RECORD_PATCHID_END + private const val RESP_RECORD_PATCH_ID_START = RESP_RECORD_SERIAL_END + private const val RESP_RECORD_PATCH_ID_END = RESP_RECORD_PATCH_ID_START + 2 + private const val RESP_RECORD_SEQUENCE_START = RESP_RECORD_PATCH_ID_END private const val RESP_RECORD_SEQUENCE_END = RESP_RECORD_SEQUENCE_START + 2 private const val RESP_RECORD_DATA_START = RESP_RECORD_SEQUENCE_END @@ -75,7 +74,7 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int val recordUnknown = data.copyOfRange(RESP_RECORD_UNKNOWN_START, RESP_RECORD_UNKNOWN_END).toInt() val recordType = data.copyOfRange(RESP_RECORD_TYPE_START, RESP_RECORD_TYPE_END).toInt() val recordSerial = data.copyOfRange(RESP_RECORD_SERIAL_START, RESP_RECORD_SERIAL_END).toLong() - val recordPatchId = data.copyOfRange(RESP_RECORD_PATCHID_START, RESP_RECORD_PATCHID_END).toInt() + val recordPatchId = data.copyOfRange(RESP_RECORD_PATCH_ID_START, RESP_RECORD_PATCH_ID_END).toInt() val recordSequence = data.copyOfRange(RESP_RECORD_SEQUENCE_START, RESP_RECORD_SEQUENCE_END).toInt() aapsLogger.debug( @@ -101,13 +100,15 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int val bolusCarb = data.copyOfRange(RESP_RECORD_DATA_START + 18, RESP_RECORD_DATA_START + 20).toInt() val bolusGlucose = data.copyOfRange(RESP_RECORD_DATA_START + 20, RESP_RECORD_DATA_START + 22).toInt() val bolusIOB = data.copyOfRange(RESP_RECORD_DATA_START + 22, RESP_RECORD_DATA_START + 24).toInt() - val unkown1 = data.copyOfRange(RESP_RECORD_DATA_START + 24, RESP_RECORD_DATA_START + 26).toInt() - val unkown2 = data.copyOfRange(RESP_RECORD_DATA_START + 26, RESP_RECORD_DATA_START + 28).toInt() + val unknown1 = data.copyOfRange(RESP_RECORD_DATA_START + 24, RESP_RECORD_DATA_START + 26).toInt() + val unknown2 = data.copyOfRange(RESP_RECORD_DATA_START + 26, RESP_RECORD_DATA_START + 28).toInt() val bolusType = enumValues()[typeAndWizard and 0x0F] val bolusWizard = (typeAndWizard and 0xF0) != 0 aapsLogger.debug( LTag.PUMPCOMM, - "GetRecordPacket HandleResponse: BOLUS_RECORD: typeAndWizard: $typeAndWizard, bolusCause: $bolusCause, unknown: $unknown, bolusStartTime: $bolusStartTime, " + "bolusNormalAmount: $bolusNormalAmount, bolusNormalDelivered: $bolusNormalDelivered, bolusExtendedAmount: $bolusExtendedAmount, bolusExtendedDuration: $bolusExtendedDuration, " + "bolusExtendedDelivered: $bolusExtendedDelivered, bolusCarb: $bolusCarb, bolusGlucose: $bolusGlucose, bolusIOB: $bolusIOB, unkown1: $unkown1, unkown2: $unkown2, " + "bolusType: $bolusType, bolusWizard: $bolusWizard" + "GetRecordPacket HandleResponse: BOLUS_RECORD: typeAndWizard: $typeAndWizard, bolusCause: $bolusCause, unknown: $unknown, bolusStartTime: $bolusStartTime, " + + "bolusNormalAmount: $bolusNormalAmount, bolusNormalDelivered: $bolusNormalDelivered, bolusExtendedAmount: $bolusExtendedAmount, bolusExtendedDuration: " + + "$bolusExtendedDuration, " + "bolusExtendedDelivered: $bolusExtendedDelivered, bolusCarb: $bolusCarb, bolusGlucose: $bolusGlucose, bolusIOB: $bolusIOB, unknown1: $unknown1, unknown2: $unknown2, " + "bolusType: $bolusType, bolusWizard: $bolusWizard" ) if (bolusType == BolusType.NORMAL) { @@ -123,7 +124,7 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int pumpType = medtrumPump.pumpType(), pumpSerial = medtrumPump.pumpSN.toString(radix = 16) ) - if (syncOk == false) { + if (!syncOk) { aapsLogger.warn(LTag.PUMPCOMM, "GetRecordPacket HandleResponse: BOLUS_RECORD: Failed to sync bolus with tempId: ${detailedBolusInfo.timestamp}") // detailedInfo can be from another similar record. Reinsert detailedBolusInfoStorage.add(detailedBolusInfo) @@ -298,7 +299,7 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int aapsLogger.debug(LTag.PUMPCOMM, "GetRecordPacket HandleResponse: TDD_RECORD") val timestamp = MedtrumTimeUtil().convertPumpTimeToSystemTimeMillis(data.copyOfRange(RESP_RECORD_DATA_START, RESP_RECORD_DATA_START + 4).toLong()) val timeZoneOffset = data.copyOfRange(RESP_RECORD_DATA_START + 4, RESP_RECORD_DATA_START + 6).toInt() - val tddMins = data.copyOfRange(RESP_RECORD_DATA_START + 6, RESP_RECORD_DATA_START + 8).toInt() + val tddMinutes = data.copyOfRange(RESP_RECORD_DATA_START + 6, RESP_RECORD_DATA_START + 8).toInt() val glucoseRecordTime = data.copyOfRange(RESP_RECORD_DATA_START + 8, RESP_RECORD_DATA_START + 12).toLong() val tdd = data.copyOfRange(RESP_RECORD_DATA_START + 12, RESP_RECORD_DATA_START + 16).toFloat() val basalTdd = data.copyOfRange(RESP_RECORD_DATA_START + 16, RESP_RECORD_DATA_START + 20).toFloat() @@ -315,7 +316,7 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int val newUMax = data.copyOfRange(RESP_RECORD_DATA_START + 60, RESP_RECORD_DATA_START + 64).toFloat() aapsLogger.debug( - LTag.PUMPCOMM, "TDD_RECORD: timestamp: $timestamp, timeZoneOffset: $timeZoneOffset, tddMins: $tddMins, glucoseRecordTime: $glucoseRecordTime, tdd: " + + LTag.PUMPCOMM, "TDD_RECORD: timestamp: $timestamp, timeZoneOffset: $timeZoneOffset, tddMinutes: $tddMinutes, glucoseRecordTime: $glucoseRecordTime, tdd: " + "$tdd, basalTdd: $basalTdd, glucose: $glucose, unknown: $unknown, meanSomething: $meanSomething, usedTdd: $usedTdd, usedIBasal: $usedIBasal, usedSgBasal: " + "$usedSgBasal, usedUMax: $usedUMax, newTdd: $newTdd, newIBasal: $newIBasal, newSgBasal: $newSgBasal, newUMax: $newUMax" ) diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/MedtrumPacket.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/MedtrumPacket.kt index 6b175c06df..cc6e7f5f77 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/MedtrumPacket.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/MedtrumPacket.kt @@ -25,7 +25,7 @@ open class MedtrumPacket(protected var injector: HasAndroidInjector) { } init { - // @Suppress("LeakingThis") + @Suppress("LeakingThis") injector.androidInjector().inject(this) } @@ -33,7 +33,7 @@ open class MedtrumPacket(protected var injector: HasAndroidInjector) { return byteArrayOf(opCode) } - /** handles a response from the Medtrum pump, returns true if command was successfull, returns false if command failed or waiting for response */ + /** handles a response from the Medtrum pump, returns true if command was successful, returns false if command failed or waiting for response */ open fun handleResponse(data: ByteArray): Boolean { // Check for broken packets if (RESP_RESULT_END > data.size) { diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/NotificationPacket.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/NotificationPacket.kt index a37b5323cd..e9a1cdae87 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/NotificationPacket.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/NotificationPacket.kt @@ -19,7 +19,7 @@ class NotificationPacket(val injector: HasAndroidInjector) { * but a notification packet. It is sent by the pump to the phone * when the pump has a notification to send. * - * Notifications are sent regualary, regardless of the pump state. + * Notifications are sent regularly, regardless of the pump state. * * There can be multiple messages in one packet, this is noted by the fieldMask. * @@ -97,10 +97,10 @@ class NotificationPacket(val injector: HasAndroidInjector) { if (fieldMask and MASK_NORMAL_BOLUS != 0) { aapsLogger.debug(LTag.PUMPCOMM, "Normal bolus notification received") - var bolusData = data.copyOfRange(offset, offset + 1).toInt() - var bolusType = bolusData and 0x7F + val bolusData = data.copyOfRange(offset, offset + 1).toInt() + val bolusType = bolusData and 0x7F val bolusCompleted: Boolean = ((bolusData shr 7) and 0x01) != 0 - var bolusDelivered = data.copyOfRange(offset + 1, offset + 3).toInt() * 0.05 + val bolusDelivered = data.copyOfRange(offset + 1, offset + 3).toInt() * 0.05 aapsLogger.debug(LTag.PUMPCOMM, "Bolus type: $bolusType, bolusData: $bolusData bolus completed: $bolusCompleted, bolus delivered: $bolusDelivered") medtrumPump.handleBolusStatusUpdate(bolusType, bolusCompleted, bolusDelivered) offset += 3 @@ -115,12 +115,12 @@ class NotificationPacket(val injector: HasAndroidInjector) { if (fieldMask and MASK_BASAL != 0) { aapsLogger.debug(LTag.PUMPCOMM, "Basal notification received") val basalType = enumValues()[data.copyOfRange(offset, offset + 1).toInt()] - var basalSequence = data.copyOfRange(offset + 1, offset + 3).toInt() - var basalPatchId = data.copyOfRange(offset + 3, offset + 5).toLong() - var basalStartTime = MedtrumTimeUtil().convertPumpTimeToSystemTimeMillis(data.copyOfRange(offset + 5, offset + 9).toLong()) - var basalRateAndDelivery = data.copyOfRange(offset + 9, offset + 12).toInt() - var basalRate = (basalRateAndDelivery and 0xFFF) * 0.05 - var basalDelivery = (basalRateAndDelivery shr 12) * 0.05 + val basalSequence = data.copyOfRange(offset + 1, offset + 3).toInt() + val basalPatchId = data.copyOfRange(offset + 3, offset + 5).toLong() + val basalStartTime = MedtrumTimeUtil().convertPumpTimeToSystemTimeMillis(data.copyOfRange(offset + 5, offset + 9).toLong()) + val basalRateAndDelivery = data.copyOfRange(offset + 9, offset + 12).toInt() + val basalRate = (basalRateAndDelivery and 0xFFF) * 0.05 + val basalDelivery = (basalRateAndDelivery shr 12) * 0.05 aapsLogger.debug( LTag.PUMPCOMM, "Basal type: $basalType, basal sequence: $basalSequence, basal patch id: $basalPatchId, basal time: $basalStartTime, basal rate: $basalRate, basal delivery: $basalDelivery" @@ -159,7 +159,7 @@ class NotificationPacket(val injector: HasAndroidInjector) { if (fieldMask and MASK_BATTERY != 0) { aapsLogger.debug(LTag.PUMPCOMM, "Battery notification received") - var parameter = data.copyOfRange(offset, offset + 3).toInt() + val parameter = data.copyOfRange(offset, offset + 3).toInt() // Precision for voltage A is a guess, voltage B is the important one, threshold: < 2.64 medtrumPump.batteryVoltage_A = (parameter and 0xFFF) / 512.0 medtrumPump.batteryVoltage_B = (parameter shr 12) / 512.0 diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ResumePumpPacket.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ResumePumpPacket.kt index aa613b3656..63ecaab62c 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ResumePumpPacket.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/ResumePumpPacket.kt @@ -2,7 +2,6 @@ package info.nightscout.pump.medtrum.comm.packets import dagger.android.HasAndroidInjector import info.nightscout.pump.medtrum.comm.enums.CommandType.RESUME_PUMP -import info.nightscout.pump.medtrum.extension.toByteArray class ResumePumpPacket(injector: HasAndroidInjector) : MedtrumPacket(injector) { diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/SetTimeZonePacket.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/SetTimeZonePacket.kt index 129e665cf8..cbddb8c75d 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/SetTimeZonePacket.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/SetTimeZonePacket.kt @@ -13,7 +13,7 @@ class SetTimeZonePacket(injector: HasAndroidInjector) : MedtrumPacket(injector) @Inject lateinit var dateUtil: DateUtil @Inject lateinit var medtrumPump: MedtrumPump - var offsetMins: Int = 0 + private var offsetMinutes: Int = 0 init { opCode = SET_TIME_ZONE.code @@ -21,15 +21,15 @@ class SetTimeZonePacket(injector: HasAndroidInjector) : MedtrumPacket(injector) override fun getRequest(): ByteArray { val time = MedtrumTimeUtil().getCurrentTimePumpSeconds() - offsetMins = dateUtil.getTimeZoneOffsetMinutes(dateUtil.now()) - if (offsetMins < 0) offsetMins += 65536 - return byteArrayOf(opCode) + offsetMins.toByteArray(2) + time.toByteArray(4) + offsetMinutes = dateUtil.getTimeZoneOffsetMinutes(dateUtil.now()) + if (offsetMinutes < 0) offsetMinutes += 65536 + return byteArrayOf(opCode) + offsetMinutes.toByteArray(2) + time.toByteArray(4) } override fun handleResponse(data: ByteArray): Boolean { val success = super.handleResponse(data) if (success) { - medtrumPump.pumpTimeZoneOffset = offsetMins + medtrumPump.pumpTimeZoneOffset = offsetMinutes } return success } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/SynchronizePacket.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/SynchronizePacket.kt index 4df32dafe7..c7fd95acea 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/SynchronizePacket.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/SynchronizePacket.kt @@ -16,7 +16,6 @@ class SynchronizePacket(injector: HasAndroidInjector) : MedtrumPacket(injector) companion object { private const val RESP_STATE_START = 6 - private const val RESP_STATE_END = RESP_STATE_START + 1 private const val RESP_FIELDS_START = 7 private const val RESP_FIELDS_END = RESP_FIELDS_START + 2 private const val RESP_SYNC_DATA_START = 9 @@ -34,7 +33,7 @@ class SynchronizePacket(injector: HasAndroidInjector) : MedtrumPacket(injector) override fun handleResponse(data: ByteArray): Boolean { val success = super.handleResponse(data) if (success) { - var state = MedtrumPumpState.fromByte(data[RESP_STATE_START]) + val state = MedtrumPumpState.fromByte(data[RESP_STATE_START]) aapsLogger.debug(LTag.PUMPCOMM, "SynchronizePacket: state: $state") if (state != medtrumPump.pumpState) { diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/encryption/Crypt.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/encryption/Crypt.kt index ce5126de48..a4f7e6c0df 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/encryption/Crypt.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/encryption/Crypt.kt @@ -8,7 +8,7 @@ class Crypt { private val RIJNDEAL_S_BOX: IntArray = intArrayOf(99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22) private val RIJNDEAL_INVERSE_S_BOX: IntArray = intArrayOf(82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125) - val MED_CIPHER: Long = 1344751489 + private val MED_CIPHER: Long = 1344751489 fun keyGen(input: Long): Long { val key = randomGen(randomGen(MED_CIPHER xor input)) @@ -25,7 +25,7 @@ class Crypt { private fun simpleCrypt(inputData: Long): Long { var temp = inputData xor MED_CIPHER for (i in 0 until 32) { - temp = changeByTable(rotatoLeft(temp, 32, 1), RIJNDEAL_S_BOX).toLong() + temp = changeByTable(rotatoLeft(temp, 32, 1), RIJNDEAL_S_BOX) } return temp } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/extension/ByteArrayExtension.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/extension/ByteArrayExtension.kt index 4e1d431086..dac514c20a 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/extension/ByteArrayExtension.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/extension/ByteArrayExtension.kt @@ -21,7 +21,7 @@ fun ByteArray.toInt(): Int { var result = 0 for (i in this.indices) { val byte = this[i] - val shifted = (byte.toInt() and 0xFF).toInt() shl 8 * i + val shifted = (byte.toInt() and 0xFF) shl 8 * i result = result or shifted } return result diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/extension/ViewExtension.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/extension/ViewExtension.kt index 5cf65baeb6..2bab7086c4 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/extension/ViewExtension.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/extension/ViewExtension.kt @@ -9,26 +9,3 @@ fun View?.visible(vararg views: View?) { for (view in views) view.visible() } - -fun View?.invisible() = this?.run { visibility = View.INVISIBLE } - -fun View?.invisible(vararg views: View?) { - invisible() - for (view in views) - view.invisible() -} - -fun View?.gone() = this?.run { visibility = View.GONE } - -fun View?.gone(vararg views: View?) { - gone() - for (view in views) - view.gone() -} - -fun View?.setVisibleOrGone(visibleOrGone: Boolean, vararg views: View?) { - for (view in views) - if (visibleOrGone) view.visible() else view.gone() -} - -fun View?.setVisibleOrGone(visibleOrGone: Boolean) = setVisibleOrGone(visibleOrGone, this) diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/BLEComm.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/BLEComm.kt index b4058efd49..13de8dfacc 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/BLEComm.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/BLEComm.kt @@ -241,16 +241,16 @@ class BLEComm @Inject internal constructor( } override fun onCharacteristicRead(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic, status: Int) { - aapsLogger.debug(LTag.PUMPBTCOMM, "onCharacteristicRead data: " + characteristic.value.contentToString() + " UUID: " + characteristic.getUuid().toString() + " status: " + status) + aapsLogger.debug(LTag.PUMPBTCOMM, "onCharacteristicRead data: " + characteristic.value.contentToString() + " UUID: " + characteristic.uuid.toString() + " status: " + status) } override fun onCharacteristicChanged(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) { - aapsLogger.debug(LTag.PUMPBTCOMM, "onCharacteristicChanged data: " + characteristic.value.contentToString() + " UUID: " + characteristic.getUuid().toString()) + aapsLogger.debug(LTag.PUMPBTCOMM, "onCharacteristicChanged data: " + characteristic.value.contentToString() + " UUID: " + characteristic.uuid.toString()) - val value = characteristic.getValue() - if (characteristic.getUuid() == UUID.fromString(READ_UUID)) { + val value = characteristic.value + if (characteristic.uuid == UUID.fromString(READ_UUID)) { mCallback?.onNotification(value) - } else if (characteristic.getUuid() == UUID.fromString(WRITE_UUID)) { + } else if (characteristic.uuid == UUID.fromString(WRITE_UUID)) { synchronized(readLock) { if (mReadPacket == null) { mReadPacket = ReadDataPacket(value) @@ -398,7 +398,7 @@ class BLEComm @Inject internal constructor( @Synchronized fun sendMessage(message: ByteArray) { - aapsLogger.debug(LTag.PUMPBTCOMM, "sendMessage message = " + Arrays.toString(message)) + aapsLogger.debug(LTag.PUMPBTCOMM, "sendMessage message = " + message.contentToString()) if (mWritePackets?.allPacketsConsumed() == false) { aapsLogger.error(LTag.PUMPBTCOMM, "sendMessage not all packets consumed!! unable to sent message!") return @@ -455,7 +455,7 @@ class BLEComm @Inject internal constructor( val gattService = getGattService() ?: return var uuid: String val gattCharacteristics = gattService.characteristics - for (i in 0..gattCharacteristics.size - 1) { + for (i in 0 until gattCharacteristics.size) { val gattCharacteristic = gattCharacteristics.get(i) // Check whether read or write properties is set, the pump needs us to enable notifications on all characteristics that have these properties if (gattCharacteristic.properties and NEEDS_ENABLE > 0) { diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/MedtrumService.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/MedtrumService.kt index 9fc02a1625..da05d95f01 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/MedtrumService.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/MedtrumService.kt @@ -29,7 +29,6 @@ import info.nightscout.pump.medtrum.code.ConnectionState import info.nightscout.pump.medtrum.comm.enums.AlarmState import info.nightscout.pump.medtrum.comm.enums.MedtrumPumpState import info.nightscout.pump.medtrum.comm.packets.* -import info.nightscout.pump.medtrum.util.MedtrumTimeUtil import info.nightscout.rx.AapsSchedulers import info.nightscout.rx.bus.RxBus import info.nightscout.rx.events.EventAppExit @@ -84,8 +83,6 @@ class MedtrumService : DaggerService(), BLECommCallback { private const val ALARM_DAILY_MAX_CLEAR_CODE = 5 } - val timeUtil = MedtrumTimeUtil() - private val disposable = CompositeDisposable() private val mBinder: IBinder = LocalBinder() @@ -124,7 +121,7 @@ class MedtrumService : DaggerService(), BLECommCallback { medtrumPump.loadUserSettingsFromSP() commandQueue.setUserOptions(object : Callback() { override fun run() { - if (medtrumPlugin.isInitialized() && this.result.success == false) { + if (medtrumPlugin.isInitialized() && !this.result.success) { uiInteraction.addNotification( Notification.PUMP_SETTINGS_FAILED, rh.gs(R.string.pump_setting_failed), @@ -204,7 +201,7 @@ class MedtrumService : DaggerService(), BLECommCallback { } fun readPumpStatus() { - rxBus.send(EventPumpStatusChanged(rh.gs(R.string.gettingpumpstatus))) + rxBus.send(EventPumpStatusChanged(rh.gs(R.string.getting_pump_status))) updateTimeIfNeeded(false) loadEvents() } @@ -229,7 +226,7 @@ class MedtrumService : DaggerService(), BLECommCallback { fun updateTimeIfNeeded(needLoadHistory: Boolean = true): Boolean { // Note we only check timeZone here, time is updated each connection attempt if needed, because the pump requires it to be checked - // But we dont check timeZone each time, therefore we do it here (if needed) + // But we don't check timeZone each time, therefore we do it here (if needed) var result = true if (medtrumPump.pumpTimeZoneOffset != dateUtil.getTimeZoneOffsetMinutes(dateUtil.now())) { result = sendPacketAndGetResponse(SetTimePacket(injector)) @@ -245,7 +242,7 @@ class MedtrumService : DaggerService(), BLECommCallback { } fun loadEvents(): Boolean { - rxBus.send(EventPumpStatusChanged(rh.gs(R.string.gettingpumpstatus))) + rxBus.send(EventPumpStatusChanged(rh.gs(R.string.getting_pump_status))) // Sync records val result = syncRecords() if (result) { @@ -261,16 +258,16 @@ class MedtrumService : DaggerService(), BLECommCallback { var result = true if (medtrumPump.pumpState in listOf( MedtrumPumpState.PAUSED, - MedtrumPumpState.HMAX_SUSPENDED, - MedtrumPumpState.DMAX_SUSPENDED + MedtrumPumpState.HOURLY_MAX_SUSPENDED, + MedtrumPumpState.DAILY_MAX_SUSPENDED ) ) { when (medtrumPump.pumpState) { - MedtrumPumpState.HMAX_SUSPENDED -> { + MedtrumPumpState.HOURLY_MAX_SUSPENDED -> { result = sendPacketAndGetResponse(ClearPumpAlarmPacket(injector, ALARM_HOURLY_MAX_CLEAR_CODE)) } - MedtrumPumpState.DMAX_SUSPENDED -> { + MedtrumPumpState.DAILY_MAX_SUSPENDED -> { result = sendPacketAndGetResponse(ClearPumpAlarmPacket(injector, ALARM_DAILY_MAX_CLEAR_CODE)) } @@ -285,7 +282,7 @@ class MedtrumService : DaggerService(), BLECommCallback { } fun setUserSettings(): Boolean { - rxBus.send(EventPumpStatusChanged(rh.gs(R.string.settingpumpsettings))) + rxBus.send(EventPumpStatusChanged(rh.gs(R.string.setting_pump_settings))) return sendPacketAndGetResponse(SetPatchPacket(injector)) } @@ -301,16 +298,16 @@ class MedtrumService : DaggerService(), BLECommCallback { medtrumPump.bolusStopped = false medtrumPump.bolusProgressLastTimeStamp = bolusStart - if (insulin > 0 && !medtrumPump.bolusStopped) { + if (insulin > 0) { val result = sendPacketAndGetResponse(SetBolusPacket(injector, insulin)) - if (result == false) { + if (!result) { aapsLogger.error(LTag.PUMPCOMM, "Failed to set bolus") commandQueue.loadEvents(null) // make sure if anything is delivered (which is highly unlikely at this point) we get it t.insulin = 0.0 return false } } else { - aapsLogger.debug(LTag.PUMPCOMM, "Bolus not set, insulin: $insulin, bolusStopped: ${medtrumPump.bolusStopped}") + aapsLogger.debug(LTag.PUMPCOMM, "Bolus not set, insulin: $insulin") t.insulin = 0.0 return false } @@ -384,7 +381,7 @@ class MedtrumService : DaggerService(), BLECommCallback { // Do not call update status directly, reconnection may be needed commandQueue.loadEvents(object : Callback() { override fun run() { - rxBus.send(EventPumpStatusChanged(rh.gs(R.string.gettingbolusstatus))) + rxBus.send(EventPumpStatusChanged(rh.gs(R.string.getting_bolus_status))) bolusingEvent.percent = 100 } }) @@ -395,7 +392,7 @@ class MedtrumService : DaggerService(), BLECommCallback { aapsLogger.debug(LTag.PUMPCOMM, "bolusStop >>>>> @ " + if (medtrumPump.bolusingTreatment == null) "" else medtrumPump.bolusingTreatment?.insulin) if (isConnected) { var success = sendPacketAndGetResponse(CancelBolusPacket(injector)) - var timeout = System.currentTimeMillis() + T.secs(30).msecs() + val timeout = System.currentTimeMillis() + T.secs(30).msecs() while (!success && System.currentTimeMillis() < timeout) { success = sendPacketAndGetResponse(CancelBolusPacket(injector)) SystemClock.sleep(200) @@ -414,11 +411,11 @@ class MedtrumService : DaggerService(), BLECommCallback { } if (result) result = sendPacketAndGetResponse(SetTempBasalPacket(injector, absoluteRate, durationInMinutes)) - // Get history records, this will update the prevoius basals + // Get history records, this will update the previous basals // Do not call update status directly, reconnection may be needed commandQueue.loadEvents(object : Callback() { override fun run() { - rxBus.send(EventPumpStatusChanged(rh.gs(R.string.gettingtempbasalstatus))) + rxBus.send(EventPumpStatusChanged(rh.gs(R.string.getting_temp_basal_status))) } }) @@ -426,13 +423,13 @@ class MedtrumService : DaggerService(), BLECommCallback { } fun cancelTempBasal(): Boolean { - var result = sendPacketAndGetResponse(CancelTempBasalPacket(injector)) + val result = sendPacketAndGetResponse(CancelTempBasalPacket(injector)) - // Get history records, this will update the prevoius basals + // Get history records, this will update the previous basals // Do not call update status directly, reconnection may be needed commandQueue.loadEvents(object : Callback() { override fun run() { - rxBus.send(EventPumpStatusChanged(rh.gs(R.string.gettingtempbasalstatus))) + rxBus.send(EventPumpStatusChanged(rh.gs(R.string.getting_temp_basal_status))) } }) @@ -462,7 +459,7 @@ class MedtrumService : DaggerService(), BLECommCallback { if (medtrumPump.syncedSequenceNumber < medtrumPump.currentSequenceNumber) { for (sequence in (medtrumPump.syncedSequenceNumber + 1)..medtrumPump.currentSequenceNumber) { result = sendPacketAndGetResponse(GetRecordPacket(injector, sequence), COMMAND_SYNC_TIMEOUT_SEC) - if (result == false) break + if (!result) break } } return result @@ -471,23 +468,23 @@ class MedtrumService : DaggerService(), BLECommCallback { private fun handlePumpStateUpdate(state: MedtrumPumpState) { // Map the pump state to an alarm state and add it to the active alarms val alarmState = when (state) { - MedtrumPumpState.NONE -> AlarmState.NONE - MedtrumPumpState.LOWBG_SUSPENDED -> AlarmState.LOWBG_SUSPENDED - MedtrumPumpState.LOWBG_SUSPENDED2 -> AlarmState.LOWBG_SUSPENDED2 - MedtrumPumpState.AUTO_SUSPENDED -> AlarmState.AUTO_SUSPENDED - MedtrumPumpState.HMAX_SUSPENDED -> AlarmState.HMAX_SUSPENDED - MedtrumPumpState.DMAX_SUSPENDED -> AlarmState.DMAX_SUSPENDED - MedtrumPumpState.SUSPENDED -> AlarmState.SUSPENDED - MedtrumPumpState.PAUSED -> AlarmState.PAUSED - MedtrumPumpState.OCCLUSION -> AlarmState.OCCLUSION - MedtrumPumpState.EXPIRED -> AlarmState.EXPIRED - MedtrumPumpState.RESERVOIR_EMPTY -> AlarmState.RESERVOIR_EMPTY - MedtrumPumpState.PATCH_FAULT -> AlarmState.PATCH_FAULT - MedtrumPumpState.PATCH_FAULT2 -> AlarmState.PATCH_FAULT2 - MedtrumPumpState.BASE_FAULT -> AlarmState.BASE_FAULT - MedtrumPumpState.BATTERY_OUT -> AlarmState.BATTERY_OUT - MedtrumPumpState.NO_CALIBRATION -> AlarmState.NO_CALIBRATION - else -> null + MedtrumPumpState.NONE -> AlarmState.NONE + MedtrumPumpState.LOW_BG_SUSPENDED -> AlarmState.LOW_BG_SUSPENDED + MedtrumPumpState.LOW_BG_SUSPENDED2 -> AlarmState.LOW_BG_SUSPENDED2 + MedtrumPumpState.AUTO_SUSPENDED -> AlarmState.AUTO_SUSPENDED + MedtrumPumpState.HOURLY_MAX_SUSPENDED -> AlarmState.HOURLY_MAX_SUSPENDED + MedtrumPumpState.DAILY_MAX_SUSPENDED -> AlarmState.DAILY_MAX_SUSPENDED + MedtrumPumpState.SUSPENDED -> AlarmState.SUSPENDED + MedtrumPumpState.PAUSED -> AlarmState.PAUSED + MedtrumPumpState.OCCLUSION -> AlarmState.OCCLUSION + MedtrumPumpState.EXPIRED -> AlarmState.EXPIRED + MedtrumPumpState.RESERVOIR_EMPTY -> AlarmState.RESERVOIR_EMPTY + MedtrumPumpState.PATCH_FAULT -> AlarmState.PATCH_FAULT + MedtrumPumpState.PATCH_FAULT2 -> AlarmState.PATCH_FAULT2 + MedtrumPumpState.BASE_FAULT -> AlarmState.BASE_FAULT + MedtrumPumpState.BATTERY_OUT -> AlarmState.BATTERY_OUT + MedtrumPumpState.NO_CALIBRATION -> AlarmState.NO_CALIBRATION + else -> null } if (alarmState != null && alarmState != AlarmState.NONE) { medtrumPump.addAlarm(alarmState) @@ -533,8 +530,8 @@ class MedtrumService : DaggerService(), BLECommCallback { medtrumPump.clearAlarmState() } - MedtrumPumpState.LOWBG_SUSPENDED, - MedtrumPumpState.LOWBG_SUSPENDED2, + MedtrumPumpState.LOW_BG_SUSPENDED, + MedtrumPumpState.LOW_BG_SUSPENDED2, MedtrumPumpState.AUTO_SUSPENDED, MedtrumPumpState.SUSPENDED, MedtrumPumpState.PAUSED -> { @@ -546,7 +543,7 @@ class MedtrumService : DaggerService(), BLECommCallback { // Pump will report proper TBR for this } - MedtrumPumpState.HMAX_SUSPENDED -> { + MedtrumPumpState.HOURLY_MAX_SUSPENDED -> { uiInteraction.addNotification( Notification.PUMP_SUSPENDED, rh.gs(R.string.pump_is_suspended_hour_max), @@ -555,7 +552,7 @@ class MedtrumService : DaggerService(), BLECommCallback { // Pump will report proper TBR for this } - MedtrumPumpState.DMAX_SUSPENDED -> { + MedtrumPumpState.DAILY_MAX_SUSPENDED -> { uiInteraction.addNotification( Notification.PUMP_SUSPENDED, rh.gs(R.string.pump_is_suspended_day_max), @@ -721,8 +718,6 @@ class MedtrumService : DaggerService(), BLECommCallback { // State for connect flow private inner class AuthState : State() { - val retryCounter = 0 - override fun onEnter() { aapsLogger.debug(LTag.PUMPCOMM, "Medtrum Service reached AuthState") mPacket = AuthorizePacket(injector) @@ -734,7 +729,7 @@ class MedtrumService : DaggerService(), BLECommCallback { override fun onIndication(data: ByteArray) { if (mPacket?.handleResponse(data) == true) { - // Succes! + // Success! responseHandled = true responseSuccess = true // Check if we have a supported pump @@ -776,7 +771,7 @@ class MedtrumService : DaggerService(), BLECommCallback { override fun onIndication(data: ByteArray) { if (mPacket?.handleResponse(data) == true) { - // Succes! + // Success! responseHandled = true responseSuccess = true // Place holder, not really used (yet) @@ -808,7 +803,7 @@ class MedtrumService : DaggerService(), BLECommCallback { override fun onIndication(data: ByteArray) { if (mPacket?.handleResponse(data) == true) { - // Succes! + // Success! responseHandled = true responseSuccess = true val currTime = dateUtil.now() @@ -843,7 +838,7 @@ class MedtrumService : DaggerService(), BLECommCallback { override fun onIndication(data: ByteArray) { if (mPacket?.handleResponse(data) == true) { - // Succes! + // Success! responseHandled = true responseSuccess = true toState(SetTimeZoneState()) @@ -871,7 +866,7 @@ class MedtrumService : DaggerService(), BLECommCallback { override fun onIndication(data: ByteArray) { if (mPacket?.handleResponse(data) == true) { - // Succes! + // Success! responseHandled = true responseSuccess = true medtrumPump.needCheckTimeUpdate = false @@ -901,7 +896,7 @@ class MedtrumService : DaggerService(), BLECommCallback { override fun onIndication(data: ByteArray) { if (mPacket?.handleResponse(data) == true) { - // Succes! + // Success! responseHandled = true responseSuccess = true toState(SubscribeState()) @@ -929,7 +924,7 @@ class MedtrumService : DaggerService(), BLECommCallback { override fun onIndication(data: ByteArray) { if (mPacket?.handleResponse(data) == true) { - // Succes! + // Success! responseHandled = true responseSuccess = true toState(ReadyState()) @@ -949,7 +944,7 @@ class MedtrumService : DaggerService(), BLECommCallback { override fun onEnter() { aapsLogger.debug(LTag.PUMPCOMM, "Medtrum Service reached ReadyState!") // Now we are fully connected and authenticated and we can start sending commands. Let AAPS know - if (isConnected == false) { + if (!isConnected) { medtrumPump.connectionState = ConnectionState.CONNECTED } } @@ -964,7 +959,7 @@ class MedtrumService : DaggerService(), BLECommCallback { override fun onIndication(data: ByteArray) { if (mPacket?.handleResponse(data) == true) { - // Succes! + // Success! responseHandled = true responseSuccess = true toState(ReadyState()) diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchFragment.kt index 5e23d96632..425f7fac3f 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchFragment.kt @@ -5,7 +5,6 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import info.nightscout.pump.medtrum.R import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPreparePatchBinding -import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeCompleteFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeCompleteFragment.kt index 75b2bad284..f7e3c402d2 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeCompleteFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeCompleteFragment.kt @@ -8,7 +8,6 @@ import info.nightscout.core.ui.toast.ToastUtils import info.nightscout.pump.medtrum.R import info.nightscout.pump.medtrum.code.PatchStep import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPrimeCompleteBinding -import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeFragment.kt index 3322c8a54f..80020abe46 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeFragment.kt @@ -8,7 +8,6 @@ import info.nightscout.core.ui.toast.ToastUtils import info.nightscout.pump.medtrum.R import info.nightscout.pump.medtrum.code.PatchStep import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPrimeBinding -import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimingFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimingFragment.kt index fe1234a5c3..eeee99aa71 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimingFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimingFragment.kt @@ -8,7 +8,6 @@ import info.nightscout.core.ui.toast.ToastUtils import info.nightscout.pump.medtrum.R import info.nightscout.pump.medtrum.code.PatchStep import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPrimingBinding -import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumRetryActivationConnectFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumRetryActivationConnectFragment.kt index 466be92e7b..47de209db4 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumRetryActivationConnectFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumRetryActivationConnectFragment.kt @@ -7,7 +7,6 @@ import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.pump.medtrum.R import info.nightscout.pump.medtrum.code.PatchStep import info.nightscout.pump.medtrum.databinding.FragmentMedtrumRetryActivationConnectBinding -import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumRetryActivationFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumRetryActivationFragment.kt index 5e1673685b..829f80d217 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumRetryActivationFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumRetryActivationFragment.kt @@ -7,7 +7,6 @@ import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.pump.medtrum.R import info.nightscout.pump.medtrum.code.PatchStep import info.nightscout.pump.medtrum.databinding.FragmentMedtrumRetryActivationBinding -import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag @@ -32,7 +31,7 @@ class MedtrumRetryActivationFragment : MedtrumBaseFragment : ViewModel() { private var _navigator: WeakReference? = null - var navigator: N? + private var navigator: N? set(value) { _navigator = WeakReference(value) } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumOverviewViewModel.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumOverviewViewModel.kt index da742ea91d..1cd1de8a95 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumOverviewViewModel.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumOverviewViewModel.kt @@ -114,7 +114,7 @@ class MedtrumOverviewViewModel @Inject constructor( aapsLogger.debug(LTag.PUMP, "MedtrumViewModel pumpStateFlow: $state") _canDoResetAlarms.postValue( medtrumPump.pumpState in listOf( - MedtrumPumpState.PAUSED, MedtrumPumpState.HMAX_SUSPENDED, MedtrumPumpState.DMAX_SUSPENDED + MedtrumPumpState.PAUSED, MedtrumPumpState.HOURLY_MAX_SUSPENDED, MedtrumPumpState.DAILY_MAX_SUSPENDED ) ) @@ -153,7 +153,7 @@ class MedtrumOverviewViewModel @Inject constructor( } } - fun updateGUI() { + private fun updateGUI() { // Update less dynamic values if (medtrumPump.lastConnection != 0L) { val agoMilliseconds = System.currentTimeMillis() - medtrumPump.lastConnection diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumViewModel.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumViewModel.kt index 688770f884..f12f49e6aa 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumViewModel.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumViewModel.kt @@ -10,13 +10,10 @@ import info.nightscout.pump.medtrum.MedtrumPump import info.nightscout.pump.medtrum.R import info.nightscout.pump.medtrum.code.ConnectionState import info.nightscout.pump.medtrum.services.MedtrumService -import info.nightscout.pump.medtrum.code.EventType import info.nightscout.pump.medtrum.code.PatchStep import info.nightscout.pump.medtrum.comm.enums.MedtrumPumpState import info.nightscout.pump.medtrum.encryption.Crypt import info.nightscout.pump.medtrum.ui.MedtrumBaseNavigator -import info.nightscout.pump.medtrum.ui.event.SingleLiveEvent -import info.nightscout.pump.medtrum.ui.event.UIEvent import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag import kotlinx.coroutines.CoroutineScope @@ -43,10 +40,6 @@ class MedtrumViewModel @Inject constructor( val title: LiveData get() = _title - private val _eventHandler = SingleLiveEvent>() - val eventHandler: LiveData> - get() = _eventHandler - private var oldPatchStep: PatchStep? = null private var mInitPatchStep: PatchStep? = null private var connectRetryCounter = 0 @@ -155,7 +148,7 @@ class MedtrumViewModel @Inject constructor( PatchStep.RETRY_ACTIVATION_CONNECT, PatchStep.PREPARE_PATCH_CONNECT -> { - // Make sure we are disconnected, else dont move step + // Make sure we are disconnected, else don't move step if (medtrumService?.isConnected == true) { aapsLogger.info(LTag.PUMP, "moveStep: connected, not moving step") return @@ -167,7 +160,7 @@ class MedtrumViewModel @Inject constructor( PatchStep.PRIME_COMPLETE, PatchStep.ATTACH_PATCH, PatchStep.ACTIVATE -> { - // Make sure we are connected, else dont move step + // Make sure we are connected, else don't move step if (medtrumService?.isConnected == false) { aapsLogger.info(LTag.PUMP, "moveStep: not connected, not moving step") return @@ -321,7 +314,7 @@ class MedtrumViewModel @Inject constructor( aapsLogger.info(LTag.PUMP, "prepareStep: title before cond: $stringResId") if (currentTitle != stringResId) { aapsLogger.info(LTag.PUMP, "prepareStep: title: $stringResId") - _title.postValue(stringResId) + stringResId?.let { _title.postValue(it) } } patchStep.postValue(newStep) diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/util/MedtrumTimeUtil.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/util/MedtrumTimeUtil.kt index ad3910f0ec..fd6dc2ddd6 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/util/MedtrumTimeUtil.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/util/MedtrumTimeUtil.kt @@ -5,19 +5,13 @@ import java.time.Instant class MedtrumTimeUtil { - fun getCurrentTimePumpSeconds() : Long { + fun getCurrentTimePumpSeconds(): Long { val startInstant = Instant.parse("2014-01-01T00:00:00Z") val currentInstant = Instant.now() return Duration.between(startInstant, currentInstant).seconds } - fun getCurrentTimePumpMillis() : Long { - val startInstant = Instant.parse("2014-01-01T00:00:00Z") - val currentInstant = Instant.now() - return Duration.between(startInstant, currentInstant).seconds * 1000 - } - - fun convertPumpTimeToSystemTimeMillis(pumpTime: Long) : Long { + fun convertPumpTimeToSystemTimeMillis(pumpTime: Long): Long { val startInstant = Instant.parse("2014-01-01T00:00:00Z") val pumpInstant = startInstant.plusSeconds(pumpTime) val epochInstant = Instant.EPOCH diff --git a/pump/medtrum/src/main/res/layout/activity_medtrum.xml b/pump/medtrum/src/main/res/layout/activity_medtrum.xml index 2c1d16aad2..50b4d5451b 100644 --- a/pump/medtrum/src/main/res/layout/activity_medtrum.xml +++ b/pump/medtrum/src/main/res/layout/activity_medtrum.xml @@ -34,8 +34,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:text="@string/string_change_patch" /> + app:layout_constraintTop_toTopOf="parent" /> diff --git a/pump/medtrum/src/main/res/layout/fragment_medtrum_deactivation_complete.xml b/pump/medtrum/src/main/res/layout/fragment_medtrum_deactivation_complete.xml index cc564f230f..1fb333cb19 100644 --- a/pump/medtrum/src/main/res/layout/fragment_medtrum_deactivation_complete.xml +++ b/pump/medtrum/src/main/res/layout/fragment_medtrum_deactivation_complete.xml @@ -26,19 +26,33 @@ tools:context=".ui.MedtrumActivity"> + + + xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/pump/medtrum/src/main/res/values/strings.xml b/pump/medtrum/src/main/res/values/strings.xml index 575782c9eb..361b32dbdd 100644 --- a/pump/medtrum/src/main/res/values/strings.xml +++ b/pump/medtrum/src/main/res/values/strings.xml @@ -6,8 +6,8 @@ patch_expiration hourly_max_insulin daily_max_insulin - - medtrumpump_settings + + medtrum_pump_setting pump_state active_alarms last_connection @@ -26,7 +26,7 @@ Medtrum MT Pump integration for Medtrum Nano - Medtrum pump settings + Medtrum pump settings Pump error: %1$s !! Pump untested: %1$d! Please contact us at discord or github for support Pump is suspended @@ -34,14 +34,14 @@ Pump is suspended due to daily max insulin exceeded Patch not activated Setting user settings to pump failed! - + BLE Status Last connected Pump state Active alarms %.2f U - %.2f V + %.2f V Basal type Basal rate %.2f U/h @@ -60,11 +60,11 @@ Pump low battery Pump low reservoir Pump expires soon - Low BG suspended - Low BG suspended 2 + Low BG suspended + Low BG suspended 2 Auto suspended - hourly max suspended - daily max suspended + hourly max suspended + daily max suspended Suspended Paused Occlusion @@ -101,16 +101,15 @@ No active patch. Press Next to begin the activation process. Pump base should not be connected to the patch until the next step! Connect pump base to a new patch, remove the residual air and fill with insulin, then press Next. - Note: A minimum of 70 units is required for actvation. + Note: A minimum of 70 units is required for activation. Do not attach the patch to the body yet. Half-press needle button. Then tap Next to start prime. Please wait for the priming to complete. Failed to prime, press Retry to try again. Press Next to continue. Press Next to start activation. - Remove the safety lock. Attach the pump to the body. Press the needle button. Remove the safety lock. Attach the pump to the body. Press the needle button. - Activating pump and settng initial basal rate. Please Wait. + Activating pump and setting initial basal rate. Please Wait. Failed to activate, press Retry to try again. New patch activated. %.2f Units remaining. Press OK to return to main screen. @@ -142,10 +141,9 @@ Specify the maximum units of insulin allowed per day. If exceeded, the pump will suspend. - Waiting for bolus end. Remaining %1$d sec. - Getting pump status - Getting bolus status - Getting temporary basal status - Setting user options + Getting pump status + Getting bolus status + Getting temporary basal status + Setting user options diff --git a/pump/medtrum/src/main/res/xml/pref_medtrum_pump.xml b/pump/medtrum/src/main/res/xml/pref_medtrum_pump.xml index 7d58491568..64081101e5 100644 --- a/pump/medtrum/src/main/res/xml/pref_medtrum_pump.xml +++ b/pump/medtrum/src/main/res/xml/pref_medtrum_pump.xml @@ -3,8 +3,8 @@ xmlns:validate="http://schemas.android.com/apk/res-auto"> Date: Mon, 14 Aug 2023 21:12:23 +0200 Subject: [PATCH 10/12] Medtrum: handle on back pressed properly --- .../pump/medtrum/ui/MedtrumActivity.kt | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt index 683da88042..dbf48c36aa 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt @@ -6,6 +6,7 @@ import android.content.pm.ActivityInfo import android.os.Bundle import android.view.MotionEvent import android.view.WindowManager +import androidx.activity.OnBackPressedCallback import androidx.lifecycle.ViewModelProvider import info.nightscout.core.utils.extensions.safeGetSerializableExtra import info.nightscout.pump.medtrum.R @@ -19,10 +20,6 @@ class MedtrumActivity : MedtrumBaseActivity() { override fun getLayoutId(): Int = R.layout.activity_medtrum - override fun dispatchTouchEvent(event: MotionEvent): Boolean { - return super.dispatchTouchEvent(event) - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LOCKED @@ -70,6 +67,28 @@ class MedtrumActivity : MedtrumBaseActivity() { } } } + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + binding.viewModel?.apply { + when (patchStep.value) { + PatchStep.PREPARE_PATCH, + PatchStep.START_DEACTIVATION, + PatchStep.RETRY_ACTIVATION -> { + handleCancel() + this@MedtrumActivity.finish() + } + + PatchStep.COMPLETE, + PatchStep.DEACTIVATION_COMPLETE -> { + handleComplete() + this@MedtrumActivity.finish() + } + + else -> Unit + } + } + } + }) } override fun onNewIntent(intent: Intent?) { @@ -105,5 +124,4 @@ class MedtrumActivity : MedtrumBaseActivity() { private fun setupViewFragment(baseFragment: MedtrumBaseFragment<*>) { replaceFragmentInActivity(baseFragment, R.id.framelayout_fragment, false) } - } From 7662f3cc45db3e5bac0e50d1674882c2d128963c Mon Sep 17 00:00:00 2001 From: jbr7rr <> Date: Tue, 15 Aug 2023 08:42:20 +0200 Subject: [PATCH 11/12] Medtrum: Fix unit tests, more lints --- .../info/nightscout/pump/medtrum/MedtrumPlugin.kt | 12 ++++++------ .../info/nightscout/pump/medtrum/MedtrumTestBase.kt | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt index 1b035cc580..e9eb94d844 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt @@ -293,12 +293,12 @@ import kotlin.math.abs val pumpRate = constraintChecker.applyBasalConstraints(Constraint(absoluteRate), profile).value() temporaryBasalStorage.add(PumpSync.PumpState.TemporaryBasal(dateUtil.now(), T.mins(durationInMinutes.toLong()).msecs(), pumpRate, true, tbrType, 0L, 0L)) val connectionOK = medtrumService?.setTempBasal(pumpRate, durationInMinutes) ?: false - if (connectionOK + return if (connectionOK && medtrumPump.tempBasalInProgress && abs(medtrumPump.tempBasalAbsoluteRate - pumpRate) <= 0.05 ) { - return PumpEnactResult(injector).success(true).enacted(true).duration(durationInMinutes).absolute(medtrumPump.tempBasalAbsoluteRate) + PumpEnactResult(injector).success(true).enacted(true).duration(durationInMinutes).absolute(medtrumPump.tempBasalAbsoluteRate) .isPercent(false) .isTempCancel(false) } else { @@ -306,7 +306,7 @@ import kotlin.math.abs LTag.PUMP, "setTempBasalAbsolute failed, connectionOK: $connectionOK, tempBasalInProgress: ${medtrumPump.tempBasalInProgress}, tempBasalAbsoluteRate: ${medtrumPump.tempBasalAbsoluteRate}" ) - return PumpEnactResult(injector).success(false).enacted(false).comment("Medtrum setTempBasalAbsolute failed") + PumpEnactResult(injector).success(false).enacted(false).comment("Medtrum setTempBasalAbsolute failed") } } @@ -325,11 +325,11 @@ import kotlin.math.abs aapsLogger.info(LTag.PUMP, "cancelTempBasal - enforceNew: $enforceNew") val connectionOK = medtrumService?.cancelTempBasal() ?: false - if (connectionOK && !medtrumPump.tempBasalInProgress) { - return PumpEnactResult(injector).success(true).enacted(true).isTempCancel(true) + return if (connectionOK && !medtrumPump.tempBasalInProgress) { + PumpEnactResult(injector).success(true).enacted(true).isTempCancel(true) } else { aapsLogger.error(LTag.PUMP, "cancelTempBasal failed, connectionOK: $connectionOK, tempBasalInProgress: ${medtrumPump.tempBasalInProgress}") - return PumpEnactResult(injector).success(false).enacted(false).comment("Medtrum cancelTempBasal failed") + PumpEnactResult(injector).success(false).enacted(false).comment("Medtrum cancelTempBasal failed") } } diff --git a/pump/medtrum/src/test/java/info/nightscout/pump/medtrum/MedtrumTestBase.kt b/pump/medtrum/src/test/java/info/nightscout/pump/medtrum/MedtrumTestBase.kt index e800fdb118..77e45b6834 100644 --- a/pump/medtrum/src/test/java/info/nightscout/pump/medtrum/MedtrumTestBase.kt +++ b/pump/medtrum/src/test/java/info/nightscout/pump/medtrum/MedtrumTestBase.kt @@ -7,6 +7,7 @@ import info.nightscout.interfaces.pump.TemporaryBasalStorage import info.nightscout.interfaces.stats.TddCalculator import org.junit.jupiter.api.BeforeEach import org.mockito.Mock +import org.mockito.Mockito open class MedtrumTestBase : TestBaseWithProfile() { @@ -19,6 +20,7 @@ open class MedtrumTestBase : TestBaseWithProfile() { @BeforeEach fun setup() { + Mockito.`when`(sp.getString(R.string.key_active_alarms, "")).thenReturn("") medtrumPump = MedtrumPump(aapsLogger, rh, sp, dateUtil, pumpSync, temporaryBasalStorage) } } From c368859df9af2c66a154a522917aa1d36eeebe73 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 15 Aug 2023 11:23:44 +0200 Subject: [PATCH 12/12] New Crowdin updates (#2633) * New translations strings.xml (Russian) * New translations strings.xml (Russian) * New translations strings.xml (Russian) * New translations strings.xml (Russian) * New translations strings.xml (Russian) * New translations strings.xml (French) * New translations strings.xml (Norwegian) * New translations strings.xml (Norwegian) * New translations strings.xml (Hebrew) * Update source file strings.xml * Update source file strings.xml * New translations strings.xml (Spanish) * New translations strings.xml (Spanish) * New translations strings.xml (French) * New translations strings.xml (Czech) * New translations strings.xml (Czech) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (French) * New translations strings.xml (French) * New translations strings.xml (Romanian) * New translations strings.xml (French) * New translations strings.xml (Spanish) * New translations strings.xml (Afrikaans) * New translations strings.xml (Bulgarian) * New translations strings.xml (Catalan) * New translations strings.xml (Czech) * New translations strings.xml (Danish) * New translations strings.xml (German) * New translations strings.xml (Greek) * New translations strings.xml (Irish) * New translations strings.xml (Hebrew) * New translations strings.xml (Hungarian) * New translations strings.xml (Italian) * New translations strings.xml (Japanese) * New translations strings.xml (Korean) * New translations strings.xml (Lithuanian) * New translations strings.xml (Dutch) * New translations strings.xml (Norwegian) * New translations strings.xml (Polish) * New translations strings.xml (Portuguese) * New translations strings.xml (Russian) * New translations strings.xml (Slovak) * New translations strings.xml (Swedish) * New translations strings.xml (Turkish) * New translations strings.xml (Chinese Simplified) * New translations strings.xml (Portuguese, Brazilian) * New translations strings.xml (Croatian) * New translations strings.xml (Serbian (Latin)) * New translations arrays.xml (Romanian) * New translations arrays.xml (French) * New translations arrays.xml (Spanish) * New translations arrays.xml (Afrikaans) * New translations arrays.xml (Bulgarian) * New translations arrays.xml (Catalan) * New translations arrays.xml (Czech) * New translations arrays.xml (Danish) * New translations arrays.xml (German) * New translations arrays.xml (Greek) * New translations arrays.xml (Irish) * New translations arrays.xml (Hebrew) * New translations arrays.xml (Hungarian) * New translations arrays.xml (Italian) * New translations arrays.xml (Japanese) * New translations arrays.xml (Korean) * New translations arrays.xml (Lithuanian) * New translations arrays.xml (Dutch) * New translations arrays.xml (Norwegian) * New translations arrays.xml (Polish) * New translations arrays.xml (Portuguese) * New translations arrays.xml (Russian) * New translations arrays.xml (Slovak) * New translations arrays.xml (Swedish) * New translations arrays.xml (Turkish) * New translations arrays.xml (Chinese Simplified) * New translations arrays.xml (Portuguese, Brazilian) * New translations arrays.xml (Croatian) * New translations arrays.xml (Serbian (Latin)) * Update source file strings.xml * Update source file strings.xml * Update source file arrays.xml * Update source file strings.xml * New translations strings.xml (Spanish) * New translations strings.xml (Spanish) * New translations strings.xml (Spanish) * New translations arrays.xml (Spanish) * New translations strings.xml (French) * New translations strings.xml (Czech) * New translations arrays.xml (French) * New translations arrays.xml (Czech) * New translations strings.xml (French) * New translations strings.xml (French) * New translations strings.xml (French) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations arrays.xml (Italian) * New translations arrays.xml (French) * New translations arrays.xml (Spanish) * New translations arrays.xml (Czech) * New translations arrays.xml (Italian) * Update source file arrays.xml * New translations strings.xml (Spanish) * New translations arrays.xml (Spanish) * Update source file strings.xml * New translations strings.xml (Czech) * New translations strings.xml (Czech) * New translations strings.xml (Czech) * New translations arrays.xml (Czech) * New translations strings.xml (Czech) * New translations strings.xml (Spanish) * Update source file strings.xml * Update source file strings.xml * Update source file strings.xml * Update source file strings.xml * Update source file strings.xml * New translations strings.xml (Czech) * New translations strings.xml (Czech) * New translations strings.xml (Romanian) * New translations strings.xml (French) * New translations strings.xml (Spanish) * New translations strings.xml (Afrikaans) * New translations strings.xml (Bulgarian) * New translations strings.xml (Catalan) * New translations strings.xml (Czech) * New translations strings.xml (Danish) * New translations strings.xml (German) * New translations strings.xml (Greek) * New translations strings.xml (Irish) * New translations strings.xml (Hebrew) * New translations strings.xml (Hungarian) * New translations strings.xml (Italian) * New translations strings.xml (Japanese) --- .../src/main/res/values-af-rZA/strings.xml | 1 + .../src/main/res/values-bg-rBG/strings.xml | 1 + .../src/main/res/values-ca-rES/strings.xml | 1 + .../src/main/res/values-cs-rCZ/strings.xml | 7 ++ .../src/main/res/values-da-rDK/strings.xml | 1 + .../src/main/res/values-de-rDE/strings.xml | 1 + .../src/main/res/values-el-rGR/strings.xml | 1 + .../src/main/res/values-es-rES/strings.xml | 1 + .../src/main/res/values-fr-rFR/strings.xml | 1 + .../src/main/res/values-ga-rIE/strings.xml | 1 + .../src/main/res/values-hu-rHU/strings.xml | 1 + .../src/main/res/values-it-rIT/strings.xml | 1 + .../src/main/res/values-iw-rIL/strings.xml | 1 + .../src/main/res/values-ja-rJP/strings.xml | 1 + .../src/main/res/values-ro-rRO/strings.xml | 1 + .../ui/src/main/res/values-cs-rCZ/strings.xml | 4 + .../ui/src/main/res/values-es-rES/strings.xml | 4 + .../ui/src/main/res/values-fr-rFR/strings.xml | 6 +- .../ui/src/main/res/values-it-rIT/strings.xml | 2 + .../ui/src/main/res/values-ru-rRU/strings.xml | 4 +- .../src/main/res/values-fr-rFR/strings.xml | 4 +- .../src/main/res/values-it-rIT/strings.xml | 1 + .../src/main/res/values-no-rNO/strings.xml | 2 + .../src/main/res/values-ru-rRU/strings.xml | 2 + .../src/main/res/values-cs-rCZ/strings.xml | 6 + .../src/main/res/values-es-rES/strings.xml | 1 + .../src/main/res/values-fr-rFR/strings.xml | 1 + .../src/main/res/values-it-rIT/strings.xml | 1 + .../src/main/res/values-cs-rCZ/strings.xml | 3 + .../src/main/res/values-es-rES/strings.xml | 3 + .../src/main/res/values-it-rIT/strings.xml | 1 + .../src/main/res/values-iw-rIL/strings.xml | 1 + .../src/main/res/values-no-rNO/strings.xml | 1 + .../src/main/res/values-ru-rRU/strings.xml | 1 + .../src/main/res/values-af-rZA/arrays.xml | 2 + .../src/main/res/values-af-rZA/strings.xml | 9 ++ .../src/main/res/values-bg-rBG/arrays.xml | 2 + .../src/main/res/values-bg-rBG/strings.xml | 9 ++ .../src/main/res/values-ca-rES/arrays.xml | 2 + .../src/main/res/values-ca-rES/strings.xml | 9 ++ .../src/main/res/values-cs-rCZ/arrays.xml | 13 ++ .../src/main/res/values-cs-rCZ/strings.xml | 119 ++++++++++++++++++ .../src/main/res/values-da-rDK/arrays.xml | 2 + .../src/main/res/values-da-rDK/strings.xml | 9 ++ .../src/main/res/values-de-rDE/arrays.xml | 2 + .../src/main/res/values-de-rDE/strings.xml | 9 ++ .../src/main/res/values-el-rGR/arrays.xml | 2 + .../src/main/res/values-el-rGR/strings.xml | 9 ++ .../src/main/res/values-es-rES/arrays.xml | 13 ++ .../src/main/res/values-es-rES/strings.xml | 119 ++++++++++++++++++ .../src/main/res/values-fr-rFR/arrays.xml | 2 + .../src/main/res/values-fr-rFR/strings.xml | 119 ++++++++++++++++++ .../src/main/res/values-ga-rIE/arrays.xml | 2 + .../src/main/res/values-ga-rIE/strings.xml | 9 ++ .../src/main/res/values-hr-rHR/arrays.xml | 2 + .../src/main/res/values-hr-rHR/strings.xml | 9 ++ .../src/main/res/values-hu-rHU/arrays.xml | 2 + .../src/main/res/values-hu-rHU/strings.xml | 9 ++ .../src/main/res/values-it-rIT/arrays.xml | 2 + .../src/main/res/values-it-rIT/strings.xml | 32 +++++ .../src/main/res/values-iw-rIL/arrays.xml | 2 + .../src/main/res/values-iw-rIL/strings.xml | 9 ++ .../src/main/res/values-ja-rJP/arrays.xml | 2 + .../src/main/res/values-ja-rJP/strings.xml | 9 ++ .../src/main/res/values-ko-rKR/arrays.xml | 2 + .../src/main/res/values-ko-rKR/strings.xml | 9 ++ .../src/main/res/values-lt-rLT/arrays.xml | 2 + .../src/main/res/values-lt-rLT/strings.xml | 9 ++ .../src/main/res/values-nl-rNL/arrays.xml | 2 + .../src/main/res/values-nl-rNL/strings.xml | 9 ++ .../src/main/res/values-no-rNO/arrays.xml | 2 + .../src/main/res/values-no-rNO/strings.xml | 9 ++ .../src/main/res/values-pl-rPL/arrays.xml | 2 + .../src/main/res/values-pl-rPL/strings.xml | 9 ++ .../src/main/res/values-pt-rBR/arrays.xml | 2 + .../src/main/res/values-pt-rBR/strings.xml | 9 ++ .../src/main/res/values-pt-rPT/arrays.xml | 2 + .../src/main/res/values-pt-rPT/strings.xml | 9 ++ .../src/main/res/values-ro-rRO/arrays.xml | 2 + .../src/main/res/values-ro-rRO/strings.xml | 9 ++ .../src/main/res/values-ru-rRU/arrays.xml | 2 + .../src/main/res/values-ru-rRU/strings.xml | 9 ++ .../src/main/res/values-sk-rSK/arrays.xml | 2 + .../src/main/res/values-sk-rSK/strings.xml | 9 ++ .../src/main/res/values-sr-rCS/arrays.xml | 2 + .../src/main/res/values-sr-rCS/strings.xml | 9 ++ .../src/main/res/values-sv-rSE/arrays.xml | 2 + .../src/main/res/values-sv-rSE/strings.xml | 9 ++ .../src/main/res/values-tr-rTR/arrays.xml | 2 + .../src/main/res/values-tr-rTR/strings.xml | 9 ++ .../src/main/res/values-zh-rCN/arrays.xml | 2 + .../src/main/res/values-zh-rCN/strings.xml | 9 ++ wear/src/main/res/values-cs-rCZ/strings.xml | 2 + wear/src/main/res/values-es-rES/strings.xml | 2 +- wear/src/main/res/values-ru-rRU/strings.xml | 2 +- 95 files changed, 762 insertions(+), 7 deletions(-) create mode 100644 pump/medtrum/src/main/res/values-af-rZA/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-af-rZA/strings.xml create mode 100644 pump/medtrum/src/main/res/values-bg-rBG/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-bg-rBG/strings.xml create mode 100644 pump/medtrum/src/main/res/values-ca-rES/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-ca-rES/strings.xml create mode 100644 pump/medtrum/src/main/res/values-cs-rCZ/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-cs-rCZ/strings.xml create mode 100644 pump/medtrum/src/main/res/values-da-rDK/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-da-rDK/strings.xml create mode 100644 pump/medtrum/src/main/res/values-de-rDE/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-de-rDE/strings.xml create mode 100644 pump/medtrum/src/main/res/values-el-rGR/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-el-rGR/strings.xml create mode 100644 pump/medtrum/src/main/res/values-es-rES/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-es-rES/strings.xml create mode 100644 pump/medtrum/src/main/res/values-fr-rFR/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-fr-rFR/strings.xml create mode 100644 pump/medtrum/src/main/res/values-ga-rIE/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-ga-rIE/strings.xml create mode 100644 pump/medtrum/src/main/res/values-hr-rHR/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-hr-rHR/strings.xml create mode 100644 pump/medtrum/src/main/res/values-hu-rHU/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-hu-rHU/strings.xml create mode 100644 pump/medtrum/src/main/res/values-it-rIT/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-it-rIT/strings.xml create mode 100644 pump/medtrum/src/main/res/values-iw-rIL/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-iw-rIL/strings.xml create mode 100644 pump/medtrum/src/main/res/values-ja-rJP/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-ja-rJP/strings.xml create mode 100644 pump/medtrum/src/main/res/values-ko-rKR/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-ko-rKR/strings.xml create mode 100644 pump/medtrum/src/main/res/values-lt-rLT/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-lt-rLT/strings.xml create mode 100644 pump/medtrum/src/main/res/values-nl-rNL/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-nl-rNL/strings.xml create mode 100644 pump/medtrum/src/main/res/values-no-rNO/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-no-rNO/strings.xml create mode 100644 pump/medtrum/src/main/res/values-pl-rPL/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-pl-rPL/strings.xml create mode 100644 pump/medtrum/src/main/res/values-pt-rBR/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-pt-rBR/strings.xml create mode 100644 pump/medtrum/src/main/res/values-pt-rPT/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-pt-rPT/strings.xml create mode 100644 pump/medtrum/src/main/res/values-ro-rRO/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-ro-rRO/strings.xml create mode 100644 pump/medtrum/src/main/res/values-ru-rRU/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-ru-rRU/strings.xml create mode 100644 pump/medtrum/src/main/res/values-sk-rSK/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-sk-rSK/strings.xml create mode 100644 pump/medtrum/src/main/res/values-sr-rCS/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-sr-rCS/strings.xml create mode 100644 pump/medtrum/src/main/res/values-sv-rSE/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-sv-rSE/strings.xml create mode 100644 pump/medtrum/src/main/res/values-tr-rTR/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-tr-rTR/strings.xml create mode 100644 pump/medtrum/src/main/res/values-zh-rCN/arrays.xml create mode 100644 pump/medtrum/src/main/res/values-zh-rCN/strings.xml diff --git a/app-wear-shared/shared/src/main/res/values-af-rZA/strings.xml b/app-wear-shared/shared/src/main/res/values-af-rZA/strings.xml index 12e3c4bf90..6f9ad74f9e 100644 --- a/app-wear-shared/shared/src/main/res/values-af-rZA/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-af-rZA/strings.xml @@ -21,4 +21,5 @@ Handskudding Gekoppel Ontkoppel + diff --git a/app-wear-shared/shared/src/main/res/values-bg-rBG/strings.xml b/app-wear-shared/shared/src/main/res/values-bg-rBG/strings.xml index 803b3124e9..413b2b31d4 100644 --- a/app-wear-shared/shared/src/main/res/values-bg-rBG/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-bg-rBG/strings.xml @@ -33,4 +33,5 @@ Свързана Разкачане Изчакване за разкачане + diff --git a/app-wear-shared/shared/src/main/res/values-ca-rES/strings.xml b/app-wear-shared/shared/src/main/res/values-ca-rES/strings.xml index 7dd443a35b..e2a9ff86bd 100644 --- a/app-wear-shared/shared/src/main/res/values-ca-rES/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-ca-rES/strings.xml @@ -24,4 +24,5 @@ Connectat Desconnectant S\'està esperant la desconnexió + diff --git a/app-wear-shared/shared/src/main/res/values-cs-rCZ/strings.xml b/app-wear-shared/shared/src/main/res/values-cs-rCZ/strings.xml index a4439c2e52..ccd535e84b 100644 --- a/app-wear-shared/shared/src/main/res/values-cs-rCZ/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-cs-rCZ/strings.xml @@ -33,4 +33,11 @@ Připojeno Odpojuji Čekám na odpojení + + Vytvořeno: %1$s + Autor: %1$s + Jméno %1$s + Název souboru: %1$s + Verze ciferníku: %1$s + Výchozí ciferník diff --git a/app-wear-shared/shared/src/main/res/values-da-rDK/strings.xml b/app-wear-shared/shared/src/main/res/values-da-rDK/strings.xml index 4ebcf8b79a..3dae764b93 100644 --- a/app-wear-shared/shared/src/main/res/values-da-rDK/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-da-rDK/strings.xml @@ -33,4 +33,5 @@ Tilsuttet Afbryder Venter på afbrydelse + diff --git a/app-wear-shared/shared/src/main/res/values-de-rDE/strings.xml b/app-wear-shared/shared/src/main/res/values-de-rDE/strings.xml index 77215fd049..6bd82feff6 100644 --- a/app-wear-shared/shared/src/main/res/values-de-rDE/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-de-rDE/strings.xml @@ -33,4 +33,5 @@ Verbunden Verbindung wird getrennt Warte auf Trennung der Verbindung + diff --git a/app-wear-shared/shared/src/main/res/values-el-rGR/strings.xml b/app-wear-shared/shared/src/main/res/values-el-rGR/strings.xml index 6f38c7e4d4..6e2511fd08 100644 --- a/app-wear-shared/shared/src/main/res/values-el-rGR/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-el-rGR/strings.xml @@ -20,4 +20,5 @@ Δημιουργία σύνδεσης Συνδέθηκε Αποσυνδέεται + diff --git a/app-wear-shared/shared/src/main/res/values-es-rES/strings.xml b/app-wear-shared/shared/src/main/res/values-es-rES/strings.xml index 3671d7b82d..bfd2113f9f 100644 --- a/app-wear-shared/shared/src/main/res/values-es-rES/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-es-rES/strings.xml @@ -33,4 +33,5 @@ Conectado Desconectando Esperando la desconexión + diff --git a/app-wear-shared/shared/src/main/res/values-fr-rFR/strings.xml b/app-wear-shared/shared/src/main/res/values-fr-rFR/strings.xml index eb4c2d8302..81daf56453 100644 --- a/app-wear-shared/shared/src/main/res/values-fr-rFR/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-fr-rFR/strings.xml @@ -33,4 +33,5 @@ Connectée Déconnexion en cours Attente de déconnexion + diff --git a/app-wear-shared/shared/src/main/res/values-ga-rIE/strings.xml b/app-wear-shared/shared/src/main/res/values-ga-rIE/strings.xml index 59e1334555..7f4c422d88 100644 --- a/app-wear-shared/shared/src/main/res/values-ga-rIE/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-ga-rIE/strings.xml @@ -22,4 +22,5 @@ Ag nascadh le %1$d s Nasctha Dícheangal + diff --git a/app-wear-shared/shared/src/main/res/values-hu-rHU/strings.xml b/app-wear-shared/shared/src/main/res/values-hu-rHU/strings.xml index 4bfb445290..a30f9e054a 100644 --- a/app-wear-shared/shared/src/main/res/values-hu-rHU/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-hu-rHU/strings.xml @@ -5,4 +5,5 @@ n Kapcsolódva + diff --git a/app-wear-shared/shared/src/main/res/values-it-rIT/strings.xml b/app-wear-shared/shared/src/main/res/values-it-rIT/strings.xml index 41060994d2..1a2b166652 100644 --- a/app-wear-shared/shared/src/main/res/values-it-rIT/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-it-rIT/strings.xml @@ -33,4 +33,5 @@ Connesso Disconnessione In attesa della disconnessione + diff --git a/app-wear-shared/shared/src/main/res/values-iw-rIL/strings.xml b/app-wear-shared/shared/src/main/res/values-iw-rIL/strings.xml index b11eb3c440..7df3b8d5cb 100644 --- a/app-wear-shared/shared/src/main/res/values-iw-rIL/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-iw-rIL/strings.xml @@ -33,4 +33,5 @@ מחובר מתנתק ממתין לניתוק + diff --git a/app-wear-shared/shared/src/main/res/values-ja-rJP/strings.xml b/app-wear-shared/shared/src/main/res/values-ja-rJP/strings.xml index a72c1ec577..d78b6c6230 100644 --- a/app-wear-shared/shared/src/main/res/values-ja-rJP/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-ja-rJP/strings.xml @@ -33,4 +33,5 @@ 接続されました 切断中 切断待ち + diff --git a/app-wear-shared/shared/src/main/res/values-ro-rRO/strings.xml b/app-wear-shared/shared/src/main/res/values-ro-rRO/strings.xml index f196eb74d0..10ce7af4ed 100644 --- a/app-wear-shared/shared/src/main/res/values-ro-rRO/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-ro-rRO/strings.xml @@ -24,4 +24,5 @@ Conectat Se deconectează Se așteaptă deconectarea + diff --git a/core/ui/src/main/res/values-cs-rCZ/strings.xml b/core/ui/src/main/res/values-cs-rCZ/strings.xml index 01c5b42bfb..19b392f309 100644 --- a/core/ui/src/main/res/values-cs-rCZ/strings.xml +++ b/core/ui/src/main/res/values-cs-rCZ/strings.xml @@ -376,6 +376,9 @@ SACHARIDY %1$d g ROZLOŽENÝ BOLUS %1$.2f U %2$d min NAČÍST UDÁLOSTI + SMAZAT ALARMY + DEAKTIVOVAT + AKTUALIZOVAT ČAS NAČÍST HISTORII %1$d NAČÍST CDD NASTAVIT PROFIL @@ -453,6 +456,7 @@ COB vs. IOB !!!!! Detekována pomalá absorbce sacharidů: %2$d%% času. Překontrolujte kalkulaci. COB může být nadhodnocené, a proto může být započítáno více inzulínu !!!!!]]> Podat tuto část z výsledku kalkulace [%] + Časový limit staré glykémie [min] Použito omezení bolusu: %1$.2f U na %2$.2f U Bolus nebude pumpou vydán, pouze zaznamenán Spustit alarm, když je čas na jídlo diff --git a/core/ui/src/main/res/values-es-rES/strings.xml b/core/ui/src/main/res/values-es-rES/strings.xml index 66ff0c0127..63a66e9048 100644 --- a/core/ui/src/main/res/values-es-rES/strings.xml +++ b/core/ui/src/main/res/values-es-rES/strings.xml @@ -376,6 +376,9 @@ CARBOHIDRATOS %1$d g BOLO EXTENDIDO %1$.2f U %2$d min CARGAR EVENTOS + BORRAR ALARMAS + DESACTIVAR + ACTUALIZAR HORA CARGAR HISTORIAL %1$d CARGAR TDDs ESTABLECER PERFIL @@ -453,6 +456,7 @@ COB vs IOB ¡Se ha detectado una absorción lenta de carbohidratos: %2$d%% de tiempo. Comprueba de nuevo el cálculo. Los COB se pueden sobrestimar, por lo que se podría administrar más insulina de la cuenta!]]> Administrar esta parte del resultado del asistente de bolos [%] + Antiguo umbral de tiempo de glucemia [min] Restricción de bolo aplicada: %1$.2f U a %2$.2f U El bolo sólo se anotará (no será entregado por la bomba) Ejecutar alarma cuando sea hora de comer diff --git a/core/ui/src/main/res/values-fr-rFR/strings.xml b/core/ui/src/main/res/values-fr-rFR/strings.xml index d50d8ec938..e5d6e0c5f2 100644 --- a/core/ui/src/main/res/values-fr-rFR/strings.xml +++ b/core/ui/src/main/res/values-fr-rFR/strings.xml @@ -376,6 +376,9 @@ GLUCIDES %1$d g BOLUS ÉTENDU %1$.2f U %2$d min CHARGER LES ÉVÉNEMENTS + SUPPRIMER LES ALARMES + DÉSACTIVER + METTRE À JOUR L\'HEURE CHARGER L\'HISTORIQUE %1$d CHARGER les DTQ DÉFINIR LE PROFIL @@ -451,8 +454,9 @@ Assistant bolus Vous avez une glycémie élevée. Au lieu de manger maintenant, il est recommandé d\'attendre une meilleure glycémie. Voulez-vous faire un bolus de correction maintenant et avoir une alerte quand il sera temps de manger ? Dans ce cas, aucun glucide ne sera enregistré et vous devrez utiliser l\'assistant à nouveau lorsque nous vous le rappelons. GA vs IA - !!!!! Absorption lente des glucides détectée : %2$d%% du temps. Vérifiez de nouveau votre calcul. Les GA (Glucides Actifs) peuvent être surestimés et alors plus d\'insuline pourrait être délivré !!!!!]]> + !!!!! Absorption lente des glucides détectée dans %2$d%% des cas. Vérifiez de nouveau votre calcul. Les GA (Glucides Actifs) peuvent être surestimés et alors trop d\'insuline pourrait être injectée !!!!!]]> Injecter ce pourcentage du bolus calculé par l’assistant [%] + Durée limite après la dernière Gly reçue pour appliquer le % de bolus [min] Contrainte de Bolus appliquée : %1$.2f U vers %2$.2f U Les bolus seront seulement enregistrés (pas délivrés par la pompe) Alerter quand il est temps de manger diff --git a/core/ui/src/main/res/values-it-rIT/strings.xml b/core/ui/src/main/res/values-it-rIT/strings.xml index c43a90f3c3..b70d1551fe 100644 --- a/core/ui/src/main/res/values-it-rIT/strings.xml +++ b/core/ui/src/main/res/values-it-rIT/strings.xml @@ -376,6 +376,7 @@ CHO %1$d g BOLO ESTESO %1$.2f U %2$d min CARICA EVENTI + DISATTIVA CARICA STORICO %1$d CARICA TDD IMPOSTA PROFILO @@ -453,6 +454,7 @@ COB vs IOB !!!!! Rilevato assorbimento lento dei carboidrati: %2$d%% del tempo. Ricontrolla il tuo calcolo. COB potrebbero essere sovrastimati e potrebbe essere somministrata più insulina !!!!!]]> Eroga parte del risultato del calcolatore [%] + Soglia tempo glicemia \"vecchia\" [min] Vincolo bolo applicato: %1$.2f U a %2$.2f U Il bolo sarà solo registrato (non erogato dal micro) Esegui allarme quando è tempo di mangiare diff --git a/core/ui/src/main/res/values-ru-rRU/strings.xml b/core/ui/src/main/res/values-ru-rRU/strings.xml index 83d3228c30..6fd3660f69 100644 --- a/core/ui/src/main/res/values-ru-rRU/strings.xml +++ b/core/ui/src/main/res/values-ru-rRU/strings.xml @@ -23,7 +23,7 @@ мг/дл ммоль/л Сохранить - Отложить + Убрать оповещение Виртуальная помпа Ограничения Суперболюс @@ -527,7 +527,7 @@ Сообщение OK Отменить - ОТКЛОНИТЬ + УБРАТЬ Да Нет Закрыть diff --git a/plugins/aps/src/main/res/values-fr-rFR/strings.xml b/plugins/aps/src/main/res/values-fr-rFR/strings.xml index d66cd58d5c..14ee2eb279 100644 --- a/plugins/aps/src/main/res/values-fr-rFR/strings.xml +++ b/plugins/aps/src/main/res/values-fr-rFR/strings.xml @@ -70,9 +70,9 @@ Activer les SMB lorsqu\'il y a une cible temporaire active (repas imminent, exercise) Activer les SMB avec cibles temp hautes Activer les SMB quand il y a une cible temp haute active (exercise, au dessus de 100 mg/dl ou 5.5 mmol/l) - Max minutes de basal pour limiter le SMB + Max minutes de basal comme limite des SMB SMB RNS minutes max - Minutes de basal max pour limiter les SMB des RNS + Minutes de basal max comme limite des SMB pendant les RNS Glucides minimum requis pour suggestion Quantité de glucides minimum en g pour afficher une alerte de suggestion de glucides. Les suggestions inférieures ne déclencheront pas de notification. Valeur glycémique au-dessous de laquelle l\'injection de l\'insuline est suspendu. La valeur par défaut utilise le modèle standard de la cible. L\'utilisateur peut choisir entre 60mg/dl (3.3mmol/l) et 100mg/dl (5.5mmol/l). Les valeurs au-dessous de 65/3.6 déclenchent l\'utilisation du modèle standard diff --git a/plugins/automation/src/main/res/values-it-rIT/strings.xml b/plugins/automation/src/main/res/values-it-rIT/strings.xml index 0ac3c06831..22eb2b16a1 100644 --- a/plugins/automation/src/main/res/values-it-rIT/strings.xml +++ b/plugins/automation/src/main/res/values-it-rIT/strings.xml @@ -92,6 +92,7 @@ Ora ultimo bolo %1$s %2$s min fa COB COB %1$s %2$.0f + Frequenza cardiaca IOB [U]: Dist [m]: Tempo ricorrente diff --git a/plugins/automation/src/main/res/values-no-rNO/strings.xml b/plugins/automation/src/main/res/values-no-rNO/strings.xml index a7001a7448..b5fb9d3085 100644 --- a/plugins/automation/src/main/res/values-no-rNO/strings.xml +++ b/plugins/automation/src/main/res/values-no-rNO/strings.xml @@ -92,6 +92,8 @@ Siste bolus for %1$s %2$s min siden COB COB %1$s %2$.0f + Puls + HR %1$s %2$.0f IOB [U]: Dist [m]: Gjentakende tidspunkt diff --git a/plugins/automation/src/main/res/values-ru-rRU/strings.xml b/plugins/automation/src/main/res/values-ru-rRU/strings.xml index e27718b842..e0dd020252 100644 --- a/plugins/automation/src/main/res/values-ru-rRU/strings.xml +++ b/plugins/automation/src/main/res/values-ru-rRU/strings.xml @@ -92,6 +92,8 @@ Время болюса %1$s %2$s мин назад Активн углеводы Активн углеводы %1$s %2$.0f + Частота сердечных сокращений + ЧСС%1$s%2$.0f Акт инс IOB [U]: Расст [м]: Время повторения diff --git a/plugins/main/src/main/res/values-cs-rCZ/strings.xml b/plugins/main/src/main/res/values-cs-rCZ/strings.xml index 3dbe4da682..b299bb55b8 100644 --- a/plugins/main/src/main/res/values-cs-rCZ/strings.xml +++ b/plugins/main/src/main/res/values-cs-rCZ/strings.xml @@ -243,6 +243,7 @@ Krátké názvy modulů Zobrazovat kolonku poznámky v dialozích ošetření Kalkulátor provede výpočet, ale dodána je pouze tato část inzulínu. Výhodné při používání SMB algoritmu. + Vydat celý bolus (100%), pokud je glykémie starší než Povolit poradce s bolusem Při vysoké glykémii použijte připomenutí, abyste začali jíst později, namísto výsledku z kalkulátoru („prebolus“) Povolit superbolus @@ -315,6 +316,11 @@ Ukazovat SMB na hodinkách jako normální bolus. Zobrazovat predikce na hodinkách. Predikce + Vlastní ciferník: %1$s + Nahrát ciferník + Odeslat ciferník + Exportovat ciferník + Vlastní ciferník exportován Znovu poslat všechna data Otevřít nastavení na hodinkách Wear diff --git a/plugins/main/src/main/res/values-es-rES/strings.xml b/plugins/main/src/main/res/values-es-rES/strings.xml index a603ac9bf9..1a6086c56f 100644 --- a/plugins/main/src/main/res/values-es-rES/strings.xml +++ b/plugins/main/src/main/res/values-es-rES/strings.xml @@ -243,6 +243,7 @@ Nombres cortos en pestañas Mostrar el campo notas en diálogos de tratamientos El asistente de bolos realiza el cálculo, pero solo se entrega esta parte de la insulina calculada. Útil con el algoritmo SMB. + Administrar bolo completo (100%) si la glucemia es mayor de Habilitar asistente de bolo Utiliza un recordatorio para empezar a comer más tarde, en lugar del resultado del asistente durante una glucemia alta (\"pre-bolo\") Activar superbolo en asistente diff --git a/plugins/main/src/main/res/values-fr-rFR/strings.xml b/plugins/main/src/main/res/values-fr-rFR/strings.xml index ab4b81dc68..09d2dff60d 100644 --- a/plugins/main/src/main/res/values-fr-rFR/strings.xml +++ b/plugins/main/src/main/res/values-fr-rFR/strings.xml @@ -243,6 +243,7 @@ Raccourcir les titres des onglets Affiche les notes dans les dialogues L\'assistant bolus effectue le calcul mais seulement ce pourcentage de l\'insuline calculée est délivré. Utile avec l\'algorithme SMB. + Faire un bolus complet (100%) si la glycémie est plus ancienne que Activer l\'assistant bolus Utiliser un rappel pour commencer le repas à la place du résultat de l\'assistant quand la glycémie est élevée (\"pré-bolus\") Activer les Superbolus dans l’Assistant diff --git a/plugins/main/src/main/res/values-it-rIT/strings.xml b/plugins/main/src/main/res/values-it-rIT/strings.xml index 11fe67fcef..1fdfed8233 100644 --- a/plugins/main/src/main/res/values-it-rIT/strings.xml +++ b/plugins/main/src/main/res/values-it-rIT/strings.xml @@ -243,6 +243,7 @@ Accorcia titoli schede Finestre tratt.nto: mostra campo note Il calcolatore esegue il calcolo, ma solo questa parte dell\'insulina calcolata è erogata. Utile con algoritmo SMB. + Eroga bolo completo (100%) se la glicemia è più \"vecchia\" di Abilita consiglio bolo Usa un promemoria per iniziare a mangiare invece del risultato del calcolatore durante la glicemia alta (\"pre-bolo\") Abilita superbolo nel calcolatore diff --git a/pump/combov2/src/main/res/values-cs-rCZ/strings.xml b/pump/combov2/src/main/res/values-cs-rCZ/strings.xml index 83e3e6a5d3..785c57faee 100644 --- a/pump/combov2/src/main/res/values-cs-rCZ/strings.xml +++ b/pump/combov2/src/main/res/values-cs-rCZ/strings.xml @@ -47,6 +47,7 @@ Pokud po více než ~5 minutách není navázáno žádné spojení:\n\n Časový limit pro vyhledávání Combo dosažen Párování se nezdařilo z důvodu chyby: %1$s Párování přerušeno z neznámých důvodů + "Neplatná délka PINu párování: potřeba %1$d číslic, zadáno %2$d" Vyhledávání pumpy Navazování připojení Bluetooth (pokus č. %1$d) Provádím navazování spojení s pumpou @@ -124,4 +125,6 @@ Pokud po více než ~5 minutách není navázáno žádné spojení:\n\n Obnovování stavu pumpy po nahlášení chyby Zpět Nelze provést párování, protože ovladač není inicializován. To se obvykle stává, protože nebyla udělena potřebná oprávnění Bluetooth. Jděte zpět, udělte oprávnění Bluetooth, pak zkuste znovu spárovat. + Nelze spustit ovladač - Bluetooth je zakázáno + Ovladač nelze spustit - toto zařízení nepodporuje Bluetooth diff --git a/pump/combov2/src/main/res/values-es-rES/strings.xml b/pump/combov2/src/main/res/values-es-rES/strings.xml index e3355b9989..b466ef2ddd 100644 --- a/pump/combov2/src/main/res/values-es-rES/strings.xml +++ b/pump/combov2/src/main/res/values-es-rES/strings.xml @@ -47,6 +47,7 @@ Si no puedes establecer ninguna conexión después de unos ~5 minutos:\n\n Tiempo de espera de escaneo alcanzado No se pudo emparejar debido al error: %1$s Emparejamiento abortado por razones desconocidas + "Longitud del PIN de emparejamiento inválida: Necesita %1$d digits, obtuvo %2$d" Buscando bomba Estableciendo conexión Bluetooth (intento número %1$d) Realizando emparejamiento con la bomba @@ -124,4 +125,6 @@ Si no puedes establecer ninguna conexión después de unos ~5 minutos:\n\n Actualizando el estado de la bomba después de que informara de un error Retroceder No se puede realizar el emparejamiento porque el controlador no está inicializado. Esto suele ocurrir porque no se han concedido los permisos Bluetooth necesarios. Vuelve atrás, concede los permisos Bluetooth e intenta de nuevo el emparejamiento + No se puede iniciar el controlador - El bluetooth está desactivado + El controlador no puede ejecutarse - este dispositivo no es compatible con Bluetooth diff --git a/pump/combov2/src/main/res/values-it-rIT/strings.xml b/pump/combov2/src/main/res/values-it-rIT/strings.xml index bf840709d1..8e14cf8101 100644 --- a/pump/combov2/src/main/res/values-it-rIT/strings.xml +++ b/pump/combov2/src/main/res/values-it-rIT/strings.xml @@ -97,6 +97,7 @@ Se non viene stabilita alcuna connessione dopo più di ~5 minuti:\n\n Imposta TBR 100% (emulato) Lasciando finire il TBR 100% (emulato) in esecuzione TBR 100%: ignorando la richiesta ridondante + Limite inatteso riscontrato durante la regolazione di TBR: la percentuale target era %1$d%%, raggiunto un limite a %2$d%% Impossibile impostare un TBR assoluto se la velocità basale di base è zero Associa AndroidAPS e Android con un micro Accu-Chek Combo attualmente non associato Disassocia AndroidAPS e Android dal micro Accu-Chek Combo attualmente associato diff --git a/pump/combov2/src/main/res/values-iw-rIL/strings.xml b/pump/combov2/src/main/res/values-iw-rIL/strings.xml index bc65ee458c..25020d71b0 100644 --- a/pump/combov2/src/main/res/values-iw-rIL/strings.xml +++ b/pump/combov2/src/main/res/values-iw-rIL/strings.xml @@ -90,6 +90,7 @@ הגדר בזאלי זמני 100% מדומה מאפשר לבזאלי הזמני 100% המדומה לסיים מתעלם מבקשה מיותרת של בזאלי זמני 100% + נמצאה מגבלה בלתי צפוי בעת הגדרת בזאלי זמני: אחוז המטרה היה %1$d%% והגיע למגבלה ב-%2$d%% לא ניתן להגדיר בזאלי זמני אם המינון הבזאלי הבסיסי הוא 0 צימוד AndroidAPS ואנדרואיד עם משאבת Accu-Chek combo שאינה מצומדת ביטול צימוד AndroidAPS ואנדרואיד ממשאבת Accu-Chek combo המצומדת diff --git a/pump/combov2/src/main/res/values-no-rNO/strings.xml b/pump/combov2/src/main/res/values-no-rNO/strings.xml index c6a2d22361..83d5d63dc2 100644 --- a/pump/combov2/src/main/res/values-no-rNO/strings.xml +++ b/pump/combov2/src/main/res/values-no-rNO/strings.xml @@ -98,6 +98,7 @@ knappene samtidig for å avbryte parringen)\n Angi emulert 100% TBR Lar aktive emulert 100% TBR få avslutte Ignorerer redundant 100% TBR forespørsel + Uventet begrensning oppsto ved justering av TBR: målprosenten var %1$d%%, nådde grense på %2$d%% Kan ikke sette absolutt TBR hvis basalraten er null Sammenkoble AndroidAPS og Android med en ikke-tilkoblet Accu-Chek Combo pumpe Koble fra AndroidAPS og Android fra den ilkoblede Accu-Chek Combo pumpen diff --git a/pump/combov2/src/main/res/values-ru-rRU/strings.xml b/pump/combov2/src/main/res/values-ru-rRU/strings.xml index 49f1fb8bcf..d564b3c8cc 100644 --- a/pump/combov2/src/main/res/values-ru-rRU/strings.xml +++ b/pump/combov2/src/main/res/values-ru-rRU/strings.xml @@ -98,6 +98,7 @@ Установить эмуляцию. временного базала TBR 100% Позволить завершиться текущей эмуляции временного базала 100% TBR Игнорирование избыточного запроса на 100% TBR + При настройке ВБС: обнаружен непредвиденный предел: целевой процент %1$d%%, достиг предела %2$d%% Невозможно установить абсолютный TBR, если базовая скорость равна нулю Выполнить сопряжение AndroidAPS и Android с помпой Accu-Chek Combo Отключить AndroidAPS и AndroidAPS от помпы Accu-Chek Combo diff --git a/pump/medtrum/src/main/res/values-af-rZA/arrays.xml b/pump/medtrum/src/main/res/values-af-rZA/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-af-rZA/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-af-rZA/strings.xml b/pump/medtrum/src/main/res/values-af-rZA/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-af-rZA/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-bg-rBG/arrays.xml b/pump/medtrum/src/main/res/values-bg-rBG/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-bg-rBG/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-bg-rBG/strings.xml b/pump/medtrum/src/main/res/values-bg-rBG/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-bg-rBG/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-ca-rES/arrays.xml b/pump/medtrum/src/main/res/values-ca-rES/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-ca-rES/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-ca-rES/strings.xml b/pump/medtrum/src/main/res/values-ca-rES/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-ca-rES/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-cs-rCZ/arrays.xml b/pump/medtrum/src/main/res/values-cs-rCZ/arrays.xml new file mode 100644 index 0000000000..b6253b10b2 --- /dev/null +++ b/pump/medtrum/src/main/res/values-cs-rCZ/arrays.xml @@ -0,0 +1,13 @@ + + + + Světlo, vibrace a pípnutí + Světlo a vibrace + Světlo a pípnutí + Světlo + Vibrace a pípnutí + Vibrace + Pípnutí + Ticho + + diff --git a/pump/medtrum/src/main/res/values-cs-rCZ/strings.xml b/pump/medtrum/src/main/res/values-cs-rCZ/strings.xml new file mode 100644 index 0000000000..0bd6c25637 --- /dev/null +++ b/pump/medtrum/src/main/res/values-cs-rCZ/strings.xml @@ -0,0 +1,119 @@ + + + + Medtrum + MT + Integrace pumpy Medtrum Nano + Nastavení pumpy Medtrum + Chyba pumpy: %1$s!! + Nevyzkoušená pumpa: %1$d! Kontaktujte nás na Discordu nebo Githubu, kde získáte podporu. + Pumpa je pozastavena + Pumpa je pozastavena kvůli překročení maximálního množství inzulínu za hodinu + Pumpa je pozastavena kvůli překročení maximálního množství inzulínu za den + Patch není aktivován + Načtení uživatelského nastavení do pumpy selhalo! + + Stav BLE + Naposledy připojeno + Stav pumpy + Aktivní alarmy + %.2f U + %.2f V + Typ bazálu + Bazální dávka + %.2f U/h + Typ pumpy + Verze FW + Č. patche + Patch vyprší + Obnovit + Resetovat alarmy + Vyměnit patch + Vyžádáno uživatelem + Nepovoleno + + Žádný + Téměř vybitá baterie pumpy + Téměř prázdný zásobník pumpy + Pumpa brzy vyprší + Smyčka pozastavena nízká glykémie + Smyčka pozastavena nízká glykémie 2 + Automatické pozastavení + Pozastavení z důvodu hodinového překročení + Pozastavení z důvodu denního překročení + Pozastaveno + Pozastaveno + Okluze + Expirováno + Prázdný zásobník + Chyba Patche + Chyba Patche 2 + Chyba základny + Vybitá baterie + Žádná kalibrace + Nepodařilo se aktualizovat časové pásmo pumpy, odložit zprávu a aktualizovat ručně. + + Opakovat + Další + Zahodit + Aktivovat Patch + Připojit a naplnit + Naplnit + Plnění + Plnění dokončeno + Připojit Patch + Aktivuji... + Aktivace dokončena + Deaktivovat Patch + Deaktivace... + Patch deaktivován + Aktivace probíhá + Neočekávaný stav: %1$s + Nebyl vybrán žádný profil. Vyberte prosím profil a zkuste to znovu. + Sériové číslo pumpy: %1$X + Žádný aktivní Patch. Stiskněte Další pro zahájení aktivačního procesu. + Základna by neměla být připojena ke kanyle až do dalšího kroku! + Připojte základnu k nové kanyle, odstraňte zbývající vzduch a doplňte inzulinem, poté stiskněte tlačítko Další. + Poznámka: Pro aktivaci je nutné nejméně 70 jednotek. + Prozatím nepřipojujte Patch k tělu. + Stiskněte tlačítko jehly do poloviny. Potom klepněte na Další pro spuštění plnění. + Počkejte prosím na dokončení plnění. + Nepodařilo se provést plnění, zkuste to znovu stisknutím tlačítka Opakovat. + Stiskněte Další pro pokračování. + Stiskněte Další pro spuštění aktivace. + Odstraňte bezpečnostní zámek. Připojte pumpu k tělu. Stiskněte tlačítko jehly. + Odstraňte bezpečnostní zámek. Připojte pumpu k tělu. Stiskněte tlačítko jehly. + Aktivace Pacthe a nastavení počátečního bazálu. Počkejte prosím. + Chyba při aktivaci, stiskněte Opakovat pro nový pokus. + Nový Patch aktivován. Zbývá %.2f jednotek. + Stiskněte OK pro návrat na hlavní obrazovku. + Opravdu chcete deaktivovat současný Patch? + Jste si jistý, že chcete zrušit aktivaci? + Jste si jisti? Tuto akci nelze vrátit zpět!! + Stiskněte Další pro deaktivaci nebo Zrušit pro návrat na hlavní obrazovku. + Deaktivace Patche. Počkejte prosím. + Nepodařilo se deaktivovat, stiskněte Zahodit pro zapomenutí Patche. + Zatížení jehly. Odstraňte Patch z těla. + Odstraňte základnu a vhodně zlikvidujte použitou kanylu. + Stiskněte OK pro návrat na hlavní obrazovku. Stiskněte Další pro zahájení aktivace nového Patche. + Jejda! Něco se pokazilo, zdá se, že již probíhá aktivace. + Stiskněte Další pro obnovení aktivace nebo Zahodit pro resetování stavu aktivace. + Počkejte prosím, čtení stavu aktivace z Patche. + + Sériové číslo + Zadejte sériové číslo základny Patche. + Nastavení alarmů + Vyberte preferované nastavení alarmů. + Vypršení platnosti Patche + Pokud je povoleno, Patch vyprší po 3 dnech s maximální dobou odkladu 8 hodin. + Hodinové maximum inzulínu + Zadejte maximální povolený počet jednotek inzulínu za hodinu. Pokud je překročeno, pumpa bude pozastavena. + Denní maximální inzulín + Zadejte maximální povolené množství inzulínu za den. Pokud je překročeno, pumpa bude pozastavena. + + Čekání na konec bolusu. Zbývá %1$d sek. + Nahrávám stav pumpy + Nahrávám stav bolusu + Nahrávám stav dočasného bazálu + Nastavení uživatelských voleb + diff --git a/pump/medtrum/src/main/res/values-da-rDK/arrays.xml b/pump/medtrum/src/main/res/values-da-rDK/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-da-rDK/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-da-rDK/strings.xml b/pump/medtrum/src/main/res/values-da-rDK/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-da-rDK/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-de-rDE/arrays.xml b/pump/medtrum/src/main/res/values-de-rDE/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-de-rDE/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-de-rDE/strings.xml b/pump/medtrum/src/main/res/values-de-rDE/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-de-rDE/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-el-rGR/arrays.xml b/pump/medtrum/src/main/res/values-el-rGR/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-el-rGR/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-el-rGR/strings.xml b/pump/medtrum/src/main/res/values-el-rGR/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-el-rGR/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-es-rES/arrays.xml b/pump/medtrum/src/main/res/values-es-rES/arrays.xml new file mode 100644 index 0000000000..fb234690b1 --- /dev/null +++ b/pump/medtrum/src/main/res/values-es-rES/arrays.xml @@ -0,0 +1,13 @@ + + + + Luz, vibración y pitido + Luz y vibración + Luz y pitido + Luz + Vibración y pitido + Vibración + Pitido + Silencio + + diff --git a/pump/medtrum/src/main/res/values-es-rES/strings.xml b/pump/medtrum/src/main/res/values-es-rES/strings.xml new file mode 100644 index 0000000000..0358cd08c9 --- /dev/null +++ b/pump/medtrum/src/main/res/values-es-rES/strings.xml @@ -0,0 +1,119 @@ + + + + Medtrum + MT + Integración de bombas de insulina Medtrum Nano + Ajustes de bomba Medtrum + Error de bomba: %1$s !! + Bomba no probada: %1$d! Por favor, contacta con nosotros en Discord o GitHub para obtener soporte + Bomba suspendida + Bomba suspendida por superarse el máximo de insulina por hora + Bomba suspendida por superar el máximo diario de insulina + Parche no activado + Error al configurar los ajustes del usuario en la bomba + + Estado BLE + Última conexión + Estado de la bomba + Alarmas activas + %.2f U + %.2f V + Tipo de basal + Tasa basal + %.2f U/h + Tipo de bomba + Versión de firmware + Parche sin etiqueta + El parche expira + Actualizar + Restablecer alarmas + Cambiar parche + Solicitado por el usuario + No habilitado + + Ninguno + Batería baja de la bomba + Reservorio bajo en la bomba + El parche caduca pronto + Suspensión por glucosa baja + Suspensión por glucosa baja 2 + Auto suspendido + suspensión por máximo por hora + suspensión por máximo por día + Suspendido + Pausado + Oclusión + Expirado + Reservorio vacío + Fallo del parche + Falta del parche 2 + Fallo de base + Batería agotada + Sin calibración + Error al actualizar la zona horaria de la bomba, posponer zumbido y actualizar manualmente. + + Reintentar + Siguiente + Descartar + Activar parche + Conectar y llenar + Purgar + Purgando + Purgado completado + Colocar parche + Activando... + Activación completa + Desactivar parche + Desactivando... + Parche desactivado + Activación en progreso + Estado inesperado: %1$s + No se ha seleccionado ningún perfil. Seleccione un perfil e inténtelo de nuevo. + Número de serie de base de la bomba: %1$X + No hay ningún parche activo. Presiona Siguiente para iniciar el proceso de activación. + ¡La base de la bomba no debe conectarse al parche hasta el siguiente paso! + Conecta la base de la bomba a un nuevo parche, elimina el aire residual y rellena con insulina. Después pulsa Siguiente. + Nota: Se necesitan un mínimo de 70 unidades para la actvación. + No pegues todavía el parche al cuerpo. + Pulsa el botón de la aguja hasta la mitad. A continuación, pulsa Siguiente para iniciar el purgado. + Espera a que finalice el cebado. + No se ha podido purgar, pulsa Reintentar para volver a intentarlo. + Presiona Siguiente para continuar. + Presiona Siguiente para comenzar la activación. + Retira el cierre de seguridad. Acopla la bomba al cuerpo. Pulsa el botón de la aguja. + Retira el cierre de seguridad. Acopla la bomba al cuerpo. Pulsa el botón de la aguja. + Activando la bomba y ajustando la tasa basal inicial. Espera por favor. + Fallo al activar, pulsa Reintentar para volver a intenetarlo. + Nuevo parche activado %.2f Unidades restantes. + Presiona OK para volver a la pantalla principal. + ¿Estás seguro de que quieres desactivar el parche actual? + ¿Estás seguro de que quieres cancelar la activación? + ¿Estás seguro? ¡¡Esta acción no se puede revertir!! + Presiona Siguiente para desactivar o Cancelar para volver a la pantalla principal. + Desactivando parche. Espere, por favor. + Fallo al desactivar, presiona Descartar para olvidar el parche. + Retira la aguja. Retira el parche del cuerpo. + Retira la base de bomba y desecha el parche usado de forma adecuada. + Presiona OK para volver a la pantalla principal. Presiona Siguiente para iniciar la activación de un nuevo parche. + ¡Ups! Algo ha ido mal, parece que hay una activación en curso. + Presiona Siguiente para reanudar la activación o Descartar para restablecer el estado de activación. + Por favor, espera, leyendo el estado de activación de la bomba. + + Número de serie + Introduce el número de serie de la base de la bomba. + Ajustes de las alarmas + Selecciona los ajustes de la alarma de la bomba que prefieras. + Caducidad del parche + Cuando está activado, el parche caducará a los 3 días, con un periodo de gracia de 8 horas adicionales + Insulina máxima por hora + Especificar las unidades máximas de insulina permitidas por hora. Si se supera, la bomba se suspenderá. + Insulina máxima diaria + Especificar las unidades máximas de insulina permitidas por día. Si se superan, la bomba se suspenderá. + + Esperando el fin del bolo. Quedan %1$d seg. + Obteniendo el estado de la bomba + Obteneniendo el estado del bolo + Obteniendo el estado de la basal temporal + Configurar las opciones del usuario + diff --git a/pump/medtrum/src/main/res/values-fr-rFR/arrays.xml b/pump/medtrum/src/main/res/values-fr-rFR/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-fr-rFR/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-fr-rFR/strings.xml b/pump/medtrum/src/main/res/values-fr-rFR/strings.xml new file mode 100644 index 0000000000..8830648bd7 --- /dev/null +++ b/pump/medtrum/src/main/res/values-fr-rFR/strings.xml @@ -0,0 +1,119 @@ + + + + Medtrum + MT + Intégration de pompe pour Medtrum Nano + Paramètres de la pompe Medtrum + Erreur pompe: %1$s!! + Pompe non testée : %1$d! Veuillez nous contacter sur discord ou github pour obtenir de l\'aide + La pompe est suspendue + La pompe est suspendue, la quantité maximum d\'insuline par heure est dépassée + La pompe est suspendue, la quantité maximum d\'insuline par jour est dépassée + Patch non activé + La configuration des paramètres de la pompe a échoué! + + État BT + Dernière connexion + État de la pompe + Alarmes actives + %.2f U + %.2f V + Type de Basale + Débit de Basal + %.2f U/h + Type de pompe + Version du FW + N° du Patch + Expiration du Patch + Actualiser + Réinitialiser les alarmes + Changer le Patch + Demandé par l\'utilisateur + Non activé + + Aucun + Batterie de la pompe faible + Réservoir bas + La pompe expire bientôt + Arrêt Glycémie Basse + Arrêt Glycémie Basse 2 + Suspension auto + suspension max horaire + suspension max journalier + Suspendu + En pause + Occlusion + Expiré + Réservoir vide + Défaut Patch + Défaut Patch 2 + Défaillance de la base + Pile morte + Absence d\'étalonnage + Impossible de mettre à jour le fuseau horaire de la pompe, mettre en veille le message et rafraîchir manuellement. + + Réessayer + Suivant + Retirer + Activer le Patch + Connecter et remplir + Amorcer + Amorçage + Amorçage terminé + Fixer le Patch + En cours d\'activation... + Activation effectuée + Désactiver le Patch + Désactivation en cours... + Patch désactivé + Activation en cours + État inattendu : %1$s + Aucun profil sélectionné. Veuillez sélectionner un profil et réessayez. + N° de série de la base de la pompe : %1$X + Aucun Patch actif. Appuyez sur Suivant pour commencer le processus d\'activation. + La base de la pompe ne doit pas être connectée au Patch avant l\'étape suivante ! + Connectez la base de la pompe à un nouveau Patch, retirez l\'air résiduel et remplissez avec de l\'insuline, puis appuyez sur Suivant. + Remarque : Un minimum de 70 unités est requis pour l\'activation. + Ne fixez pas encore le Patch sur le corps. + Appuyez à mi-course sur le bouton de l\'aiguille. Puis appuyez sur Suivant pour démarrer l\'amorçage. + Merci de patienter jusqu\'à la fin de l\'amorçage. + Échec d\'amorçage, appuyez sur Réessayez pour éssayer à nouveau. + Appuyez sur Suivant pour continuer. + Appuyez sur Suivant pour démarrer l\'activation. + Retirez le verrou de sécurité. Fixez la pompe au corps. Appuyez sur le bouton de l\'aiguille. + Retirez le verrou de sécurité. Fixez la pompe au corps. Appuyez sur le bouton de l\'aiguille. + Activation de la pompe et du débit de base initial. Veuillez patienter. + Échec de l\'activation, appuyez sur Réessayez pour éssayer à nouveau. + Nouveau Patch activé. %.2f Unités restantes. + Appuyez sur OK pour revenir à l\'écran principal. + Êtes-vous sûr de vouloir désactiver le Patch actuel ? + Êtes-vous sûr de vouloir annuler l\'activation? + Êtes-vous certain ? Cette action est irréversible!! + Appuyez sur Suivant pour désactiver ou Annuler pour revenir à l\'écran principal. + Désactivation du Patch. Veuillez patienter. + Échec de la désactivation, appuyez sur Supprimer pour oublier le Patch. + Retirer l\'aiguille. Retirer le Patch du corps. + Retirez la base de la pompe et jetez le Patch utilisé de façon appropriée. + Appuyez sur OK pour revenir à l\'écran principal. Appuyez sur Suivant pour démarrer l\'activation du nouveau Patch. + Oups ! Quelque chose s\'est mal passé, il semble qu\'il y ait déjà une activation en cours. + Appuyez sur Suivant pour reprendre l\'activation ou Supprimer pour réinitialiser l\'état d\'activation. + Veuillez patienter, lecture de l\'état d\'activation de la pompe. + + Numéro de série + Entrez le numéro de série de la base de votre pompe. + Paramètres d\'Alarme + Sélectionnez vos préférences d’alarme de votre pompe. + Expiration du Patch + Lorsqu\'il est activé, le Patch expirera après 3 jours, avec un délai de grâce de 8 heures au-delà. + Insuline maximale horaire + Spécifiez le nombre maximum d\'unités d\'insuline autorisées par heure. Si ce montant est dépassé, la pompe sera suspendue. + Insuline maximale quotidienne + Spécifiez le nombre maximum d\'unités d\'insuline autorisées par jour. Si ce montant est dépassé, la pompe sera suspendue. + + Bolus en cours. %1$d sec. restantes. + Obtenir l\'état de la pompe + Obtenir l\'état du bolus + Obtenir l\'état du basal temporaire + Réglage des paramètres utilisateur + diff --git a/pump/medtrum/src/main/res/values-ga-rIE/arrays.xml b/pump/medtrum/src/main/res/values-ga-rIE/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-ga-rIE/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-ga-rIE/strings.xml b/pump/medtrum/src/main/res/values-ga-rIE/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-ga-rIE/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-hr-rHR/arrays.xml b/pump/medtrum/src/main/res/values-hr-rHR/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-hr-rHR/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-hr-rHR/strings.xml b/pump/medtrum/src/main/res/values-hr-rHR/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-hr-rHR/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-hu-rHU/arrays.xml b/pump/medtrum/src/main/res/values-hu-rHU/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-hu-rHU/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-hu-rHU/strings.xml b/pump/medtrum/src/main/res/values-hu-rHU/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-hu-rHU/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-it-rIT/arrays.xml b/pump/medtrum/src/main/res/values-it-rIT/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-it-rIT/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-it-rIT/strings.xml b/pump/medtrum/src/main/res/values-it-rIT/strings.xml new file mode 100644 index 0000000000..492785a918 --- /dev/null +++ b/pump/medtrum/src/main/res/values-it-rIT/strings.xml @@ -0,0 +1,32 @@ + + + + Medtrum + MT + Errore micro: %1$s!! + Il micro è sospeso + + Stato BLE + Ultima connessione + Stato micro + %.2f U + Tipo basale + Velocità basale + %.2f U/h + Tipo micro + Aggiorna + Non abilitato + + Nessuno + Sospeso + In pausa + Occlusione + Scaduto + Serbatoio vuoto + + + Numero seriale + Impostazioni allarmi + Scadenza patch + + diff --git a/pump/medtrum/src/main/res/values-iw-rIL/arrays.xml b/pump/medtrum/src/main/res/values-iw-rIL/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-iw-rIL/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-iw-rIL/strings.xml b/pump/medtrum/src/main/res/values-iw-rIL/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-iw-rIL/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-ja-rJP/arrays.xml b/pump/medtrum/src/main/res/values-ja-rJP/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-ja-rJP/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-ja-rJP/strings.xml b/pump/medtrum/src/main/res/values-ja-rJP/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-ja-rJP/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-ko-rKR/arrays.xml b/pump/medtrum/src/main/res/values-ko-rKR/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-ko-rKR/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-ko-rKR/strings.xml b/pump/medtrum/src/main/res/values-ko-rKR/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-ko-rKR/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-lt-rLT/arrays.xml b/pump/medtrum/src/main/res/values-lt-rLT/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-lt-rLT/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-lt-rLT/strings.xml b/pump/medtrum/src/main/res/values-lt-rLT/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-lt-rLT/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-nl-rNL/arrays.xml b/pump/medtrum/src/main/res/values-nl-rNL/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-nl-rNL/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-nl-rNL/strings.xml b/pump/medtrum/src/main/res/values-nl-rNL/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-nl-rNL/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-no-rNO/arrays.xml b/pump/medtrum/src/main/res/values-no-rNO/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-no-rNO/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-no-rNO/strings.xml b/pump/medtrum/src/main/res/values-no-rNO/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-no-rNO/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-pl-rPL/arrays.xml b/pump/medtrum/src/main/res/values-pl-rPL/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-pl-rPL/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-pl-rPL/strings.xml b/pump/medtrum/src/main/res/values-pl-rPL/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-pl-rPL/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-pt-rBR/arrays.xml b/pump/medtrum/src/main/res/values-pt-rBR/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-pt-rBR/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-pt-rBR/strings.xml b/pump/medtrum/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-pt-rPT/arrays.xml b/pump/medtrum/src/main/res/values-pt-rPT/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-pt-rPT/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-pt-rPT/strings.xml b/pump/medtrum/src/main/res/values-pt-rPT/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-pt-rPT/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-ro-rRO/arrays.xml b/pump/medtrum/src/main/res/values-ro-rRO/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-ro-rRO/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-ro-rRO/strings.xml b/pump/medtrum/src/main/res/values-ro-rRO/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-ro-rRO/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-ru-rRU/arrays.xml b/pump/medtrum/src/main/res/values-ru-rRU/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-ru-rRU/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-ru-rRU/strings.xml b/pump/medtrum/src/main/res/values-ru-rRU/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-ru-rRU/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-sk-rSK/arrays.xml b/pump/medtrum/src/main/res/values-sk-rSK/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-sk-rSK/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-sk-rSK/strings.xml b/pump/medtrum/src/main/res/values-sk-rSK/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-sk-rSK/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-sr-rCS/arrays.xml b/pump/medtrum/src/main/res/values-sr-rCS/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-sr-rCS/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-sr-rCS/strings.xml b/pump/medtrum/src/main/res/values-sr-rCS/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-sr-rCS/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-sv-rSE/arrays.xml b/pump/medtrum/src/main/res/values-sv-rSE/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-sv-rSE/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-sv-rSE/strings.xml b/pump/medtrum/src/main/res/values-sv-rSE/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-sv-rSE/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-tr-rTR/arrays.xml b/pump/medtrum/src/main/res/values-tr-rTR/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-tr-rTR/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-tr-rTR/strings.xml b/pump/medtrum/src/main/res/values-tr-rTR/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-tr-rTR/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/pump/medtrum/src/main/res/values-zh-rCN/arrays.xml b/pump/medtrum/src/main/res/values-zh-rCN/arrays.xml new file mode 100644 index 0000000000..3ea04e700d --- /dev/null +++ b/pump/medtrum/src/main/res/values-zh-rCN/arrays.xml @@ -0,0 +1,2 @@ + + diff --git a/pump/medtrum/src/main/res/values-zh-rCN/strings.xml b/pump/medtrum/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000000..36c8a820fe --- /dev/null +++ b/pump/medtrum/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/wear/src/main/res/values-cs-rCZ/strings.xml b/wear/src/main/res/values-cs-rCZ/strings.xml index 47c3a2d2ea..1e88264e5d 100644 --- a/wear/src/main/res/values-cs-rCZ/strings.xml +++ b/wear/src/main/res/values-cs-rCZ/strings.xml @@ -11,6 +11,7 @@ AAPS(Kokpit) AAPS (Steampunk) AAPS (DigitalStyle) + AAPS (vlastní) AAPS(Akce) AAPS(Doč. cíl) AAPS(Rychlý bolus) @@ -143,6 +144,7 @@ Zobrazit pouze čas a glykémii Vibrovat každou hodinu Zobrazit číslo týdne + Zobrazovat sekundy Váš styl: bez stylu minimalistický styl diff --git a/wear/src/main/res/values-es-rES/strings.xml b/wear/src/main/res/values-es-rES/strings.xml index f39923de34..8437dddeed 100644 --- a/wear/src/main/res/values-es-rES/strings.xml +++ b/wear/src/main/res/values-es-rES/strings.xml @@ -72,7 +72,7 @@ Tratamiento Trata Bolo - Carbohidratos + Carbos eCarbs Configuración Estado diff --git a/wear/src/main/res/values-ru-rRU/strings.xml b/wear/src/main/res/values-ru-rRU/strings.xml index db94f8ded6..9414b826d7 100644 --- a/wear/src/main/res/values-ru-rRU/strings.xml +++ b/wear/src/main/res/values-ru-rRU/strings.xml @@ -184,7 +184,7 @@ 000г 00,0 0,00 ед - Отложить оповещения AAPS + Оповещение о переходе AAPS в режим энергосбережения Отправка команды отложить оповещения AAPS ч н