diff --git a/app/build.gradle b/app/build.gradle
index b7477fd27f..858fe354fc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -109,7 +109,7 @@ android {
targetSdkVersion 28
multiDexEnabled true
versionCode 1500
- version "2.5.0-dev"
+ version "2.6-dev"
buildConfigField "String", "VERSION", '"' + version + '"'
buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"'
buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"'
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/versionChecker/VersionCheckerUtils.kt b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/versionChecker/VersionCheckerUtils.kt
index 4b19e33540..ac9724608f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/versionChecker/VersionCheckerUtils.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/versionChecker/VersionCheckerUtils.kt
@@ -15,21 +15,14 @@ import java.io.IOException
import java.net.URL
import java.util.concurrent.TimeUnit
-
// check network connection
fun isConnected(): Boolean {
val connMgr = MainApp.instance().applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return connMgr.activeNetworkInfo?.isConnected ?: false
}
-fun findVersion(file :String?): String? {
- val regex = "(.*)version(.*)\"(((\\d+)\\.)+(\\d+))\"(.*)".toRegex()
- return file?.lines()?.filter { regex.matches(it) }?.mapNotNull { regex.matchEntire(it)?.groupValues?.getOrNull(3) }?.firstOrNull()
-}
-
private val log = LoggerFactory.getLogger(L.CORE)
-
fun triggerCheckVersion() {
if (!SP.contains(R.string.key_last_time_this_version_detected)) {
@@ -56,13 +49,34 @@ private fun checkVersion() = if (isConnected()) {
log.debug("Github master version no checked. No connectivity")
fun compareWithCurrentVersion(newVersion: String?, currentVersion: String) {
- val comparison: Int? = newVersion?.versionStrip()?.compareTo(currentVersion.versionStrip())
- when {
- comparison == null -> onVersionNotDetectable()
- comparison == 0 -> onSameVersionDetected()
- comparison > 0 -> onNewVersionDetected(currentVersion = currentVersion, newVersion = newVersion)
- else -> onOlderVersionDetected()
+
+ val newVersionElements = newVersion.toNumberList()
+ val currentVersionElements = currentVersion.toNumberList()
+
+ if (newVersionElements == null || newVersionElements.isEmpty()) {
+ onVersionNotDetectable()
+ return
}
+
+ if (currentVersionElements == null || currentVersionElements.isEmpty()) {
+ // current version scrambled?!
+ onNewVersionDetected(currentVersion, newVersion)
+ return
+ }
+
+ newVersionElements.take(3).forEachIndexed { i, newElem ->
+ val currElem: Int = currentVersionElements.getOrNull(i)
+ ?: return onNewVersionDetected(currentVersion, newVersion)
+
+ (newElem - currElem).let {
+ when {
+ it > 0 -> return onNewVersionDetected(currentVersion, newVersion)
+ it < 0 -> return onOlderVersionDetected()
+ it == 0 -> Unit
+ }
+ }
+ }
+ onSameVersionDetected()
}
private fun onOlderVersionDetected() {
@@ -75,7 +89,7 @@ fun onSameVersionDetected() {
}
fun onVersionNotDetectable() {
- log.debug("fetch failed, ignore and smartcast to non-null")
+ log.debug("fetch failed")
}
fun onNewVersionDetected(currentVersion: String, newVersion: String?) {
@@ -88,14 +102,25 @@ fun onNewVersionDetected(currentVersion: String, newVersion: String?) {
}
}
+@Deprecated(replaceWith = ReplaceWith("numericVersionPart()"), message = "Will not work if RCs have another index number in it.")
fun String.versionStrip() = this.mapNotNull {
when (it) {
in '0'..'9' -> it
- '.' -> it
- else -> null
+ '.' -> it
+ else -> null
}
}.joinToString(separator = "")
+fun String.numericVersionPart(): String =
+ "(((\\d+)\\.)+(\\d+))(\\D(.*))?".toRegex().matchEntire(this)?.groupValues?.getOrNull(1) ?: ""
+
+fun String?.toNumberList() =
+ this?.numericVersionPart().takeIf { !it.isNullOrBlank() }?.split(".")?.map { it.toInt() }
+
+fun findVersion(file: String?): String? {
+ val regex = "(.*)version(.*)\"(((\\d+)\\.)+(\\d+))\"(.*)".toRegex()
+ return file?.lines()?.filter { regex.matches(it) }?.mapNotNull { regex.matchEntire(it)?.groupValues?.getOrNull(3) }?.firstOrNull()
+}
val CHECK_EVERY = TimeUnit.DAYS.toMillis(1)
val WARN_EVERY = TimeUnit.DAYS.toMillis(1)
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NsClientReceiverDelegate.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NsClientReceiverDelegate.java
index 0efbf35545..c68750d828 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NsClientReceiverDelegate.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NsClientReceiverDelegate.java
@@ -20,7 +20,7 @@ class NsClientReceiverDelegate {
private final Context context;
- private NetworkChangeReceiver networkChangeReceiver = NetworkChangeReceiver.instance;
+ private NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver();
private ChargingStateReceiver chargingStateReceiver = new ChargingStateReceiver();
private boolean allowedChargingState = true;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/WizardDialog.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/WizardDialog.kt
index 552ab502e7..efe800bef0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/WizardDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/WizardDialog.kt
@@ -114,6 +114,7 @@ class WizardDialog : DialogFragment() {
log.debug("guarding: ok already clicked")
} else {
okClicked = true
+ calculateInsulin()
parentContext?.let { context ->
wizard?.confirmAndExecute(context)
}
diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java
index 23e826e380..3f12d75fce 100644
--- a/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java
+++ b/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java
@@ -28,11 +28,7 @@ public class NetworkChangeReceiver extends BroadcastReceiver {
// TODO: Split NSClient into network state component that can be used by several plugins and logic for plugin
public static void fetch() {
- NetworkChangeReceiver.instance.grabNetworkStatus(MainApp.instance().getApplicationContext());
- }
-
- private NetworkChangeReceiver() {
- super();
+ new NetworkChangeReceiver().grabNetworkStatus(MainApp.instance().getApplicationContext());
}
@Override
@@ -90,4 +86,4 @@ public class NetworkChangeReceiver extends BroadcastReceiver {
public static EventNetworkChange getLastEvent() {
return lastEvent;
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 20377eb2bb..a1a03b2385 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1331,9 +1331,9 @@
Upload BG tests
smbmaxminutes
- Dayligh Saving time
- Dayligh Saving time change in 24h or less
- Daylight saving time change less than 3 hours ago - Closed loop disabled
+ Daylight Saving time
+ Daylight Saving time change in 24h or less
+ Daylight Saving time change less than 3 hours ago - Closed loop disabled
internal storage constraint
Free at least %1$d MB from internal storage! Loop disabled!
Wrong format
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/constraints/versionChecker/VersionCheckerUtilsKtTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/constraints/versionChecker/VersionCheckerUtilsKtTest.kt
index 581f51c6d9..49fd78ff13 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/constraints/versionChecker/VersionCheckerUtilsKtTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/constraints/versionChecker/VersionCheckerUtilsKtTest.kt
@@ -16,6 +16,70 @@ import org.powermock.modules.junit4.PowerMockRunner
@RunWith(PowerMockRunner::class)
class VersionCheckerUtilsKtTest {
+
+
+
+ @Test
+ fun `should keep 2 digit version`() {
+ assertEquals("1.2", "1.2".numericVersionPart())
+ }
+
+ @Test
+ fun `should keep 3 digit version`() {
+ assertEquals("1.2.3", "1.2.3".numericVersionPart())
+ }
+
+ @Test
+ fun `should keep 4 digit version`() {
+ assertEquals("1.2.3.4", "1.2.3.4".numericVersionPart())
+ }
+
+ @Test
+ fun `should strip 2 digit version RC`() {
+ assertEquals("1.2", "1.2-RC1".numericVersionPart())
+ }
+
+ @Test
+ fun `should strip 2 digit version RC old format`() {
+ assertEquals("1.2", "1.2RC1".numericVersionPart())
+ }
+
+ @Test
+ fun `should strip 2 digit version RC without digit`() {
+ assertEquals("1.2", "1.2-RC".numericVersionPart())
+ }
+
+ @Test
+ fun `should strip 2 digit version dev`() {
+ assertEquals("1.2", "1.2-dev".numericVersionPart())
+ }
+
+ @Test
+ fun `should strip 2 digit version dev old format 1`() {
+ assertEquals("1.2", "1.2dev".numericVersionPart())
+ }
+
+ @Test
+ fun `should strip 2 digit version dev old format 2`() {
+ assertEquals("1.2", "1.2dev-a3".numericVersionPart())
+ }
+
+ @Test
+ fun `should strip 3 digit version RC`() {
+ assertEquals("1.2.3", "1.2.3-RC1".numericVersionPart())
+ }
+
+ @Test
+ fun `should strip 4 digit version RC`() {
+ assertEquals("1.2.3.4", "1.2.3.4-RC5".numericVersionPart())
+ }
+
+ @Test
+ fun `should strip even with dot`() {
+ assertEquals("1.2", "1.2.RC5".numericVersionPart())
+ }
+
+
@Test
fun findVersionMatchesRegularVersion() {
val buildGradle = """blabla
@@ -154,6 +218,33 @@ class VersionCheckerUtilsKtTest {
PowerMockito.verifyNoMoreInteractions(SP::class.java)
}
+ @Test
+ @PrepareForTest(MainApp::class, L::class, SP::class)
+ fun `should not find update on fourth version digit`() {
+ prepareMainApp()
+ compareWithCurrentVersion(newVersion = "2.5.0", currentVersion = "2.5.0.1")
+
+ //verify(bus, times(0)).post(any())
+
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.putLong(eq(R.string.key_last_time_this_version_detected), ArgumentMatchers.anyLong())
+ PowerMockito.verifyNoMoreInteractions(SP::class.java)
+ }
+
+ @Test
+ @PrepareForTest(MainApp::class, L::class, SP::class)
+ fun `should not find update on personal version with same number` (){
+ prepareMainApp()
+ compareWithCurrentVersion(newVersion = "2.5.0", currentVersion = "2.5.0-myversion")
+
+ //verify(bus, times(0)).post(any())
+
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.putLong(eq(R.string.key_last_time_this_version_detected), ArgumentMatchers.anyLong())
+ PowerMockito.verifyNoMoreInteractions(SP::class.java)
+ }
+
+
@Test
@PrepareForTest(MainApp::class, L::class, SP::class)
fun `find same version`() {
@@ -177,6 +268,27 @@ class VersionCheckerUtilsKtTest {
@Test
@PrepareForTest(MainApp::class, L::class, SP::class)
fun `find higher version`() {
+ val buildGradle = """blabla
+ | android {
+ | aosenuthoae
+ | }
+ | version = "3.0.0"
+ | appName = "Aaoeu"
+ """.trimMargin()
+ prepareMainApp()
+ compareWithCurrentVersion(findVersion(buildGradle), currentVersion = "2.2.2")
+
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.getLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.putLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyNoMoreInteractions(SP::class.java)
+ }
+
+
+ @Test
+ @PrepareForTest(MainApp::class, L::class, SP::class)
+ fun `find higher version with longer number`() {
val buildGradle = """blabla
| android {
| aosenuthoae
@@ -194,6 +306,148 @@ class VersionCheckerUtilsKtTest {
PowerMockito.verifyNoMoreInteractions(SP::class.java)
}
+ @Test
+ @PrepareForTest(MainApp::class, L::class, SP::class)
+ fun `find higher version after RC`() {
+ val buildGradle = """blabla
+ | android {
+ | aosenuthoae
+ | }
+ | version = "3.0.0"
+ | appName = "Aaoeu"
+ """.trimMargin()
+ prepareMainApp()
+ compareWithCurrentVersion(findVersion(buildGradle), currentVersion = "3.0-RC04")
+
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.getLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.putLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyNoMoreInteractions(SP::class.java)
+ }
+
+ @Test
+ @PrepareForTest(MainApp::class, L::class, SP::class)
+ fun `find higher version after RC 2 - typo`() {
+ val buildGradle = """blabla
+ | android {
+ | aosenuthoae
+ | }
+ | version = "3.0.0"
+ | appName = "Aaoeu"
+ """.trimMargin()
+ prepareMainApp()
+ compareWithCurrentVersion(findVersion(buildGradle), currentVersion = "3.0RC04")
+
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.getLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.putLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyNoMoreInteractions(SP::class.java)
+ }
+
+ @Test
+ @PrepareForTest(MainApp::class, L::class, SP::class)
+ fun `find higher version after RC 3 - typo`() {
+ val buildGradle = """blabla
+ | android {
+ | aosenuthoae
+ | }
+ | version = "3.0.0"
+ | appName = "Aaoeu"
+ """.trimMargin()
+ prepareMainApp()
+ compareWithCurrentVersion(findVersion(buildGradle), currentVersion = "3.RC04")
+
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.getLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.putLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyNoMoreInteractions(SP::class.java)
+ }
+
+ @Test
+ @PrepareForTest(MainApp::class, L::class, SP::class)
+ fun `find higher version after RC 4 - typo`() {
+ val buildGradle = """blabla
+ | android {
+ | aosenuthoae
+ | }
+ | version = "3.0.0"
+ | appName = "Aaoeu"
+ """.trimMargin()
+ prepareMainApp()
+ compareWithCurrentVersion(findVersion(buildGradle), currentVersion = "3.0.RC04")
+
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.getLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.putLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyNoMoreInteractions(SP::class.java)
+ }
+
+ @Test
+ @PrepareForTest(MainApp::class, L::class, SP::class)
+ fun `find higher version on multi digit numbers`() {
+ val buildGradle = """blabla
+ | android {
+ | aosenuthoae
+ | }
+ | version = "3.7.12"
+ | appName = "Aaoeu"
+ """.trimMargin()
+ prepareMainApp()
+ compareWithCurrentVersion(findVersion(buildGradle), currentVersion = "3.7.9")
+
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.getLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.putLong(eq(R.string.key_last_versionchecker_warning), ArgumentMatchers.anyLong())
+ PowerMockito.verifyNoMoreInteractions(SP::class.java)
+ }
+
+ @Test
+ @PrepareForTest(MainApp::class, L::class, SP::class)
+ fun `don't find higher version on higher but shorter version`() {
+ val buildGradle = """blabla
+ | android {
+ | aosenuthoae
+ | }
+ | version = "2.2.2"
+ | appName = "Aaoeu"
+ """.trimMargin()
+ prepareMainApp()
+ compareWithCurrentVersion(findVersion(buildGradle), currentVersion = "2.3")
+
+ //verify(bus, times(0)).post(any())
+
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.putLong(eq(R.string.key_last_time_this_version_detected), ArgumentMatchers.anyLong())
+ PowerMockito.verifyNoMoreInteractions(SP::class.java)
+ }
+
+ @Test
+ @PrepareForTest(MainApp::class, L::class, SP::class)
+ fun `don't find higher version if on next RC`() {
+ val buildGradle = """blabla
+ | android {
+ | aosenuthoae
+ | }
+ | version = "2.2.2"
+ | appName = "Aaoeu"
+ """.trimMargin()
+ prepareMainApp()
+ compareWithCurrentVersion(findVersion(buildGradle), currentVersion = "2.3-RC")
+
+ //verify(bus, times(0)).post(any())
+
+ PowerMockito.verifyStatic(SP::class.java, times(1))
+ SP.putLong(eq(R.string.key_last_time_this_version_detected), ArgumentMatchers.anyLong())
+ PowerMockito.verifyNoMoreInteractions(SP::class.java)
+ }
+
+
+
@Test
@PrepareForTest(System::class)
@@ -221,4 +475,4 @@ class VersionCheckerUtilsKtTest {
`when`(L.isEnabled(any())).thenReturn(true)
}
-}
\ No newline at end of file
+}