This commit is contained in:
Milos Kozak 2023-10-24 15:52:35 +02:00
commit d8190d00b6
147 changed files with 2911 additions and 2413 deletions

View file

@ -25,8 +25,8 @@ jobs:
- android/start-emulator-and-run-tests:
system-image: system-images;android-29;google_apis;x86
# Compile while the emulator starts to use the time.
post-emulator-launch-assemble-command: ./gradlew compileFullDebugUnitTestSources database:impl:compileFullDebugAndroidTestSources
test-command: ./gradlew database:impl:connectedFullDebugAndroidTest
post-emulator-launch-assemble-command: ./gradlew compileFullDebugUnitTestSources compileFullDebugAndroidTestSources
test-command: ./gradlew connectedFullDebugAndroidTest
- android/run-tests:
test-command: ./gradlew testFullDebugUnitTest

8
.gitignore vendored
View file

@ -3,6 +3,7 @@
/local.properties
.DS_Store
*/jacoco.exec
*/output-metadata.json
/build
/captures
*.apk
@ -19,6 +20,9 @@ app/.classpath
app/.settings/org.eclipse.buildship.core.prefs
wear/.classpath
wear/.settings/org.eclipse.buildship.core.prefs
app/nsclient/*
app/nsclient2/*
app/aapsclient/*
app/aapsclient2/*
app/pumpcontrol/*
wear/aapsclient/*
wear/aapsclient2/*
wear/pumpcontrol/*

View file

@ -1,282 +0,0 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
id 'kotlinx-serialization'
id 'com.google.gms.google-services'
id 'com.google.firebase.crashlytics'
id 'com.vanniktech.dependency.graph.generator'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
repositories {
mavenCentral()
google()
}
def generateGitBuild = { ->
StringBuilder stringBuilder = new StringBuilder()
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'describe', '--always'
standardOutput = stdout
}
String commitObject = stdout.toString().trim()
stringBuilder.append(commitObject)
} catch (ignored) {
stringBuilder.append('NoGitSystemAvailable')
}
return stringBuilder.toString()
}
def generateGitRemote = { ->
StringBuilder stringBuilder = new StringBuilder()
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'remote', 'get-url', 'origin'
standardOutput = stdout
}
String commitObject = stdout.toString().trim()
stringBuilder.append(commitObject)
} catch (ignored) {
stringBuilder.append('NoGitSystemAvailable')
}
return stringBuilder.toString()
}
def generateDate = { ->
StringBuilder stringBuilder = new StringBuilder()
// showing only date prevents app to rebuild everytime
stringBuilder.append((new Date()).format('yyyy.MM.dd'))
return stringBuilder.toString()
}
def isMaster = { ->
return !version.contains('-')
}
def gitAvailable = { ->
StringBuilder stringBuilder = new StringBuilder()
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', '--version'
standardOutput = stdout
}
String commitObject = stdout.toString().trim()
stringBuilder.append(commitObject)
} catch (ignored) {
return false // NoGitSystemAvailable
}
return !stringBuilder.toString().isEmpty()
}
def allCommitted = { ->
StringBuilder stringBuilder = new StringBuilder()
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'status', '-s'
standardOutput = stdout
}
// ignore all changes done in .idea/codeStyles
String cleanedList = stdout.toString().replaceAll(/(?m)^\s*(M|A|D|\?\?)\s*.*?\.idea\/codeStyles\/.*?\s*$/, "")
// ignore all files added to project dir but not staged/known to GIT
cleanedList = cleanedList.replaceAll(/(?m)^\s*(\?\?)\s*.*?\s*$/, "")
stringBuilder.append(cleanedList.trim())
} catch (ignored) {
return false // NoGitSystemAvailable
}
return stringBuilder.toString().isEmpty()
}
android {
namespace 'app.aaps'
ndkVersion "21.1.6352462"
defaultConfig {
multiDexEnabled true
versionCode 1500
version "3.2.0-dev-m"
buildConfigField "String", "VERSION", '"' + version + '"'
buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"'
buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"'
buildConfigField "String", "HEAD", '"' + generateGitBuild() + '"'
buildConfigField "String", "COMMITTED", '"' + allCommitted() + '"'
}
flavorDimensions = ["standard"]
productFlavors {
full {
getIsDefault().set(true)
applicationId "info.nightscout.androidaps"
dimension "standard"
resValue "string", "app_name", "AAPS"
versionName version
manifestPlaceholders = [
appIcon : "@mipmap/ic_launcher",
appIconRound: "@mipmap/ic_launcher_round"
]
}
pumpcontrol {
applicationId "info.nightscout.aapspumpcontrol"
dimension "standard"
resValue "string", "app_name", "Pumpcontrol"
versionName version + "-pumpcontrol"
manifestPlaceholders = [
appIcon : "@mipmap/ic_pumpcontrol",
appIconRound: "@null"
]
}
aapsclient {
applicationId "info.nightscout.aapsclient"
dimension "standard"
resValue "string", "app_name", "AAPSClient"
versionName version + "-aapsclient"
manifestPlaceholders = [
appIcon : "@mipmap/ic_yellowowl",
appIconRound: "@mipmap/ic_yellowowl"
]
}
aapsclient2 {
applicationId "info.nightscout.aapsclient2"
dimension "standard"
resValue "string", "app_name", "AAPSClient2"
versionName version + "-aapsclient"
manifestPlaceholders = [
appIcon : "@mipmap/ic_blueowl",
appIconRound: "@mipmap/ic_blueowl"
]
}
}
useLibrary "org.apache.http.legacy"
dataBinding { //Deleting it causes a binding error
enabled = true
}
}
allprojects {
repositories {
}
}
dependencies {
wearApp project(':wear')
// in order to use internet's versions you'd need to enable Jetifier again
// https://github.com/nightscout/graphview.git
// https://github.com/nightscout/iconify.git
implementation project(':shared:impl')
implementation project(':core:main')
implementation project(':core:graphview')
implementation project(':core:interfaces')
implementation project(':core:libraries')
implementation project(':core:nssdk')
implementation project(':core:utils')
implementation project(':core:ui')
implementation project(':core:validators')
implementation project(':ui')
implementation project(':plugins:aps')
implementation project(':plugins:automation')
implementation project(':plugins:configuration')
implementation project(':plugins:constraints')
implementation project(':plugins:insulin')
implementation project(':plugins:main')
implementation project(':plugins:sensitivity')
implementation project(':plugins:smoothing')
implementation project(':plugins:source')
implementation project(':plugins:sync')
implementation project(':implementation')
implementation project(':database:entities')
implementation project(':database:impl')
implementation project(':pump:combo')
implementation project(':pump:combov2')
implementation project(':pump:dana')
implementation project(':pump:danars')
implementation project(':pump:danar')
implementation project(':pump:diaconn')
implementation project(':pump:eopatch')
implementation project(':pump:medtrum')
implementation project(':insight')
implementation project(':pump:medtronic')
implementation project(':pump:pump-common')
implementation project(':pump:omnipod-common')
implementation project(':pump:omnipod-eros')
implementation project(':pump:omnipod-dash')
implementation project(':pump:rileylink')
implementation project(':pump:virtual')
implementation project(':workflow')
testImplementation project(':shared:tests')
implementation fileTree(include: ['*.jar'], dir: 'libs')
/* Dagger2 - We are going to use dagger.android which includes
* support for Activity and fragment injection so we need to include
* the following dependencies */
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
// MainApp
api "com.uber.rxdogtag2:rxdogtag:2.0.2"
}
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
/*
// Run 'adb' shell command to clear application data of main app for 'debug' variant
task clearMainAppData(type: Exec) {
// we have to iterate to find the 'debug' variant to obtain a variant reference
android.applicationVariants.all { variant ->
if (variant.name == "fullDebug") {
def applicationId = [variant.mergedFlavor.applicationId, variant.buildType.applicationIdSuffix].findAll().join()
def clearDataCommand = ['adb', 'shell', 'pm', 'clear', applicationId]
println "Clearing application data of ${variant.name} variant: [${clearDataCommand}]"
def stdout = new ByteArrayOutputStream()
exec {
commandLine clearDataCommand
standardOutput = stdout
}
String result = stdout.toString().trim()
if (!result.startsWith("Success")) {
println result
throw new GradleException(clearDataCommand.join(" "))
}
}
}
}
// Clear Application Data (once) before running instrumentation test
tasks.whenTaskAdded { task ->
// Both of these targets are equivalent today, although in future connectedCheck
// will also include connectedUiAutomatorTest (not implemented yet)
if(task.name == "connectedAndroidTest" || task.name == "connectedCheck"){
task.dependsOn(clearMainAppData)
}
}
*/
printf('--------------\n')
printf('isMaster: %s\n', isMaster().toString())
printf('gitAvailable: %s\n', gitAvailable().toString())
printf('allCommitted: %s\n', allCommitted().toString())
printf('--------------\n')
if (isMaster() && !gitAvailable()) {
throw new GradleException('GIT system is not available. On Windows try to run Android Studio as an Administrator. Check if GIT is installed and Studio have permissions to use it')
}
if (isMaster() && !allCommitted()) {
throw new GradleException('There are uncommitted changes. Clone sources again as described in wiki and do not allow gradle update')
}

234
app/build.gradle.kts Normal file
View file

@ -0,0 +1,234 @@
import java.io.ByteArrayOutputStream
import java.text.SimpleDateFormat
import java.util.Date
plugins {
id("com.android.application")
id("kotlin-android")
id("kotlin-kapt")
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
id("android-app-dependencies")
id("test-app-dependencies")
id("jacoco-app-dependencies")
}
repositories {
mavenCentral()
google()
}
fun generateGitBuild(): String {
val stringBuilder: StringBuilder = StringBuilder()
try {
val stdout = ByteArrayOutputStream()
exec {
commandLine("git", "describe", "--always")
standardOutput = stdout
}
val commitObject = stdout.toString().trim()
stringBuilder.append(commitObject)
} catch (ignored: Exception) {
stringBuilder.append("NoGitSystemAvailable")
}
return stringBuilder.toString()
}
fun generateGitRemote(): String {
val stringBuilder: StringBuilder = StringBuilder()
try {
val stdout = ByteArrayOutputStream()
exec {
commandLine("git", "remote", "get-url", "origin")
standardOutput = stdout
}
val commitObject: String = stdout.toString().trim()
stringBuilder.append(commitObject)
} catch (ignored: Exception) {
stringBuilder.append("NoGitSystemAvailable")
}
return stringBuilder.toString()
}
fun generateDate(): String {
val stringBuilder: StringBuilder = StringBuilder()
// showing only date prevents app to rebuild everytime
stringBuilder.append(SimpleDateFormat("yyyy.MM.dd").format(Date()))
return stringBuilder.toString()
}
fun isMaster(): Boolean = !Versions.appVersion.contains("-")
fun gitAvailable(): Boolean {
val stringBuilder: StringBuilder = StringBuilder()
try {
val stdout = ByteArrayOutputStream()
exec {
commandLine("git", "--version")
standardOutput = stdout
}
val commitObject = stdout.toString().trim()
stringBuilder.append(commitObject)
} catch (ignored: Exception) {
return false // NoGitSystemAvailable
}
return stringBuilder.toString().isNotEmpty()
}
fun allCommitted(): Boolean {
val stringBuilder: StringBuilder = StringBuilder()
try {
val stdout = ByteArrayOutputStream()
exec {
commandLine("git", "status", "-s")
standardOutput = stdout
}
// ignore all changes done in .idea/codeStyles
val cleanedList: String = stdout.toString().replace("/(?m)^\\s*(M|A|D|\\?\\?)\\s*.*?\\.idea\\/codeStyles\\/.*?\\s*\$/", "")
// ignore all files added to project dir but not staged/known to GIT
.replace("/(?m)^\\s*(\\?\\?)\\s*.*?\\s*\$/", "")
stringBuilder.append(cleanedList.trim())
} catch (ignored: Exception) {
return false // NoGitSystemAvailable
}
return stringBuilder.toString().isEmpty()
}
android {
namespace = "app.aaps"
ndkVersion = Versions.ndkVersion
defaultConfig {
minSdk = Versions.minSdk
targetSdk = Versions.targetSdk
buildConfigField("String", "VERSION", "\"$version\"")
buildConfigField("String", "BUILDVERSION", "\"${generateGitBuild()}-${generateDate()}\"")
buildConfigField("String", "REMOTE", "\"${generateGitRemote()}\"")
buildConfigField("String", "HEAD", "\"${generateGitBuild()}\"")
buildConfigField("String", "COMMITTED", "\"${allCommitted()}\"")
}
flavorDimensions.add("standard")
productFlavors {
create("full") {
isDefault = true
applicationId = "info.nightscout.androidaps"
dimension = "standard"
resValue("string", "app_name", "AAPS")
versionName = Versions.appVersion
manifestPlaceholders["appIcon"] = "@mipmap/ic_launcher"
manifestPlaceholders["appIconRound"] = "@mipmap/ic_launcher_round"
}
create("pumpcontrol") {
applicationId = "info.nightscout.aapspumpcontrol"
dimension = "standard"
resValue("string", "app_name", "Pumpcontrol")
versionName = Versions.appVersion + "-pumpcontrol"
manifestPlaceholders["appIcon"] = "@mipmap/ic_pumpcontrol"
manifestPlaceholders["appIconRound"] = "@null"
}
create("aapsclient") {
applicationId = "info.nightscout.aapsclient"
dimension = "standard"
resValue("string", "app_name", "AAPSClient")
versionName = Versions.appVersion + "-aapsclient"
manifestPlaceholders["appIcon"] = "@mipmap/ic_yellowowl"
manifestPlaceholders["appIconRound"] = "@mipmap/ic_yellowowl"
}
create("aapsclient2") {
applicationId = "info.nightscout.aapsclient2"
dimension = "standard"
resValue("string", "app_name", "AAPSClient2")
versionName = Versions.appVersion + "-aapsclient"
manifestPlaceholders["appIcon"] = "@mipmap/ic_blueowl"
manifestPlaceholders["appIconRound"] = "@mipmap/ic_blueowl"
}
}
useLibrary("org.apache.http.legacy")
//Deleting it causes a binding error
buildFeatures {
dataBinding = true
}
}
allprojects {
repositories {
}
}
dependencies {
wearApp(project(":wear"))
// in order to use internet"s versions you"d need to enable Jetifier again
// https://github.com/nightscout/graphview.git
// https://github.com/nightscout/iconify.git
implementation(project(":shared:impl"))
implementation(project(":core:main"))
implementation(project(":core:graphview"))
implementation(project(":core:interfaces"))
implementation(project(":core:libraries"))
implementation(project(":core:nssdk"))
implementation(project(":core:utils"))
implementation(project(":core:ui"))
implementation(project(":core:validators"))
implementation(project(":ui"))
implementation(project(":plugins:aps"))
implementation(project(":plugins:automation"))
implementation(project(":plugins:configuration"))
implementation(project(":plugins:constraints"))
implementation(project(":plugins:insulin"))
implementation(project(":plugins:main"))
implementation(project(":plugins:sensitivity"))
implementation(project(":plugins:smoothing"))
implementation(project(":plugins:source"))
implementation(project(":plugins:sync"))
implementation(project(":implementation"))
implementation(project(":database:entities"))
implementation(project(":database:impl"))
implementation(project(":pump:combo"))
implementation(project(":pump:combov2"))
implementation(project(":pump:dana"))
implementation(project(":pump:danars"))
implementation(project(":pump:danar"))
implementation(project(":pump:diaconn"))
implementation(project(":pump:eopatch"))
implementation(project(":pump:medtrum"))
implementation(project(":insight"))
implementation(project(":pump:medtronic"))
implementation(project(":pump:pump-common"))
implementation(project(":pump:omnipod-common"))
implementation(project(":pump:omnipod-eros"))
implementation(project(":pump:omnipod-dash"))
implementation(project(":pump:rileylink"))
implementation(project(":pump:virtual"))
implementation(project(":workflow"))
testImplementation(project(":shared:tests"))
/* Dagger2 - We are going to use dagger.android which includes
* support for Activity and fragment injection so we need to include
* the following dependencies */
kapt(Libs.Dagger.androidProcessor)
kapt(Libs.Dagger.compiler)
// MainApp
api(Libs.Rx.rxDogTag)
}
println("-------------------")
println("isMaster: ${isMaster()}")
println("gitAvailable: ${gitAvailable()}")
println("allCommitted: ${allCommitted()}")
println("-------------------")
if (isMaster() && !gitAvailable()) {
throw GradleException("GIT system is not available. On Windows try to run Android Studio as an Administrator. Check if GIT is installed and Studio have permissions to use it")
}
if (isMaster() && !allCommitted()) {
throw GradleException("There are uncommitted changes. Clone sources again as described in wiki and do not allow gradle update")
}

View file

@ -205,7 +205,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
}
R.id.nav_about -> {
var message = "Build: ${BuildConfig.BUILDVERSION}\n"
var message = "Build: ${config.BUILD_VERSION}\n"
message += "Flavor: ${BuildConfig.FLAVOR}${BuildConfig.BUILD_TYPE}\n"
message += "${rh.gs(app.aaps.plugins.configuration.R.string.configbuilder_nightscoutversion_label)} ${activePlugin.activeNsClient?.detectedNsVersion() ?: rh.gs(app.aaps.plugins.main.R.string.not_available_full)}"
if (config.isEngineeringMode()) message += "\n${rh.gs(app.aaps.plugins.configuration.R.string.engineering_mode_enabled)}"
@ -215,7 +215,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
val messageSpanned = SpannableString(message)
Linkify.addLinks(messageSpanned, Linkify.WEB_URLS)
MaterialAlertDialogBuilder(this@MainActivity, app.aaps.core.ui.R.style.DialogTheme)
.setTitle(rh.gs(R.string.app_name) + " " + BuildConfig.VERSION)
.setTitle(rh.gs(R.string.app_name) + " " + config.VERSION)
.setIcon(iconsProvider.getIcon())
.setMessage(messageSpanned)
.setPositiveButton(rh.gs(app.aaps.core.ui.R.string.ok), null)
@ -448,16 +448,16 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
if (!fabricPrivacy.fabricEnabled()) return
val closedLoopEnabled = if (constraintChecker.isClosedLoopAllowed().value()) "CLOSED_LOOP_ENABLED" else "CLOSED_LOOP_DISABLED"
// Size is limited to 36 chars
val remote = BuildConfig.REMOTE.lowercase(Locale.getDefault())
val remote = config.REMOTE.lowercase(Locale.getDefault())
.replace("https://", "")
.replace("http://", "")
.replace(".git", "")
.replace(".com/", ":")
.replace(".org/", ":")
.replace(".net/", ":")
fabricPrivacy.firebaseAnalytics.setUserProperty("Mode", BuildConfig.APPLICATION_ID + "-" + closedLoopEnabled)
fabricPrivacy.firebaseAnalytics.setUserProperty("Mode", config.APPLICATION_ID + "-" + closedLoopEnabled)
fabricPrivacy.firebaseAnalytics.setUserProperty("Language", sp.getString(app.aaps.core.ui.R.string.key_language, Locale.getDefault().language))
fabricPrivacy.firebaseAnalytics.setUserProperty("Version", BuildConfig.VERSION)
fabricPrivacy.firebaseAnalytics.setUserProperty("Version", config.VERSION_NAME)
fabricPrivacy.firebaseAnalytics.setUserProperty("HEAD", BuildConfig.HEAD)
fabricPrivacy.firebaseAnalytics.setUserProperty("Remote", remote)
val hashes: List<String> = signatureVerifierPlugin.shortHashes()
@ -471,9 +471,9 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
activePlugin.activeInsulin.let { fabricPrivacy.firebaseAnalytics.setUserProperty("Insulin", it::class.java.simpleName) }
// Add to crash log too
FirebaseCrashlytics.getInstance().setCustomKey("HEAD", BuildConfig.HEAD)
FirebaseCrashlytics.getInstance().setCustomKey("Version", BuildConfig.VERSION)
FirebaseCrashlytics.getInstance().setCustomKey("BuildType", BuildConfig.BUILD_TYPE)
FirebaseCrashlytics.getInstance().setCustomKey("BuildFlavor", BuildConfig.FLAVOR)
FirebaseCrashlytics.getInstance().setCustomKey("Version", config.VERSION_NAME)
FirebaseCrashlytics.getInstance().setCustomKey("BuildType", config.BUILD_TYPE)
FirebaseCrashlytics.getInstance().setCustomKey("BuildFlavor", config.FLAVOR)
FirebaseCrashlytics.getInstance().setCustomKey("Remote", remote)
FirebaseCrashlytics.getInstance().setCustomKey("Committed", BuildConfig.COMMITTED)
FirebaseCrashlytics.getInstance().setCustomKey("Hash", hashes[0])

View file

@ -100,7 +100,7 @@ class MainApp : DaggerApplication() {
setRxErrorHandler()
LocaleHelper.update(this@MainApp)
var gitRemote: String? = BuildConfig.REMOTE
var gitRemote: String? = config.REMOTE
var commitHash: String? = BuildConfig.HEAD
if (gitRemote?.contains("NoGitSystemAvailable") == true) {
gitRemote = null
@ -109,9 +109,9 @@ class MainApp : DaggerApplication() {
disposable += compatDBHelper.dbChangeDisposable()
registerActivityLifecycleCallbacks(activityMonitor)
runOnUiThread { themeSwitcherPlugin.setThemeMode() }
aapsLogger.debug("Version: " + BuildConfig.VERSION_NAME)
aapsLogger.debug("BuildVersion: " + BuildConfig.BUILDVERSION)
aapsLogger.debug("Remote: " + BuildConfig.REMOTE)
aapsLogger.debug("Version: " + config.VERSION_NAME)
aapsLogger.debug("BuildVersion: " + config.BUILD_VERSION)
aapsLogger.debug("Remote: " + config.REMOTE)
registerLocalBroadcastReceiver()
// trigger here to see the new version on app start after an update
@ -128,7 +128,7 @@ class MainApp : DaggerApplication() {
if (config.isDev() && sp.getStringOrNull(app.aaps.core.utils.R.string.key_email_for_crash_report, null).isNullOrBlank())
notificationStore.add(Notification(Notification.IDENTIFICATION_NOT_SET, rh.get().gs(R.string.identification_not_set), Notification.INFO))
// log version
disposable += repository.runTransaction(VersionChangeTransaction(BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE, gitRemote, commitHash)).subscribe()
disposable += repository.runTransaction(VersionChangeTransaction(config.VERSION_NAME, BuildConfig.VERSION_CODE, gitRemote, commitHash)).subscribe()
// log app start
if (sp.getBoolean(app.aaps.plugins.sync.R.string.key_ns_log_app_started_event, config.APS))
disposable += repository

View file

@ -47,8 +47,8 @@ class ConfigImpl @Inject constructor(
engineeringMode = engineeringModeSemaphore.exists() && engineeringModeSemaphore.isFile
unfinishedMode = unfinishedModeSemaphore.exists() && unfinishedModeSemaphore.isFile
devBranch = BuildConfig.VERSION.contains("-") || BuildConfig.VERSION.matches(Regex(".*[a-zA-Z]+.*"))
if (BuildConfig.VERSION.contains("-beta") || BuildConfig.VERSION.contains("-rc"))
devBranch = VERSION.contains("-") || VERSION.matches(Regex(".*[a-zA-Z]+.*"))
if (VERSION.contains("-beta") || VERSION.contains("-rc"))
devBranch = false
}

View file

@ -1,127 +0,0 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
kotlin_version = '1.9.10'
core_version = '1.12.0'
rxjava_version = '3.1.7'
rxandroid_version = '3.0.2'
rxkotlin_version = '3.0.1'
room_version = '2.5.2'
lifecycle_version = '2.6.2'
dagger_version = '2.48.1'
coroutines_version = '1.7.3'
activity_version = '1.8.0'
fragmentktx_version = '1.6.1'
ormLite_version = '4.46'
gson_version = '2.10.1'
nav_version = '2.7.4'
appcompat_version = '1.6.1'
material_version = '1.10.0'
gridlayout_version = '1.0.0'
constraintlayout_version = '2.1.4'
preferencektx_version = '1.2.1'
commonslang3_version = '3.13.0'
commonscodec_version = '1.16.0'
guava_version = '32.1.3-jre'
jodatime_version = '2.12.5'
work_version = '2.8.1'
tink_version = '1.10.0'
json_version = '20230618'
joda_version = '2.12.5'
swipe_version = '1.1.0'
junit_version = '4.13.2'
junit_jupiter_version = '5.10.0'
mockito_version = '5.6.0'
dexmaker_version = '1.2'
retrofit2_version = '2.9.0'
okhttp3_version = '4.12.0'
byteBuddy_version = '1.12.8'
androidx_junit_version = '1.1.5'
androidx_rules_version = '1.5.0'
rxandroidble_version = '1.12.1'
replayshare_version = '2.2.0'
wearable_version = '2.9.0'
play_services_wearable_version = '18.1.0'
play_services_location_version = '21.0.1'
play_services_measurement_version = '21.4.0'
kotlinx_datetime_version = '0.4.1'
kotlinx_serialization_version = '1.6.0'
caverock_androidsvg_version = '1.4'
}
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.1.2'
classpath 'com.google.gms:google-services:4.4.0'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath "org.jacoco:org.jacoco.core:0.8.11"
classpath "com.vanniktech:gradle-dependency-graph-generator-plugin:0.8.0"
}
}
plugins {
// Test Gradle build, keep disabled under normal circumstances
// id "com.osacky.doctor" version "0.8.1"
id "org.jlleitschuh.gradle.ktlint" version "11.6.1"
// Aggregates and/or logs Jacoco test coverage to the Gradle build log
//id 'org.barfuin.gradle.jacocolog' version '3.1.0'
id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false
}
allprojects {
repositories {
google()
mavenCentral()
maven { url "https://maven.google.com" }
maven { url 'https://jitpack.io' }
}
tasks.withType(KotlinCompile).all {
kotlinOptions {
freeCompilerArgs = [
'-opt-in=kotlin.RequiresOptIn',
'-opt-in=kotlin.ExperimentalUnsignedTypes',
'-Xjvm-default=all' //Support @JvmDefault
]
jvmTarget = "11"
}
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
}
apply plugin: 'org.jlleitschuh.gradle.ktlint'
apply plugin: 'jacoco'
}
// Setup all al reports aggregation
apply from: 'jacoco_project.gradle'
task clean(type: Delete) {
delete rootProject.buildDir
}
subprojects {
tasks.withType(Test) {
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
}
}

62
build.gradle.kts Normal file
View file

@ -0,0 +1,62 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath("com.android.tools.build:gradle:8.1.2")
classpath("com.google.gms:google-services:4.4.0")
classpath("com.google.firebase:firebase-crashlytics-gradle:2.9.9")
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath(kotlin("gradle-plugin", version = Libs.Kotlin.kotlin))
classpath(kotlin("allopen", version = Libs.Kotlin.kotlin))
classpath(kotlin("serialization", version = Libs.Kotlin.kotlin))
}
}
plugins {
id("org.jlleitschuh.gradle.ktlint") version "11.6.1"
}
allprojects {
repositories {
google()
mavenCentral()
maven("https://maven.google.com")
maven("https://jitpack.io")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf(
"-opt-in=kotlin.RequiresOptIn",
"-opt-in=kotlin.ExperimentalUnsignedTypes",
"-Xjvm-default=all" //Support @JvmDefault
)
jvmTarget = "11"
}
}
gradle.projectsEvaluated {
tasks.withType<JavaCompile> {
val compilerArgs = options.compilerArgs
compilerArgs.add("-Xlint:deprecation")
compilerArgs.add("-Xlint:unchecked")
}
}
apply(plugin = "org.jlleitschuh.gradle.ktlint")
apply(plugin = "jacoco")
}
// Setup all reports aggregation
apply(from = "jacoco_aggregation.gradle.kts")
tasks.register<Delete>("clean").configure {
delete(rootProject.buildDir)
}

22
buildSrc/build.gradle.kts Normal file
View file

@ -0,0 +1,22 @@
object KtsBuildVersions {
const val gradle = "8.1.2"
const val kotlin = "1.9.0"
}
plugins {
`kotlin-dsl`
`kotlin-dsl-precompiled-script-plugins`
}
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
dependencies {
implementation("com.android.tools.build:gradle:${KtsBuildVersions.gradle}")
implementation(kotlin("gradle-plugin", version = KtsBuildVersions.kotlin))
implementation(kotlin("allopen", version = KtsBuildVersions.kotlin))
}

View file

@ -0,0 +1,215 @@
@Suppress("SpellCheckingInspection")
object Libs {
object Kotlin {
const val kotlin = "1.9.10"
const val stdlibJdk8 = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin"
const val reflect = "org.jetbrains.kotlin:kotlin-reflect:$kotlin"
}
object KotlinX {
private const val serialization = "1.6.0"
private const val coroutinesVersion = "1.7.3"
const val serializationJson = "org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization"
const val serializationProtobuf = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$serialization"
const val serializationCore = "org.jetbrains.kotlinx:kotlinx-serialization-core:$serialization"
const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
const val coroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
const val coroutinesRx3 = "org.jetbrains.kotlinx:kotlinx-coroutines-rx3:$coroutinesVersion"
const val coroutinesGuava = "org.jetbrains.kotlinx:kotlinx-coroutines-guava:$coroutinesVersion"
const val coroutinesPlayServices = "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$coroutinesVersion"
const val coroutinesTest = "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion"
const val datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.4.1"
}
object AndroidX {
const val core = "androidx.core:core-ktx:1.12.0"
const val appCompat = "androidx.appcompat:appcompat:1.6.1"
const val activity = "androidx.activity:activity-ktx:1.8.0"
const val preference = "androidx.preference:preference-ktx:1.2.1"
const val constraintLayout = "androidx.constraintlayout:constraintlayout:2.1.4"
const val swipeRefreshLayout = "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
const val gridLayout = "androidx.gridlayout:gridlayout:1.0.0"
const val browser = "androidx.browser:browser:1.6.0"
const val lifecycleViewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2"
const val fragment = "androidx.fragment:fragment-ktx:1.6.1"
const val navigationFragment = "androidx.navigation:navigation-fragment-ktx:2.7.4"
const val legacySupport = "androidx.legacy:legacy-support-v13:1.0.0"
object Work {
private const val workVersion = "2.8.1"
const val runtimeKtx = "androidx.work:work-runtime-ktx:$workVersion"
const val testing = "androidx.work:work-testing:$workVersion"
}
object Test {
const val espressoCore = "androidx.test.espresso:espresso-core:3.5.1"
const val extKtx = "androidx.test.ext:junit-ktx:1.1.5"
const val rules = "androidx.test:rules:1.5.0"
const val uiAutomator = "androidx.test.uiautomator:uiautomator:2.2.0"
}
object Room {
private const val roomVersion = "2.5.2"
const val room = "androidx.room:room-ktx:$roomVersion"
const val compiler = "androidx.room:room-compiler:$roomVersion"
const val runtime = "androidx.room:room-runtime:$roomVersion"
const val rxJava3 = "androidx.room:room-rxjava3:$roomVersion"
const val testing = "androidx.room:room-testing:$roomVersion"
}
object Wear {
const val wear = "androidx.wear:wear:1.3.0"
const val tiles = "androidx.wear.tiles:tiles:1.2.0"
}
const val biometric = "androidx.biometric:biometric:1.1.0"
const val media3 = "androidx.media3:media3-common:1.1.1"
}
object Google {
object Android {
object PlayServices {
const val measurementApi = "com.google.android.gms:play-services-measurement-api:21.4.0"
const val wearable = "com.google.android.gms:play-services-wearable:18.1.0"
const val location = "com.google.android.gms:play-services-location:21.0.1"
}
object Wearable {
const val wearable = "com.google.android.wearable:wearable:2.9.0"
const val wearableSupport = "com.google.android.support:wearable:2.9.0"
}
const val material = "com.google.android.material:material:1.10.0"
const val flexbox = "com.google.android.flexbox:flexbox:3.0.0"
}
object Firebase {
const val firebaseBom = "com.google.firebase:firebase-bom:32.4.0"
const val analytics = "com.google.firebase:firebase-analytics-ktx"
const val crashlytics = "com.google.firebase:firebase-crashlytics-ktx"
const val messaging = "com.google.firebase:firebase-messaging-ktx"
const val auth = "com.google.firebase:firebase-auth-ktx"
const val database = "com.google.firebase:firebase-database-ktx"
}
const val truth = "com.google.truth:truth:1.1.5"
const val gson = "com.google.code.gson:gson:2.10.1"
const val guava = "com.google.guava:guava:32.1.3-jre"
const val tinkAndroid = "com.google.crypto.tink:tink-android:1.10.0"
}
object Dagger {
private const val version = "2.48.1"
const val dagger = "com.google.dagger:dagger:$version"
const val android = "com.google.dagger:dagger-android:$version"
const val androidProcessor = "com.google.dagger:dagger-android-processor:$version"
const val androidSupport = "com.google.dagger:dagger-android-support:$version"
const val compiler = "com.google.dagger:dagger-compiler:$version"
}
object Rx {
const val rxDogTag = "com.uber.rxdogtag2:rxdogtag:2.0.2"
const val rxJava = "io.reactivex.rxjava3:rxjava:3.1.7"
const val rxKotlin = "io.reactivex.rxjava3:rxkotlin:3.0.1"
const val rxAndroid = "io.reactivex.rxjava3:rxandroid:3.0.2"
}
object Apache {
const val commonsLang3 = "org.apache.commons:commons-lang3:3.13.0"
}
object Logging {
const val slf4jApi = "org.slf4j:slf4j-api:1.7.36" // 2.0.x breaks logging. Code change needed
const val logbackAndroid = "com.github.tony19:logback-android:2.0.0"
}
object JUnit {
private const val junitVersion = "5.10.0"
const val jupiter = "org.junit.jupiter:junit-jupiter:$junitVersion"
const val jupiterApi = "org.junit.jupiter:junit-jupiter-api:$junitVersion"
const val jupiterEngine = "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
}
object Mockito {
const val jupiter = "org.mockito:mockito-junit-jupiter:5.6.0"
const val kotlin = "org.mockito.kotlin:mockito-kotlin:5.1.0"
}
object Squareup {
object Retrofit2 {
private const val retrofitVersion = "2.9.0"
const val retrofit = "com.squareup.retrofit2:retrofit:$retrofitVersion"
const val adapterRxJava3 = "com.squareup.retrofit2:adapter-rxjava3:$retrofitVersion"
const val converterGson = "com.squareup.retrofit2:converter-gson:$retrofitVersion"
}
object Okhttp3 {
private const val okhttpVersion = "4.12.0"
const val okhttp = "com.squareup.okhttp3:okhttp:$okhttpVersion"
const val loggingInterceptor = "com.squareup.okhttp3:logging-interceptor:$okhttpVersion"
}
}
object Mozilla {
const val rhino = "org.mozilla:rhino:1.7.14"
}
const val spongycastleCore = "com.madgag.spongycastle:core:1.58.0.0"
const val androidSvg = "com.caverock:androidsvg:1.4"
const val jodaTimeAndroid = "net.danlew:android.joda:2.12.5"
const val jodaTime = "joda-time:joda-time:2.12.5"
const val json = "org.json:json:20230618"
const val jsonAssert = "org.skyscreamer:jsonassert:1.5.0"
const val rootBeer = "com.scottyab:rootbeer-lib:0.1.0"
const val javaOtp = "com.eatthepath:java-otp:0.4.0"
const val qrGen = "com.github.kenglxn.QRGen:android:3.0.1"
const val socketIo = "io.socket:socket.io-client:2.1.0"
const val kotlinTestRunner = "io.kotlintest:kotlintest-runner-junit5:3.4.2"
const val rxandroidBle = "com.polidea.rxandroidble3:rxandroidble:1.17.2"
const val rx3ReplayingShare = "com.jakewharton.rx3:replaying-share:3.0.0"
const val commonCodecs = "commons-codec:commons-codec:1.16.0"
const val kulid = "com.github.guepardoapps:kulid:2.0.0.0"
const val xstream = "com.thoughtworks.xstream:xstream:1.4.20"
const val ormLite = "4.46"
const val junit = "4.13.2"
const val mockito = "5.6.0"
const val dexmaker = "1.2"
const val byteBuddy = "1.12.8"
const val androidx_junit = "1.1.5"
const val androidx_rules = "1.5.0"
const val kotlinx_datetime = "0.4.1"
const val kotlinx_serialization = "1.6.0"
const val caverock_androidsvg = "1.4"
}

View file

@ -0,0 +1,18 @@
import org.gradle.api.JavaVersion
object Versions {
const val appVersion = "3.2.0.1-dev"
const val versionCode = 1500
const val ndkVersion = "21.1.6352462"
const val compileSdk = 34
const val minSdk = 28
const val targetSdk = 28
const val wearMinSdk = 26
const val wearTargetSdk = 29
val javaVersion = JavaVersion.VERSION_11
const val jacoco = "0.8.11"
}

View file

@ -0,0 +1,9 @@
plugins {
id("com.android.library")
id("kotlin-allopen")
}
allOpen {
// allows mocking for classes w/o directly opening them for release builds
annotation("app.aaps.annotations.OpenForTesting")
}

View file

@ -0,0 +1,41 @@
plugins {
id("com.android.application")
id("kotlin-android")
}
android {
compileSdk = Versions.compileSdk
defaultConfig {
multiDexEnabled = true
versionCode = Versions.versionCode
version = Versions.appVersion
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildFeatures {
viewBinding = true
}
buildTypes {
named("release") {
isMinifyEnabled = false
setProguardFiles(listOf(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"))
}
named("debug") {
enableUnitTestCoverage = true
enableAndroidTestCoverage = true
}
}
compileOptions {
sourceCompatibility = Versions.javaVersion
targetCompatibility = Versions.javaVersion
}
lint {
checkReleaseBuilds = false
disable += "MissingTranslation"
disable += "ExtraTranslation"
}
}

View file

@ -0,0 +1,66 @@
plugins {
id("com.android.library")
id("kotlin-android")
}
android {
compileSdk = Versions.compileSdk
defaultConfig {
minSdk = Versions.minSdk
@Suppress("DEPRECATION")
targetSdk = Versions.targetSdk
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
named("release") {
isMinifyEnabled = false
setProguardFiles(listOf(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"))
}
named("debug") {
enableUnitTestCoverage = true
enableAndroidTestCoverage = true
}
}
sourceSets {
named("main") {
jniLibs.srcDirs(listOf("src/main/jniLibs"))
}
}
compileOptions {
sourceCompatibility = Versions.javaVersion
targetCompatibility = Versions.javaVersion
}
lint {
checkReleaseBuilds = false
disable += "MissingTranslation"
disable += "ExtraTranslation"
}
flavorDimensions.add("standard")
productFlavors {
create("full") {
isDefault = true
dimension = "standard"
}
create("pumpcontrol") {
dimension = "standard"
}
create("aapsclient") {
dimension = "standard"
}
create("aapsclient2") {
dimension = "standard"
}
}
buildFeatures {
// disable for modules here
buildConfig = false
viewBinding = true
}
}

View file

@ -0,0 +1,207 @@
import groovy.xml.XmlSlurper
import groovy.xml.slurpersupport.NodeChild
import java.io.File
import java.util.Locale
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.extra
import org.gradle.kotlin.dsl.register
import org.gradle.testing.jacoco.tasks.JacocoReport
import kotlin.math.roundToInt
plugins {
id("com.android.application")
id("jacoco")
}
private val limits = mutableMapOf(
"instruction" to 0.0,
"branch" to 0.0,
"line" to 0.0,
"complexity" to 0.0,
"method" to 0.0,
"class" to 0.0
)
extra.set("limits", limits)
dependencies {
"implementation"("org.jacoco:org.jacoco.core:${Versions.jacoco}")
}
project.afterEvaluate {
val buildTypes = android.buildTypes.map { type -> type.name }
var productFlavors = android.productFlavors.map { flavor -> flavor.name }
if (productFlavors.isEmpty()) {
productFlavors = productFlavors + ""
}
productFlavors.forEach { flavorName ->
buildTypes.forEach { buildTypeName ->
val sourceName: String
val sourcePath: String
if (flavorName.isEmpty()) {
sourceName = buildTypeName
sourcePath = buildTypeName
} else {
sourceName = "${flavorName}${buildTypeName.replaceFirstChar(Char::titlecase)}"
sourcePath = "${flavorName}/${buildTypeName}"
}
val testTaskName = "test${sourceName.replaceFirstChar(Char::titlecase)}UnitTest"
//println("Task -> $testTaskName")
registerCodeCoverageTask(
testTaskName = testTaskName,
sourceName = sourceName,
sourcePath = sourcePath,
flavorName = flavorName,
buildTypeName = buildTypeName
)
}
}
}
val excludedFiles = mutableSetOf(
// data binding
"android/databinding/**/*.class",
"**/android/databinding/*Binding.class",
"**/android/databinding/*",
"**/androidx/databinding/*",
"**/BR.*",
// android
"**/R.class",
"**/R$*.class",
"**/BuildConfig.*",
"**/Manifest*.*",
"**/*Test*.*",
"android/**/*.*",
// kotlin
"**/*MapperImpl*.*",
"**/*\$ViewInjector*.*",
"**/*\$ViewBinder*.*",
"**/BuildConfig.*",
"**/*Component*.*",
"**/*BR*.*",
"**/Manifest*.*",
"**/*\$Lambda\$*.*",
"**/*Companion*.*",
"**/*Module*.*",
"**/*Dagger*.*",
"**/*Hilt*.*",
"**/*MembersInjector*.*",
"**/*_MembersInjector.class",
"**/*_Factory*.*",
"**/*_Provide*Factory*.*",
"**/*Extensions*.*",
// sealed and data classes
"**/*\$Result.*",
"**/*\$Result\$*.*",
// adapters generated by moshi
"**/*JsonAdapter.*"
)
fun Project.registerCodeCoverageTask(
testTaskName: String,
sourceName: String,
sourcePath: String,
flavorName: String,
buildTypeName: String
) {
tasks.register<JacocoReport>("${testTaskName}Coverage") {
dependsOn(testTaskName)
group = "Reporting"
description = "Generate Jacoco coverage reports on the ${sourceName.replaceFirstChar(Char::titlecase)} build."
val javaDirectories = fileTree(
"${project.buildDir}/intermediates/classes/${sourcePath}"
) { exclude(excludedFiles) }
val kotlinDirectories = fileTree(
"${project.buildDir}/tmp/kotlin-classes/${sourcePath}"
) { exclude(excludedFiles) }
val coverageSrcDirectories = listOf(
"src/main/java",
"src/main/kotlin",
"src/$flavorName/java",
"src/$flavorName/kotlin",
"src/$buildTypeName/java",
"src/$buildTypeName/kotlin"
)
classDirectories.setFrom(files(javaDirectories, kotlinDirectories))
additionalClassDirs.setFrom(files(coverageSrcDirectories))
sourceDirectories.setFrom(files(coverageSrcDirectories))
executionData.setFrom(
files("${project.buildDir}/jacoco/${testTaskName}.exec")
)
reports {
xml.required.set(true)
html.required.set(true)
}
doLast {
jacocoTestReport("${testTaskName}Coverage")
}
}
}
@Suppress("UNCHECKED_CAST")
fun Project.jacocoTestReport(testTaskName: String) {
val reportsDirectory = jacoco.reportsDirectory.asFile.get()
val report = file("$reportsDirectory/${testTaskName}/${testTaskName}.xml")
logger.lifecycle("Checking coverage results: $report")
val metrics = report.extractTestsCoveredByType()
val limits = project.extra["limits"] as Map<String, Double>
val failures = metrics.filter { entry ->
entry.value < limits[entry.key]!!
}.map { entry ->
"- ${entry.key} coverage rate is: ${entry.value}%, minimum is ${limits[entry.key]}%"
}
if (failures.isNotEmpty()) {
logger.quiet("------------------ Code Coverage Failed -----------------------")
failures.forEach { logger.quiet(it) }
logger.quiet("---------------------------------------------------------------")
throw GradleException("Code coverage failed")
}
logger.quiet("------------------ Code Coverage Success -----------------------")
metrics.forEach { entry ->
logger.quiet("- ${entry.key} coverage rate is: ${entry.value}%")
}
logger.quiet("---------------------------------------------------------------")
}
@Suppress("UNCHECKED_CAST")
fun File.extractTestsCoveredByType(): Map<String, Double> {
val xmlReader = XmlSlurper().apply {
setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)
}
val counterNodes: List<NodeChild> = xmlReader
.parse(this).parent()
.children()
.filter {
(it as NodeChild).name() == "counter"
} as List<NodeChild>
return counterNodes.associate { nodeChild ->
val type = nodeChild.attributes()["type"].toString().lowercase(Locale.ENGLISH)
val covered = nodeChild.attributes()["covered"].toString().toDouble()
val missed = nodeChild.attributes()["missed"].toString().toDouble()
val percentage = ((covered / (covered + missed)) * 10000.0).roundToInt() / 100.0
Pair(type, percentage)
}
}

View file

@ -0,0 +1,207 @@
import groovy.xml.XmlSlurper
import groovy.xml.slurpersupport.NodeChild
import java.io.File
import java.util.Locale
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.extra
import org.gradle.kotlin.dsl.register
import org.gradle.testing.jacoco.tasks.JacocoReport
import kotlin.math.roundToInt
plugins {
id("com.android.library")
id("jacoco")
}
private val limits = mutableMapOf(
"instruction" to 0.0,
"branch" to 0.0,
"line" to 0.0,
"complexity" to 0.0,
"method" to 0.0,
"class" to 0.0
)
extra.set("limits", limits)
dependencies {
"implementation"("org.jacoco:org.jacoco.core:${Versions.jacoco}")
}
project.afterEvaluate {
val buildTypes = android.buildTypes.map { type -> type.name }
var productFlavors = android.productFlavors.map { flavor -> flavor.name }
if (productFlavors.isEmpty()) {
productFlavors = productFlavors + ""
}
productFlavors.forEach { flavorName ->
buildTypes.forEach { buildTypeName ->
val sourceName: String
val sourcePath: String
if (flavorName.isEmpty()) {
sourceName = buildTypeName
sourcePath = buildTypeName
} else {
sourceName = "${flavorName}${buildTypeName.replaceFirstChar(Char::titlecase)}"
sourcePath = "${flavorName}/${buildTypeName}"
}
val testTaskName = "test${sourceName.replaceFirstChar(Char::titlecase)}UnitTest"
//println("Task -> $testTaskName")
registerCodeCoverageTask(
testTaskName = testTaskName,
sourceName = sourceName,
sourcePath = sourcePath,
flavorName = flavorName,
buildTypeName = buildTypeName
)
}
}
}
val excludedFiles = mutableSetOf(
// data binding
"android/databinding/**/*.class",
"**/android/databinding/*Binding.class",
"**/android/databinding/*",
"**/androidx/databinding/*",
"**/BR.*",
// android
"**/R.class",
"**/R$*.class",
"**/BuildConfig.*",
"**/Manifest*.*",
"**/*Test*.*",
"android/**/*.*",
// kotlin
"**/*MapperImpl*.*",
"**/*\$ViewInjector*.*",
"**/*\$ViewBinder*.*",
"**/BuildConfig.*",
"**/*Component*.*",
"**/*BR*.*",
"**/Manifest*.*",
"**/*\$Lambda\$*.*",
"**/*Companion*.*",
"**/*Module*.*",
"**/*Dagger*.*",
"**/*Hilt*.*",
"**/*MembersInjector*.*",
"**/*_MembersInjector.class",
"**/*_Factory*.*",
"**/*_Provide*Factory*.*",
"**/*Extensions*.*",
// sealed and data classes
"**/*\$Result.*",
"**/*\$Result\$*.*",
// adapters generated by moshi
"**/*JsonAdapter.*"
)
fun Project.registerCodeCoverageTask(
testTaskName: String,
sourceName: String,
sourcePath: String,
flavorName: String,
buildTypeName: String
) {
tasks.register<JacocoReport>("${testTaskName}Coverage") {
dependsOn(testTaskName)
group = "Reporting"
description = "Generate Jacoco coverage reports on the ${sourceName.replaceFirstChar(Char::titlecase)} build."
val javaDirectories = fileTree(
"${project.buildDir}/intermediates/classes/${sourcePath}"
) { exclude(excludedFiles) }
val kotlinDirectories = fileTree(
"${project.buildDir}/tmp/kotlin-classes/${sourcePath}"
) { exclude(excludedFiles) }
val coverageSrcDirectories = listOf(
"src/main/java",
"src/main/kotlin",
"src/$flavorName/java",
"src/$flavorName/kotlin",
"src/$buildTypeName/java",
"src/$buildTypeName/kotlin"
)
classDirectories.setFrom(files(javaDirectories, kotlinDirectories))
additionalClassDirs.setFrom(files(coverageSrcDirectories))
sourceDirectories.setFrom(files(coverageSrcDirectories))
executionData.setFrom(
files("${project.buildDir}/jacoco/${testTaskName}.exec")
)
reports {
xml.required.set(true)
html.required.set(true)
}
doLast {
jacocoTestReport("${testTaskName}Coverage")
}
}
}
@Suppress("UNCHECKED_CAST")
fun Project.jacocoTestReport(testTaskName: String) {
val reportsDirectory = jacoco.reportsDirectory.asFile.get()
val report = file("$reportsDirectory/${testTaskName}/${testTaskName}.xml")
logger.lifecycle("Checking coverage results: $report")
val metrics = report.extractTestsCoveredByType()
val limits = project.extra["limits"] as Map<String, Double>
val failures = metrics.filter { entry ->
entry.value < limits[entry.key]!!
}.map { entry ->
"- ${entry.key} coverage rate is: ${entry.value}%, minimum is ${limits[entry.key]}%"
}
if (failures.isNotEmpty()) {
logger.quiet("------------------ Code Coverage Failed -----------------------")
failures.forEach { logger.quiet(it) }
logger.quiet("---------------------------------------------------------------")
throw GradleException("Code coverage failed")
}
logger.quiet("------------------ Code Coverage Success -----------------------")
metrics.forEach { entry ->
logger.quiet("- ${entry.key} coverage rate is: ${entry.value}%")
}
logger.quiet("---------------------------------------------------------------")
}
@Suppress("UNCHECKED_CAST")
fun File.extractTestsCoveredByType(): Map<String, Double> {
val xmlReader = XmlSlurper().apply {
setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)
}
val counterNodes: List<NodeChild> = xmlReader
.parse(this).parent()
.children()
.filter {
(it as NodeChild).name() == "counter"
} as List<NodeChild>
return counterNodes.associate { nodeChild ->
val type = nodeChild.attributes()["type"].toString().lowercase(Locale.ENGLISH)
val covered = nodeChild.attributes()["covered"].toString().toDouble()
val missed = nodeChild.attributes()["missed"].toString().toDouble()
val percentage = ((covered / (covered + missed)) * 10000.0).roundToInt() / 100.0
Pair(type, percentage)
}
}

View file

@ -0,0 +1,62 @@
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
plugins {
id("com.android.application")
id("kotlin-android")
}
dependencies {
testImplementation(kotlin("test"))
testImplementation(Libs.JUnit.jupiter)
testImplementation(Libs.JUnit.jupiterApi)
testImplementation(Libs.json)
testImplementation(Libs.Mockito.jupiter)
testImplementation(Libs.Mockito.kotlin)
testImplementation(Libs.jodaTime)
testImplementation(Libs.Google.truth)
testImplementation(Libs.jsonAssert)
androidTestImplementation(Libs.AndroidX.Test.espressoCore)
androidTestImplementation(Libs.AndroidX.Test.extKtx)
androidTestImplementation(Libs.AndroidX.Test.rules)
androidTestImplementation(Libs.AndroidX.Test.uiAutomator)
androidTestImplementation(Libs.Google.truth)
}
tasks.withType<Test> {
// use to display stdout in travis
testLogging {
// set options for log level LIFECYCLE
events = setOf(
TestLogEvent.FAILED,
TestLogEvent.STARTED,
TestLogEvent.SKIPPED,
TestLogEvent.STANDARD_OUT
)
exceptionFormat = TestExceptionFormat.FULL
useJUnitPlatform()
}
}
tasks.withType<Test>().configureEach {
maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1)
forkEvery = 20
}
android {
testOptions {
unitTests {
isReturnDefaultValues = true
isIncludeAndroidResources = true
}
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
excludes += "META-INF/COPYRIGHT"
excludes += "META-INF/LICENSE.md"
excludes += "META-INF/LICENSE-notice.md"
}
}
}

View file

@ -0,0 +1,62 @@
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
plugins {
id("com.android.library")
id("kotlin-android")
}
dependencies {
testImplementation(kotlin("test"))
testImplementation(Libs.JUnit.jupiter)
testImplementation(Libs.JUnit.jupiterApi)
testImplementation(Libs.json)
testImplementation(Libs.Mockito.jupiter)
testImplementation(Libs.Mockito.kotlin)
testImplementation(Libs.jodaTime)
testImplementation(Libs.Google.truth)
testImplementation(Libs.jsonAssert)
androidTestImplementation(Libs.AndroidX.Test.espressoCore)
androidTestImplementation(Libs.AndroidX.Test.extKtx)
androidTestImplementation(Libs.AndroidX.Test.rules)
androidTestImplementation(Libs.Google.truth)
androidTestImplementation(Libs.AndroidX.Test.uiAutomator)
}
tasks.withType<Test> {
// use to display stdout in travis
testLogging {
// set options for log level LIFECYCLE
events = setOf(
TestLogEvent.FAILED,
TestLogEvent.STARTED,
TestLogEvent.SKIPPED,
TestLogEvent.STANDARD_OUT
)
exceptionFormat = TestExceptionFormat.FULL
useJUnitPlatform()
}
}
tasks.withType<Test>().configureEach {
maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1)
forkEvery = 20
}
android {
testOptions {
unitTests {
isReturnDefaultValues = true
isIncludeAndroidResources = true
}
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
excludes += "META-INF/COPYRIGHT"
excludes += "META-INF/LICENSE.md"
excludes += "META-INF/LICENSE-notice.md"
}
}
}

View file

@ -1,17 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
android {
namespace 'com.jjoe64.graphview'
}
dependencies {
api "androidx.core:core-ktx:$core_version"
}

View file

@ -0,0 +1,15 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("android-module-dependencies")
}
android {
namespace = "com.jjoe64.graphview"
}
dependencies {
api(Libs.AndroidX.core)
}

View file

@ -1,54 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
id 'kotlin-parcelize'
id 'kotlinx-serialization'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.core.interfaces'
defaultConfig {
minSdkVersion 26 // for wear
}
}
dependencies {
implementation project(':database:entities')
api "androidx.appcompat:appcompat:$appcompat_version"
api "androidx.preference:preference-ktx:$preferencektx_version"
api "net.danlew:android.joda:$joda_version"
api "com.google.dagger:dagger:$dagger_version"
api "com.google.dagger:dagger-android:$dagger_version"
api "com.google.dagger:dagger-android-support:$dagger_version"
//Logger
api 'org.slf4j:slf4j-api:1.7.36' // 2.0.x breaks logging. Code change needed
api 'com.github.tony19:logback-android:2.0.0'
api "com.google.android.gms:play-services-measurement-api:$play_services_measurement_version"
api "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinx_serialization_version"
api "org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$kotlinx_serialization_version"
api "com.caverock:androidsvg:$caverock_androidsvg_version"
api "org.apache.commons:commons-lang3:$commonslang3_version"
//RxBus
api "io.reactivex.rxjava3:rxjava:$rxjava_version"
api "io.reactivex.rxjava3:rxkotlin:$rxkotlin_version"
api "io.reactivex.rxjava3:rxandroid:$rxandroid_version"
// WorkerClasses
api "androidx.work:work-runtime-ktx:$work_version"
}

View file

@ -0,0 +1,52 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("kotlinx-serialization")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.core.interfaces"
defaultConfig {
minSdk = Versions.wearMinSdk // for wear
}
}
dependencies {
implementation(project(":database:entities"))
api(Libs.AndroidX.appCompat)
api(Libs.AndroidX.preference)
api(Libs.jodaTimeAndroid)
api(Libs.Dagger.androidSupport)
//Logger
api(Libs.Logging.slf4jApi)
api(Libs.Logging.logbackAndroid)
api(Libs.Google.Android.PlayServices.measurementApi)
api(Libs.KotlinX.serializationJson)
api(Libs.KotlinX.serializationProtobuf)
api(Libs.androidSvg)
api(Libs.Apache.commonsLang3)
//RxBus
api(Libs.Rx.rxJava)
api(Libs.Rx.rxKotlin)
api(Libs.Rx.rxAndroid)
// WorkerClasses
api(Libs.AndroidX.Work.runtimeKtx)
// TODO eliminate kapt from low level modules
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -58,6 +58,7 @@
<string name="pref_show_direction_arrow">Afficher Flèche</string>
<string name="pref_show_ago">Afficher Min Passées</string>
<string name="pref_show_week_number">Afficher numéro semaine</string>
<string name="pref_show_date">Afficher la date</string>
<string name="default_custom_watchface_comment">Cadran par défaut, vous pouvez cliquer sur le bouton EXPORTER WATCHFACE pour générer un modèle</string>
<string name="wear_default_watchface">Cadran par défaut</string>
<string name="cwf_comment_background">Image d\'arrière-plan</string>

View file

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Maintenance -->
<color name="metadataOk">#66BB6A</color>
<color name="metadataTextWarning">#FF8C00</color>
<color name="metadataTextError">#FF5555</color>
<!-- Toasts-->
<color name="toastBorder">#666666</color>
<color name="toastBase">#000000</color>
<color name="toastOk">#77dd77</color>
<color name="toastError">#ff0400</color>
<color name="toastWarn">#FF8C00</color>
<color name="toastInfo">#03A9F4</color>
</resources>

View file

@ -1,4 +1,4 @@
// in order to use internet's versions you'd need to enable Jetifier again
// https://github.com/nightscout/iconify.git
configurations.create("default")
artifacts.add("default", file('libs/iconify.aar'))
artifacts.add("default", file("libs/iconify.aar"))

View file

@ -1,4 +0,0 @@
allOpen {
// allows mocking for classes w/o directly opening them for release builds
annotation 'app.aaps.annotations.OpenForTesting'
}

View file

@ -1,37 +0,0 @@
android {
compileSdk 34
defaultConfig {
minSdkVersion 28
targetSdkVersion 28
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildFeatures {
viewBinding true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
lint {
checkReleaseBuilds false
disable 'MissingTranslation'
disable 'ExtraTranslation'
}
}

View file

@ -1,29 +0,0 @@
android {
flavorDimensions = ["standard"]
productFlavors {
full {
getIsDefault().set(true)
dimension "standard"
}
pumpcontrol {
dimension "standard"
}
aapsclient {
dimension "standard"
}
aapsclient2 {
dimension "standard"
}
}
// disable for modules here
buildFeatures {
buildConfig = false
}
}
dependencies {
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
}

View file

@ -1,42 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-parcelize'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
dependencies {
implementation project(':database:entities')
implementation project(':core:graphview')
implementation project(':core:interfaces')
implementation project(':core:ui')
implementation project(':core:utils')
testImplementation project(':shared:tests')
testImplementation project(':shared:impl')
api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
api "com.google.guava:guava:$guava_version"
api "androidx.activity:activity-ktx:$activity_version"
api "androidx.appcompat:appcompat:$appcompat_version"
api "com.google.android.material:material:$material_version"
api "com.google.dagger:dagger-android:$dagger_version"
api "com.google.dagger:dagger-android-support:$dagger_version"
//WorkManager
api "androidx.work:work-runtime-ktx:$work_version" // DataWorkerStorage
}
android {
namespace 'app.aaps.core.main'
}

View file

@ -0,0 +1,40 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("android-module-dependencies")
id("all-open-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.core.main"
}
dependencies {
implementation(project(":database:entities"))
implementation(project(":core:graphview"))
implementation(project(":core:interfaces"))
implementation(project(":core:ui"))
implementation(project(":core:utils"))
testImplementation(project(":shared:tests"))
testImplementation(project(":shared:impl"))
api(Libs.Kotlin.stdlibJdk8)
api(Libs.Google.Android.material)
api(Libs.Google.guava)
api(Libs.AndroidX.activity)
api(Libs.AndroidX.appCompat)
api(Libs.Dagger.android)
api(Libs.Dagger.androidSupport)
//WorkManager
api(Libs.AndroidX.Work.runtimeKtx) // DataWorkerStorage
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,102 +0,0 @@
project.afterEvaluate { project ->
setupAndroidReporting()
}
def setupAndroidReporting() {
tasks.withType(Test) {
// Whether or not classes without source location should be instrumented
jacoco.includeNoLocationClasses = true
jacoco.excludes = ['jdk.internal.*']
}
def buildTypes = ["debug", "fullDebug"]
def productFlavors = android.productFlavors.collect { flavor ->
flavor.name
}
// When no product flavors defined, use empty
if (!productFlavors) productFlavors.add('')
productFlavors.each { productFlavorName ->
buildTypes.each { buildTypeName ->
def sourceName, sourcePath
if (!productFlavorName) {
sourceName = sourcePath = "${buildTypeName}"
} else {
sourceName = "${productFlavorName}${buildTypeName.capitalize()}"
sourcePath = "${productFlavorName}/${buildTypeName}"
}
def testTaskName = "test${sourceName.capitalize()}UnitTest"
// System.out.println("Task -> $testTaskName")
// Create coverage task of form 'testFlavorTypeCoverage' depending on 'testFlavorTypeUnitTest'
task "${testTaskName}Coverage"(type: JacocoReport, dependsOn: "$testTaskName") {
group = "Reporting"
description = "Generate Jacoco coverage reports on the ${sourceName.capitalize()} build."
def fileFilter = [
// data binding
'android/databinding/**/*.class',
'**/android/databinding/*Binding.class',
'**/android/databinding/*',
'**/androidx/databinding/*',
'**/BR.*',
// android
'**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*Test*.*',
'android/**/*.*',
// kotlin
'**/*MapperImpl*.*',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/*Component*.*',
'**/*BR*.*',
'**/Manifest*.*',
'**/*$Lambda$*.*',
'**/*Companion*.*',
'**/*Module*.*',
'**/*Dagger*.*',
'**/*Hilt*.*',
'**/*MembersInjector*.*',
'**/*_MembersInjector.class',
'**/*_Factory*.*',
'**/*_Provide*Factory*.*',
'**/*Extensions*.*',
// sealed and data classes
'**/*$Result.*',
'**/*$Result$*.*',
// adapters generated by moshi
'**/*JsonAdapter.*',
]
def javaTree = fileTree(dir: "${project.buildDir}/intermediates/javac/$sourceName/classes", excludes: fileFilter)
def kotlinTree = fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/$sourceName", excludes: fileFilter)
classDirectories.from = files([javaTree], [kotlinTree])
executionData.from = files("${project.buildDir}/jacoco/${testTaskName}.exec")
def coverageSourceDirs = ["src/main/java",
"src/$productFlavorName/java",
"src/$buildTypeName/java"]
sourceDirectories.setFrom(files(coverageSourceDirs))
additionalSourceDirs.setFrom(files(coverageSourceDirs))
reports {
csv.required = false
xml.required = true
html.required = true
}
}
}
}
}
android {
buildTypes {
debug {
testCoverageEnabled true
}
}
}

View file

@ -1,40 +0,0 @@
dependencies {
//testImplementation "junit:junit:$junit_version"
testImplementation 'org.jetbrains.kotlin:kotlin-test:1.9.10'
testImplementation "org.junit.jupiter:junit-jupiter:$junit_jupiter_version"
testImplementation "org.junit.jupiter:junit-jupiter-api:$junit_jupiter_version"
testImplementation "org.json:json:$json_version"
testImplementation "org.mockito:mockito-junit-jupiter:$mockito_version"
testImplementation "org.mockito.kotlin:mockito-kotlin:4.1.0"
testImplementation "joda-time:joda-time:$jodatime_version"
testImplementation 'com.google.truth:truth:1.1.5'
testImplementation "org.skyscreamer:jsonassert:1.5.0"
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation "androidx.test.ext:junit-ktx:$androidx_junit_version"
androidTestImplementation "androidx.test:rules:$androidx_rules_version"
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
}
tasks.matching { it instanceof Test }.all {
//testLogging.events = ["failed", "skipped", "started"]
// use to display stdout in travis
testLogging.events = ["failed", "skipped", "started", "standard_out"]
testLogging.exceptionFormat = "full"
useJUnitPlatform()
}
android {
testOptions {
unitTests {
returnDefaultValues = true
includeAndroidResources = true
all {
maxParallelForks = 10
forkEvery = 20
}
}
}
}

View file

@ -1,38 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlinx-serialization'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
android {
namespace 'app.aaps.core.nssdk'
}
dependencies {
api "com.squareup.retrofit2:retrofit:$retrofit2_version"
api "com.squareup.retrofit2:adapter-rxjava3:$retrofit2_version"
api "com.squareup.retrofit2:converter-gson:$retrofit2_version"
api "com.squareup.okhttp3:okhttp:$okhttp3_version"
api "com.squareup.okhttp3:logging-interceptor:$okhttp3_version"
api "com.google.code.gson:gson:$gson_version"
api "net.danlew:android.joda:$joda_version"
api "io.reactivex.rxjava3:rxjava:$rxjava_version"
api "io.reactivex.rxjava3:rxandroid:$rxandroid_version"
api "io.reactivex.rxjava3:rxkotlin:$rxkotlin_version"
api "androidx.core:core-ktx:$core_version"
api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
api "org.jetbrains.kotlinx:kotlinx-coroutines-rx3:$coroutines_version"
api "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinx_serialization_version"
}

View file

@ -0,0 +1,32 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlinx-serialization")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.core.nssdk"
}
dependencies {
api(Libs.Squareup.Retrofit2.retrofit)
api(Libs.Squareup.Retrofit2.adapterRxJava3)
api(Libs.Squareup.Retrofit2.converterGson)
api(Libs.Squareup.Okhttp3.okhttp)
api(Libs.Squareup.Okhttp3.loggingInterceptor)
api(Libs.Google.gson)
api(Libs.jodaTimeAndroid)
api(Libs.Rx.rxJava)
//api(Libs.Rx.rxAndroid)
api(Libs.Rx.rxKotlin)
api(Libs.AndroidX.core)
api(Libs.Kotlin.stdlibJdk8)
api(Libs.KotlinX.coroutinesCore)
api(Libs.KotlinX.coroutinesAndroid)
api(Libs.KotlinX.coroutinesRx3)
api(Libs.KotlinX.serializationJson)
}

View file

@ -1,28 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
android {
namespace 'app.aaps.core.ui'
buildFeatures {
viewBinding true
}
}
dependencies {
api "androidx.core:core-ktx:$core_version"
api "androidx.appcompat:appcompat:$appcompat_version"
api "androidx.preference:preference-ktx:$preferencektx_version"
api "com.google.android.material:material:$material_version"
api "com.google.dagger:dagger-android:$dagger_version"
api "com.google.dagger:dagger-android-support:$dagger_version"
}

20
core/ui/build.gradle.kts Normal file
View file

@ -0,0 +1,20 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("android-module-dependencies")
}
android {
namespace = "app.aaps.core.ui"
}
dependencies {
api(Libs.AndroidX.core)
api(Libs.AndroidX.appCompat)
api(Libs.AndroidX.preference)
api(Libs.Google.Android.material)
api(Libs.Dagger.android)
api(Libs.Dagger.androidSupport)
}

View file

@ -51,6 +51,7 @@
<string name="extended_bolus">Prodloužený bolus</string>
<string name="paused">Pozastaveno</string>
<string name="tdd_total">CDD celkem</string>
<string name="tdd_old_data">Stará data</string>
<string name="goingtodeliver">Podávání %1$.2f U inzulínu</string>
<string name="waitingforpump">Čekání na pumpu</string>
<string name="androidaps_start">AAPS spuštěno</string>
@ -167,6 +168,8 @@
<string name="virtualpump_uploadstatus_title">Nahrávat stav pumpy do NS nebo Tidepoolu</string>
<string name="suspendloop_label">Zakázaná/pozastavená smyčka</string>
<string name="iob_label">Aktivní inzulín (IOB)</string>
<string name="loopstatus_targets">CÍL:</string>
<string name="loopstatus_OAPS_result">VÝSLEDEK OAPS:</string>
<!-- Protection-->
<string name="wrongpassword">Chybné heslo</string>
<string name="wrongpin">Nesprávný PIN</string>
@ -462,6 +465,8 @@
<string name="bolus_recorded_only">Bolus nebude pumpou vydán, pouze zaznamenán</string>
<string name="advisoralarm">Spustit alarm, když je čas na jídlo</string>
<string name="no_action_selected">Žádná akce nevybrána, nic se neprovede</string>
<string name="carb_equal_zero_no_action">Sacharidy = 0. Žádná akce!</string>
<string name="wizard_no_insulin_required">Není vyžadován žádný inzulín!</string>
<string name="wizard_no_actual_bg">Žádná aktuální glykémie k výpočtu!</string>
<string name="wizard_no_active_profile">Není nastaven žádný aktivní profil!</string>
<string name="wizard_no_cob">Neznámý COB! Chybějící glykémie nebo nedávný restart aplikace?</string>

View file

@ -51,6 +51,7 @@
<string name="extended_bolus">Bolo extendido</string>
<string name="paused">Pausado</string>
<string name="tdd_total">Total TDD</string>
<string name="tdd_old_data">Datos antiguos</string>
<string name="goingtodeliver">Entregando %1$.2f U</string>
<string name="waitingforpump">Esperando bomba</string>
<string name="androidaps_start">AAPS iniciado</string>
@ -167,6 +168,8 @@
<string name="virtualpump_uploadstatus_title">Subir estado de la bomba a NS o Tidepool</string>
<string name="suspendloop_label">Desactiva/suspende el lazo</string>
<string name="iob_label">Insulina a bordo (IOB)</string>
<string name="loopstatus_targets">OBJETIVOS:</string>
<string name="loopstatus_OAPS_result">RESULTADO OAPS:</string>
<!-- Protection-->
<string name="wrongpassword">Contraseña incorrecta</string>
<string name="wrongpin">Pin erróneo</string>
@ -462,6 +465,8 @@
<string name="bolus_recorded_only">El bolo sólo se anotará (no será entregado por la bomba)</string>
<string name="advisoralarm">Ejecutar alarma cuando sea hora de comer</string>
<string name="no_action_selected">No se ha seleccionado ninguna opción, por lo que no se realizará ningún cambio</string>
<string name="carb_equal_zero_no_action">Carbs = 0. ¡No se toma ningua acción!</string>
<string name="wizard_no_insulin_required">¡No se requiere insulina!</string>
<string name="wizard_no_actual_bg">¡No hay valor de glucosa reciente en el que basar el cálculo!</string>
<string name="wizard_no_active_profile">¡No hay perfil activo!</string>
<string name="wizard_no_cob">COB desconocido! ¿Valor de glucosa ausente o reincio reciente de la aplicación?</string>

View file

@ -51,6 +51,7 @@
<string name="extended_bolus">Bolus étendu</string>
<string name="paused">En pause</string>
<string name="tdd_total">DTQ Total</string>
<string name="tdd_old_data">Données anciennes</string>
<string name="goingtodeliver">%1$.2f U vont être injectées</string>
<string name="waitingforpump">Attente connection pompe</string>
<string name="androidaps_start">AAPS démarré</string>
@ -167,6 +168,8 @@
<string name="virtualpump_uploadstatus_title">Télécharger l\'état de la pompe sur NS ou Tidepool</string>
<string name="suspendloop_label">Boucle désactivée/suspendue</string>
<string name="iob_label">Insuline Active (IA)</string>
<string name="loopstatus_targets">CIBLES:</string>
<string name="loopstatus_OAPS_result">RÉSULTATS OAPS:</string>
<!-- Protection-->
<string name="wrongpassword">Mot de passe incorrect</string>
<string name="wrongpin">Code PIN incorrect</string>
@ -462,6 +465,8 @@
<string name="bolus_recorded_only">Les bolus seront seulement enregistrés (pas délivrés par la pompe)</string>
<string name="advisoralarm">Alerter quand il est temps de manger</string>
<string name="no_action_selected">Aucune action sélectionnée, rien ne se passera</string>
<string name="carb_equal_zero_no_action">Glucides = 0. Aucune action !</string>
<string name="wizard_no_insulin_required">Aucune insuline requise !</string>
<string name="wizard_no_actual_bg">Pas de glycémie récente pour calculer !</string>
<string name="wizard_no_active_profile">Aucun profil activé !</string>
<string name="wizard_no_cob">GA inconnu! glycémie manquante ou démarrage récent de l\'application ?</string>

View file

@ -51,6 +51,7 @@
<string name="extended_bolus">Forlenget bolus</string>
<string name="paused">Pauset</string>
<string name="tdd_total">TDD Total</string>
<string name="tdd_old_data">Gammel data</string>
<string name="goingtodeliver">Leverer %1$.2f enheter</string>
<string name="waitingforpump">Venter på pumpen</string>
<string name="androidaps_start">AAPS startet</string>
@ -167,6 +168,8 @@
<string name="virtualpump_uploadstatus_title">Last opp pumpestatus til NS eller Tidepool</string>
<string name="suspendloop_label">Deaktivert/pauset loop</string>
<string name="iob_label">Aktivt insulin (IOB)</string>
<string name="loopstatus_targets">MÅLVERDIER:</string>
<string name="loopstatus_OAPS_result">OAPS resultat:</string>
<!-- Protection-->
<string name="wrongpassword">Feil passord</string>
<string name="wrongpin">Feil PIN-kode</string>
@ -462,6 +465,8 @@
<string name="bolus_recorded_only">Bolus vil bare bli loggført (ikke levert av pumpe)</string>
<string name="advisoralarm">Aktiver alarm når det er på tide å spise</string>
<string name="no_action_selected">Ingen handling valgt. Ingenting endres</string>
<string name="carb_equal_zero_no_action">Karbo = 0. Ingen handling utført!</string>
<string name="wizard_no_insulin_required">Insulin er ikke nødvendig!</string>
<string name="wizard_no_actual_bg">Mangler nylige BS-verdier til å gjøre beregninger!</string>
<string name="wizard_no_active_profile">Det er ikke angitt noen aktiv profil!</string>
<string name="wizard_no_cob">Ukjent COB! BS-verdier mangler eller nylig oppstart av appen?</string>

View file

@ -51,6 +51,7 @@
<string name="extended_bolus">Vertraagde bolus</string>
<string name="paused">Gepauzeerd</string>
<string name="tdd_total">TDD Totaal</string>
<string name="tdd_old_data">Oude gegevens</string>
<string name="goingtodeliver">%1$.2f E toedienen</string>
<string name="waitingforpump">Wacht op pomp</string>
<string name="androidaps_start">AAPS gestart</string>
@ -167,6 +168,8 @@
<string name="virtualpump_uploadstatus_title">Upload pomp status naar NS of Tidepool</string>
<string name="suspendloop_label">Uitgeschakelde/onderbroken loop</string>
<string name="iob_label">Insuline aan boord (IOB)</string>
<string name="loopstatus_targets">DOELWAARDE:</string>
<string name="loopstatus_OAPS_result">OAPS RESULTAAT:</string>
<!-- Protection-->
<string name="wrongpassword">Verkeerd wachtwoord</string>
<string name="wrongpin">Onjuiste PIN-code</string>
@ -462,6 +465,8 @@
<string name="bolus_recorded_only">Bolus wordt alleen geregistreerd (niet toegediend door pomp)</string>
<string name="advisoralarm">Start alarm wanneer het tijd is om te eten</string>
<string name="no_action_selected">Geen actie geselecteerd, er zal niets uitgevoerd worden</string>
<string name="carb_equal_zero_no_action">Koolhydraten = 0. Geen actie!</string>
<string name="wizard_no_insulin_required">Geen insuline nodig!</string>
<string name="wizard_no_actual_bg">Geen recente BG om de berekening op te baseren!</string>
<string name="wizard_no_active_profile">Geen actief profiel ingesteld!</string>
<string name="wizard_no_cob">Onbekende COB! BG uitlezing ontbreekt of de recente app herstart?</string>

View file

@ -51,6 +51,7 @@
<string name="extended_bolus">Bolus Przedłużony</string>
<string name="paused">Wstrzymano</string>
<string name="tdd_total">TDD Całkowita</string>
<string name="tdd_old_data">Stare dane</string>
<string name="goingtodeliver">Zamierzam podać %1$.2f U</string>
<string name="waitingforpump">Czekam na pompę</string>
<string name="androidaps_start">AAPS uruchomiony</string>
@ -167,6 +168,8 @@
<string name="virtualpump_uploadstatus_title">Prześlij status pompy do NS lub Tidepool</string>
<string name="suspendloop_label">Wyłączona/zawieszona pętla</string>
<string name="iob_label">Aktywna insulina (IOB)</string>
<string name="loopstatus_targets">CELE:</string>
<string name="loopstatus_OAPS_result">WYNIK OAPS:</string>
<!-- Protection-->
<string name="wrongpassword">Złe hasło</string>
<string name="wrongpin">Nieprawidłowy PIN</string>
@ -462,6 +465,8 @@
<string name="bolus_recorded_only">Bolus zostanie jedynie odnotowany (nie będzie podany przez pompę)</string>
<string name="advisoralarm">Uruchom alarm kiedy będzie czas na jedzenie</string>
<string name="no_action_selected">Nie wybrano żadnej akcji, zdarzenie nie będzie wprowadzone</string>
<string name="carb_equal_zero_no_action">Węglowodany = 0. Nie podjęto żadnych działań!</string>
<string name="wizard_no_insulin_required">Insulina nie jest wymagana!</string>
<string name="wizard_no_actual_bg">Brak niezbędnego do obliczeń bieżącego pomiaru glikemi!</string>
<string name="wizard_no_active_profile">Nie ustawiono aktywnego profilu!</string>
<string name="wizard_no_cob">Nieznane COB! Może brakuje odczytu glikemii lub niedawno zrestartowano aplikację?</string>

View file

@ -360,4 +360,17 @@
<color name="widget_ribbonCritical">#ff0400</color>
<color name="widget_basal">#00ffff</color>
<!-- Maintenance -->
<color name="metadataOk">#66BB6A</color>
<color name="metadataTextWarning">#FF8C00</color>
<color name="metadataTextError">#FF5555</color>
<!-- Toasts-->
<color name="toastBorder">#666666</color>
<color name="toastBase">#000000</color>
<color name="toastOk">#77dd77</color>
<color name="toastError">#ff0400</color>
<color name="toastWarn">#FF8C00</color>
<color name="toastInfo">#03A9F4</color>
</resources>

View file

@ -1,41 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.core.utils'
}
dependencies {
api "com.google.dagger:dagger-android:$dagger_version"
api "com.google.dagger:dagger-android-support:$dagger_version"
api "net.danlew:android.joda:$joda_version"
//Firebase
api platform('com.google.firebase:firebase-bom:32.4.0')
api "com.google.firebase:firebase-analytics-ktx"
api "com.google.firebase:firebase-crashlytics-ktx"
// StatsActivity not in use now
// api "com.google.firebase:firebase-messaging-ktx"
// api 'com.google.firebase:firebase-auth-ktx'
// api 'com.google.firebase:firebase-database-ktx'
//CryptoUtil
api 'com.madgag.spongycastle:core:1.58.0.0'
api "com.google.crypto.tink:tink-android:$tink_version"
//WorkManager
api "androidx.work:work-runtime-ktx:$work_version" // DataWorkerStorage
}

View file

@ -0,0 +1,38 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-allopen")
id("android-module-dependencies")
id("all-open-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.core.utils"
}
dependencies {
api(Libs.jodaTimeAndroid)
//Firebase
api(platform(Libs.Google.Firebase.firebaseBom))
api(Libs.Google.Firebase.analytics)
api(Libs.Google.Firebase.crashlytics)
// StatsActivity not in use now
// api(Libs.Google.Firebase.messaging)
// api(Libs.Google.Firebase.auth)
// api(Libs.Google.Firebase.database)
//CryptoUtil
api(Libs.spongycastleCore)
api(Libs.Google.tinkAndroid)
//WorkManager
api(Libs.AndroidX.Work.runtimeKtx) // DataWorkerStorage
api(Libs.Dagger.android)
api(Libs.Dagger.androidSupport)
}

View file

@ -1,26 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.core.validators'
}
dependencies {
implementation project(':core:interfaces')
api "com.google.dagger:dagger-android:$dagger_version"
api "com.google.dagger:dagger-android-support:$dagger_version"
api "com.google.android.material:material:$material_version"
}

View file

@ -0,0 +1,24 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.core.validators"
}
dependencies {
implementation(project(":core:interfaces"))
api(Libs.Dagger.android)
api(Libs.Dagger.androidSupport)
api(Libs.Google.Android.material)
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,37 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
android {
namespace 'app.aaps.database.entities'
defaultConfig {
minSdkVersion 26 // for wear
}
buildFeatures {
buildConfig = false
}
}
dependencies {
api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
api "androidx.core:core-ktx:$core_version"
kapt "androidx.room:room-compiler:$room_version"
api "androidx.room:room-ktx:$room_version"
}
allOpen {
// allows mocking for classes w/o directly opening them for release builds
annotation 'app.aaps.database.annotations.DbOpenForTesting'
}

View file

@ -0,0 +1,24 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.database.entities"
defaultConfig {
minSdk = Versions.wearMinSdk // for wear
}
}
dependencies {
api(Libs.Kotlin.stdlibJdk8)
api(Libs.AndroidX.core)
api(Libs.AndroidX.Room.room)
kapt(Libs.AndroidX.Room.compiler)
}

View file

@ -1,53 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.database.impl'
defaultConfig {
kapt {
arguments {
arg("room.incremental", "true")
arg("room.schemaLocation", "$projectDir/schemas")
}
}
}
sourceSets {
androidTest.assets.srcDirs += files("$projectDir/schemas")
}
}
dependencies {
implementation project(':database:entities')
api "androidx.core:core-ktx:$core_version"
api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
api "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
api "io.reactivex.rxjava3:rxjava:$rxjava_version"
api "io.reactivex.rxjava3:rxandroid:$rxandroid_version"
api "io.reactivex.rxjava3:rxkotlin:$rxkotlin_version"
api "com.google.code.gson:gson:$gson_version"
api "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
/* Database schema export */
kapt "androidx.room:room-compiler:$room_version"
api "androidx.room:room-ktx:$room_version"
api "androidx.room:room-rxjava3:$room_version"
api "com.google.dagger:dagger-android:$dagger_version"
api "com.google.dagger:dagger-android-support:$dagger_version"
androidTestImplementation "androidx.room:room-testing:$room_version"
}

View file

@ -0,0 +1,51 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-allopen")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.database.impl"
defaultConfig {
kapt {
arguments {
arg("room.incremental", "true")
arg("room.schemaLocation", "$projectDir/schemas")
}
}
}
sourceSets {
getByName("androidTest").assets.srcDirs("$projectDir/schemas")
}
}
dependencies {
implementation(project(":database:entities"))
api(Libs.Kotlin.stdlibJdk8)
api(Libs.Kotlin.reflect)
api(Libs.AndroidX.core)
api(Libs.Rx.rxJava)
api(Libs.Rx.rxAndroid)
api(Libs.Rx.rxKotlin)
api(Libs.Google.gson)
api(Libs.AndroidX.Room.room)
api(Libs.AndroidX.Room.runtime)
api(Libs.AndroidX.Room.rxJava3)
api(Libs.Dagger.android)
api(Libs.Dagger.androidSupport)
androidTestImplementation(Libs.AndroidX.Room.testing)
kapt(Libs.Dagger.compiler)
kapt(Libs.AndroidX.Room.compiler)
}

View file

@ -1,15 +0,0 @@
package app.aaps.database.annotations
/**
* This is the actual annotation that makes the class open. Don't use it directly, only through [DbOpenForTesting]
* which has a NOOP replacement in production.
*/
@Target(AnnotationTarget.ANNOTATION_CLASS)
annotation class DbOpenClass
/**
* Annotate a class with [DbOpenForTesting] if it should be extendable for testing.
*/
@DbOpenClass
@Target(AnnotationTarget.CLASS)
annotation class DbOpenForTesting

View file

@ -1,7 +1,7 @@
package app.aaps.database.impl
import androidx.annotation.OpenForTesting
import app.aaps.database.ValueWrapper
import app.aaps.database.annotations.DbOpenForTesting
import app.aaps.database.entities.Bolus
import app.aaps.database.entities.BolusCalculatorResult
import app.aaps.database.entities.Carbs
@ -34,8 +34,9 @@ import javax.inject.Inject
import javax.inject.Singleton
import kotlin.math.roundToInt
@DbOpenForTesting
@Singleton class AppRepository @Inject internal constructor(
@OpenForTesting
@Singleton
class AppRepository @Inject internal constructor(
internal val database: AppDatabase
) {

View file

@ -1,8 +0,0 @@
package app.aaps.database.annotations
/**
* Annotate a class with [DbOpenForTesting] if it should be extendable for testing.
* In production the class remains final.
*/
@Target(AnnotationTarget.CLASS)
annotation class DbOpenForTesting

View file

@ -1,32 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.implementation'
}
dependencies {
implementation project(':database:entities')
implementation project(':database:impl')
implementation project(':core:main')
implementation project(':core:graphview')
implementation project(':core:interfaces')
implementation project(':core:ui')
implementation project(':core:utils')
testImplementation project(':shared:tests')
testImplementation project(':plugins:aps')
testImplementation project(':pump:virtual')
// Protection
api 'androidx.biometric:biometric:1.1.0'
}

View file

@ -0,0 +1,32 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("all-open-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.implementation"
}
dependencies {
implementation(project(":database:entities"))
implementation(project(":database:impl"))
implementation(project(":core:main"))
implementation(project(":core:graphview"))
implementation(project(":core:interfaces"))
implementation(project(":core:ui"))
implementation(project(":core:utils"))
testImplementation(project(":shared:tests"))
testImplementation(project(":plugins:aps"))
testImplementation(project(":pump:virtual"))
// Protection
api(Libs.AndroidX.biometric)
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -11,6 +11,7 @@ import app.aaps.core.interfaces.configuration.Constants
import app.aaps.core.interfaces.logging.AAPSLogger
import app.aaps.core.interfaces.logging.LTag
import app.aaps.core.interfaces.plugin.ActivePlugin
import app.aaps.core.interfaces.pump.VirtualPump
import app.aaps.core.interfaces.queue.CommandQueue
import app.aaps.core.interfaces.resources.ResourceHelper
import app.aaps.core.interfaces.rx.bus.RxBus
@ -54,7 +55,7 @@ class QueueThread internal constructor(
val secondsElapsed = (System.currentTimeMillis() - connectionStartTime) / 1000
val pump = activePlugin.activePump
// Manifest.permission.BLUETOOTH_CONNECT
if (config.PUMPDRIVERS && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
if (config.PUMPDRIVERS && pump !is VirtualPump && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
if (androidPermission.permissionNotGranted(context, "android.permission.BLUETOOTH_CONNECT")) {
aapsLogger.debug(LTag.PUMPQUEUE, "no permission")
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.CONNECTING))

View file

@ -1,41 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'info.nightscout.androidaps.insight'
defaultConfig {
kapt {
arguments {
arg("room.incremental", "true")
arg("room.schemaLocation", "$projectDir/schemas")
}
}
}
}
dependencies {
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:utils')
implementation project(':core:ui')
implementation project(':pump:pump-common')
api "androidx.room:room-ktx:$room_version"
api "androidx.room:room-runtime:$room_version"
api "androidx.room:room-rxjava3:$room_version"
kapt "androidx.room:room-compiler:$room_version"
api "com.google.android.material:material:$material_version"
}

39
insight/build.gradle.kts Normal file
View file

@ -0,0 +1,39 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "info.nightscout.androidaps.insight"
defaultConfig {
kapt {
arguments {
arg("room.incremental", "true")
arg("room.schemaLocation", "$projectDir/schemas")
}
}
}
}
dependencies {
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:utils"))
implementation(project(":core:ui"))
implementation(project(":pump:pump-common"))
api(Libs.Google.Android.material)
api(Libs.AndroidX.Room.room)
api(Libs.AndroidX.Room.runtime)
api(Libs.AndroidX.Room.rxJava3)
kapt(Libs.AndroidX.Room.compiler)
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -0,0 +1,91 @@
apply(plugin = "jacoco")
project.afterEvaluate {
val variants = listOf("fullDebug")
tasks.register<JacocoReport>(name = "jacocoAllDebugReport") {
group = "Reporting"
description = "Generate overall Jacoco coverage report for the debug build."
reports {
html.required.set(true)
xml.required.set(true)
}
val excludes = listOf(
"**/di/*Module.class",
"**/di/*Component.class",
"**/com/jjoe64/**/*.*",
"**/R.class",
"**/R$*.class",
"**/BuildConfig.*",
"**/Manifest*.*",
"**/*Test*.*",
"android/**/*.*",
"androidx/**/*.*",
"**/*\$ViewInjector*.*",
"**/*Dagger*.*",
"**/*MembersInjector*.*",
"**/*_Factory.*",
"**/*_Provide*Factory*.*",
"**/*_ViewBinding*.*",
"**/AutoValue_*.*",
"**/R2.class",
"**/R2$*.class",
"**/*Directions$*",
"**/*Directions.*",
"**/*Binding.*",
"**/BR.class"
)
val classesDirectories = mutableListOf<String>().also {
subprojects.forEach { proj ->
variants.forEach { variant ->
it.add("${proj.buildDir}/intermediates/javac/$variant/classes")
it.add("${proj.buildDir}/tmp/kotlin-classes/$variant")
}
}
}
val classes = HashSet<ConfigurableFileTree>().also {
classesDirectories.forEach { path ->
it.add(fileTree(path) { exclude(excludes) })
}
}
classDirectories.setFrom(files(listOf(classes)))
val sources = mutableListOf<String>().also {
subprojects.forEach { proj ->
variants.forEach { variant ->
it.add("${proj.projectDir}/src/main/java")
it.add("${proj.projectDir}/src/main/kotlin")
it.add("${proj.projectDir}/src/$variant/java")
it.add("${proj.projectDir}/src/$variant/kotlin")
}
}
}
sourceDirectories.setFrom(files(sources))
val executions = mutableListOf<String>().also {
subprojects.forEach { proj ->
variants.forEach { variant ->
val path = "${proj.buildDir}/outputs/unit_test_code_coverage/${variant}UnitTest/test${variant.replaceFirstChar(Char::titlecase)}UnitTest.exec"
if ((File(path)).exists()) {
it.add(path)
println("Collecting execution data from: $path")
}
val androidPath = "${proj.buildDir}/outputs/code_coverage/${variant}AndroidTest/connected/"
val androidFiles = fileTree(androidPath)
androidFiles.forEach { file ->
it.add(file.path)
println("Collecting android execution data from: ${file.path}")
}
}
}
}
executionData.setFrom(files(executions))
}
}

View file

@ -1,84 +0,0 @@
apply plugin: 'jacoco'
jacoco {
toolVersion '0.8.10'
}
project.afterEvaluate {
def variants = ["debug", "fullDebug"]
tasks.create(name: "jacocoAllDebugReport", type: JacocoReport) {
group = "Reporting"
description = "Generate overall Jacoco coverage report for the debug build."
reports {
html.required.set(true)
xml.required.set(true)
}
def excludes = [
'**/di/*Module.class',
'**/di/*Component.class',
'**/com/jjoe64/**/*.*',
'**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*Test*.*',
'android/**/*.*',
'androidx/**/*.*',
'**/*$ViewInjector*.*',
'**/*Dagger*.*',
'**/*MembersInjector*.*',
'**/*_Factory.*',
'**/*_Provide*Factory*.*',
'**/*_ViewBinding*.*',
'**/AutoValue_*.*',
'**/R2.class',
'**/R2$*.class',
'**/*Directions$*',
'**/*Directions.*',
'**/*Binding.*',
'**/BR.class'
]
def jClasses = subprojects.collect { proj ->
variants.collect { variant ->
"${proj.buildDir}/intermediates/javac/$variant/classes"
}
}.flatten()
def kClasses = subprojects.collect { proj ->
variants.collect { variant ->
"${proj.buildDir}/tmp/kotlin-classes/$variant"
}
}.flatten()
def javaClasses = jClasses.collect { path ->
fileTree(dir: path, excludes: excludes)
}
def kotlinClasses = kClasses.collect { path ->
fileTree(dir: path, excludes: excludes)
}
classDirectories.from = files([javaClasses, kotlinClasses])
def sources = subprojects.collect { proj ->
variants.collect { variant ->
["${proj.projectDir}/src/main/java", "${proj.projectDir}/src/main/kotlin",
"${proj.projectDir}/src/$variant/java", "${proj.projectDir}/src/$variant/kotlin"]
}.flatten()
}.flatten()
sourceDirectories.from = files(sources)
def executions = subprojects.collect { proj ->
variants.collect { variant ->
def path = "${proj.buildDir}/outputs/unit_test_code_coverage/${variant}UnitTest/test${variant.capitalize()}UnitTest.exec"
// printf('Collecting execution data from: %s\n', path)
if ((new File(path)).exists()) path else null
}
}.flatten()
executions.removeAll([null])
executionData.from = files(executions)
}
}

View file

@ -1,37 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.plugins.aps'
}
dependencies {
implementation project(':database:entities')
implementation project(':database:impl')
implementation project(':core:main')
implementation project(':core:interfaces')
implementation project(':core:nssdk')
implementation project(':core:utils')
implementation project(':core:ui')
implementation project(':core:validators')
testImplementation project(':pump:virtual')
testImplementation project(':shared:tests')
api "androidx.appcompat:appcompat:$appcompat_version"
api "androidx.swiperefreshlayout:swiperefreshlayout:$swipe_version"
api "androidx.gridlayout:gridlayout:$gridlayout_version"
// APS
api 'org.mozilla:rhino:1.7.14'
}

View file

@ -0,0 +1,35 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.plugins.aps"
}
dependencies {
implementation(project(":database:entities"))
implementation(project(":database:impl"))
implementation(project(":core:main"))
implementation(project(":core:interfaces"))
implementation(project(":core:nssdk"))
implementation(project(":core:utils"))
implementation(project(":core:ui"))
implementation(project(":core:validators"))
testImplementation(project(":pump:virtual"))
testImplementation(project(":shared:tests"))
api(Libs.AndroidX.appCompat)
api(Libs.AndroidX.swipeRefreshLayout)
api(Libs.AndroidX.gridLayout)
// APS
api(Libs.Mozilla.rhino)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="dynisf_adjust_sensitivity">Ajustar sensibilidad y glucosa</string>
<string name="DynISFAdjust_title" formatted="false">Factor de ajuste de Isf Dinámico %</string>
<string name="DynISFAdjust_summary" formatted="false">Factor de ajuste para el DynamicISF. Establezca más de 100% para una corrección más agresiva, y menos de 100% para correcciones más susves.</string>
<string name="DynISFAdjust_title" formatted="false">Factor de ajuste de ISF Dinámico %</string>
<string name="DynISFAdjust_summary" formatted="false">Factor de ajuste para ISF Dinámico. Establezca más de 100% para una corrección más agresiva, y menos de 100% para correcciones más susves.</string>
<string name="high_temptarget_raises_sensitivity_title">Objetivo temporal alto aumenta la sensibilidad</string>
<string name="high_temptarget_raises_sensitivity_summary"><![CDATA[Aumentar la sensibilidad para objetivos temporales >= 100]]></string>
<string name="low_temptarget_lowers_sensitivity_title">Objetivo temporal bajo reduce la sensibilidad</string>

View file

@ -1,35 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.plugins.automation'
}
dependencies {
implementation project(':core:graphview')
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:utils')
implementation project(':core:ui')
implementation project(':core:validators')
implementation project(':database:entities')
implementation project(':database:impl')
testImplementation project(':shared:tests')
testImplementation project(':shared:impl')
testImplementation project(':implementation')
testImplementation project(':plugins:main')
api "androidx.constraintlayout:constraintlayout:$constraintlayout_version"
api "com.google.android.gms:play-services-location:$play_services_location_version"
}

View file

@ -0,0 +1,34 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.plugins.automation"
}
dependencies {
implementation(project(":core:graphview"))
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:utils"))
implementation(project(":core:ui"))
implementation(project(":core:validators"))
implementation(project(":database:entities"))
implementation(project(":database:impl"))
testImplementation(project(":shared:tests"))
testImplementation(project(":shared:impl"))
testImplementation(project(":implementation"))
testImplementation(project(":plugins:main"))
api(Libs.AndroidX.constraintLayout)
api(Libs.Google.Android.PlayServices.location)
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -21,7 +21,6 @@ class AutomationEventObject(private val injector: HasAndroidInjector) : Automati
override var title: String = ""
override var isEnabled = true
var position = -1
var systemAction: Boolean = false // true = generated by AAPS, false = entered by user
var readOnly: Boolean = false // removing, editing disabled
var autoRemove: Boolean = false // auto-remove once used
@ -76,12 +75,11 @@ class AutomationEventObject(private val injector: HasAndroidInjector) : Automati
.toString()
}
fun fromJSON(data: String, position: Int): AutomationEventObject {
fun fromJSON(data: String): AutomationEventObject {
val d = JSONObject(data)
title = d.optString("title", "")
isEnabled = d.optBoolean("enabled", true)
systemAction = d.optBoolean("systemAction", false)
this.position = position
readOnly = d.optBoolean("readOnly", false)
autoRemove = d.optBoolean("autoRemove", false)
userAction = d.optBoolean("userAction", false)

View file

@ -293,7 +293,7 @@ class AutomationFragment : DaggerFragment(), OnStartDragListener, MenuProvider {
OKDialog.showConfirmation(activity, rh.gs(app.aaps.core.ui.R.string.removerecord), getConfirmationText(selectedItems), Runnable {
selectedItems.forEach { _, event ->
uel.log(Action.AUTOMATION_REMOVED, Sources.Automation, event.title)
automationPlugin.removeAt(event.position)
automationPlugin.remove(event)
rxBus.send(EventAutomationDataChanged())
}
actionHelper.finish()

View file

@ -211,14 +211,14 @@ class AutomationPlugin @Inject constructor(
val array = JSONArray(data)
for (i in 0 until array.length()) {
val o = array.getJSONObject(i)
val event = AutomationEventObject(injector).fromJSON(o.toString(), i)
val event = AutomationEventObject(injector).fromJSON(o.toString())
automationEvents.add(event)
}
} catch (e: JSONException) {
e.printStackTrace()
}
else
automationEvents.add(AutomationEventObject(injector).fromJSON(event, 0))
automationEvents.add(AutomationEventObject(injector).fromJSON(event))
}
internal fun processActions() {
@ -309,7 +309,6 @@ class AutomationPlugin @Inject constructor(
@Synchronized
fun add(event: AutomationEventObject) {
automationEvents.add(event)
event.position = automationEvents.size - 1
rxBus.send(EventAutomationDataChanged())
}
@ -338,14 +337,6 @@ class AutomationPlugin @Inject constructor(
rxBus.send(EventAutomationDataChanged())
}
@Synchronized
fun removeAt(index: Int) {
if (index >= 0 && index < automationEvents.size) {
automationEvents.removeAt(index)
rxBus.send(EventAutomationDataChanged())
}
}
@Synchronized
fun remove(event: AutomationEvent) {
automationEvents.remove(event)

View file

@ -57,7 +57,7 @@ class EditEventDialog : BaseDialog() {
// load data from bundle
(savedInstanceState ?: arguments)?.let { bundle ->
position = bundle.getInt("position", -1)
bundle.getString("event")?.let { event = AutomationEventObject(injector).fromJSON(it, position) }
bundle.getString("event")?.let { event = AutomationEventObject(injector).fromJSON(it) }
}
onCreateViewGeneral()

View file

@ -54,7 +54,7 @@ class AutomationEventTest : TestBase() {
JSONAssert.assertEquals(eventJsonExpected, event.toJSON(), true)
// clone
val clone = AutomationEventObject(injector).fromJSON(eventJsonExpected, 1)
val clone = AutomationEventObject(injector).fromJSON(eventJsonExpected)
// check title
assertThat(clone.title).isEqualTo(event.title)

View file

@ -1,35 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
id 'kotlin-parcelize'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.plugins.configuration'
}
dependencies {
implementation project(':database:entities')
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:nssdk')
implementation project(':core:utils')
implementation project(':core:ui')
implementation project(':core:validators')
testImplementation project(':shared:tests')
//WorkManager
api "androidx.work:work-runtime-ktx:$work_version"
// Maintenance
api "androidx.gridlayout:gridlayout:$gridlayout_version"
}

View file

@ -0,0 +1,34 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.plugins.configuration"
}
dependencies {
implementation(project(":database:entities"))
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:nssdk"))
implementation(project(":core:utils"))
implementation(project(":core:ui"))
implementation(project(":core:validators"))
testImplementation(project(":shared:tests"))
//WorkManager
api(Libs.AndroidX.Work.runtimeKtx)
// Maintenance
api(Libs.AndroidX.gridLayout)
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -2,10 +2,10 @@
<resources>
<string name="units">Unidades</string>
<string name="setupwizard_units_prompt">Seleccione as unidades em que deseja exibir os valores</string>
<string name="next_button">Seguinte</string>
<string name="previous_button">Anterior</string>
<string name="next_button">Avançar</string>
<string name="previous_button">Voltar</string>
<string name="nav_setupwizard">Assistente de Configuração</string>
<string name="setupwizard_finish">TERMINAR</string>
<string name="setupwizard_finish">Finalizar Configuração</string>
<string name="welcome">Bem-vindo(a)</string>
<string name="welcometosetupwizard">Bem-vindo ao assistente de configuração. Vai guiá-lo(a) através do processo de instalação\n</string>
<string name="end_user_license_agreement">Condições de Utilização</string>
@ -35,7 +35,7 @@
<string name="diawarning">Lembre-se: novos perfis de insulina requerem diâmetro de pelo menos 5h. DIA 56h no novo perfil é igual ao diâmetro 3h nos antigos perfis de insulina.</string>
<string name="profile">Perfil</string>
<string name="doprofileswitch">Fazer Mudança De Perfil</string>
<string name="exitwizard">Saltar assistente de configuração</string>
<string name="exitwizard">Sair do assistente de configuração</string>
<string name="setupwizard_loop_description">Pressione o botão abaixo para permitir ao AndroidAPS sugerir/fazer alterações na basal.</string>
<string name="setupwizard_sensitivity_description">Plugin de Sensibilidade é usado para detecção de sensibilidade e cálculos COB. Para mais info visite:</string>
<string name="setupwizard_sensitivity_url">https://wiki.aaps.app/en/latest/Configuration/Sensitivity-detection-and-COB.html</string>

View file

@ -1,40 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.plugins.constraints'
}
dependencies {
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:ui')
implementation project(':core:utils')
implementation project(':core:validators')
implementation project(':database:entities')
testImplementation project(':database:impl')
testImplementation project(':implementation')
testImplementation project(':insight')
testImplementation project(':plugins:aps')
testImplementation project(':plugins:source')
testImplementation project(':pump:combo')
testImplementation project(':pump:dana')
testImplementation project(':pump:danar')
testImplementation project(':pump:danars')
testImplementation project(':pump:virtual')
testImplementation project(':shared:tests')
// Phone checker
api 'com.scottyab:rootbeer-lib:0.1.0'
}

View file

@ -0,0 +1,40 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("all-open-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.plugins.constraints"
}
dependencies {
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:ui"))
implementation(project(":core:utils"))
implementation(project(":core:validators"))
implementation(project(":database:entities"))
testImplementation(project(":database:impl"))
testImplementation(project(":implementation"))
testImplementation(project(":insight"))
testImplementation(project(":plugins:aps"))
testImplementation(project(":plugins:source"))
testImplementation(project(":pump:combo"))
testImplementation(project(":pump:dana"))
testImplementation(project(":pump:danar"))
testImplementation(project(":pump:danars"))
testImplementation(project(":pump:virtual"))
testImplementation(project(":shared:tests"))
// Phone checker
api(Libs.rootBeer)
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,29 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.plugins.insulin'
}
dependencies {
implementation project(':core:graphview')
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:ui')
implementation project(':core:utils')
implementation project(':core:validators')
implementation project(':database:entities')
testImplementation project(':shared:tests')
testImplementation project(':core:main')
}

View file

@ -0,0 +1,29 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.plugins.insulin"
}
dependencies {
implementation(project(":core:graphview"))
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:ui"))
implementation(project(":core:utils"))
implementation(project(":core:validators"))
implementation(project(":database:entities"))
testImplementation(project(":shared:tests"))
testImplementation(project(":core:main"))
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,48 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.plugins.main'
}
dependencies {
implementation project(':shared:impl')
implementation project(':database:entities')
implementation project(':database:impl')
implementation project(':core:graphview')
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:nssdk')
implementation project(':core:ui')
implementation project(':core:utils')
implementation project(':core:validators')
testImplementation project(':implementation')
testImplementation project(':plugins:insulin')
testImplementation project(':shared:tests')
api "androidx.appcompat:appcompat:$appcompat_version"
api "com.google.android.material:material:$material_version"
// Actions
api "androidx.gridlayout:gridlayout:$gridlayout_version"
//SmsCommunicator
api 'com.eatthepath:java-otp:0.4.0'
api 'com.github.kenglxn.QRGen:android:3.0.1'
// Overview
api 'com.google.android.flexbox:flexbox:3.0.0'
// Food
api "androidx.work:work-runtime-ktx:$work_version"
}

View file

@ -0,0 +1,48 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.plugins.main"
}
dependencies {
implementation(project(":shared:impl"))
implementation(project(":database:entities"))
implementation(project(":database:impl"))
implementation(project(":core:graphview"))
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:nssdk"))
implementation(project(":core:ui"))
implementation(project(":core:utils"))
implementation(project(":core:validators"))
testImplementation(project(":implementation"))
testImplementation(project(":plugins:insulin"))
testImplementation(project(":shared:tests"))
api(Libs.AndroidX.appCompat)
api(Libs.Google.Android.material)
// Actions
api(Libs.AndroidX.gridLayout)
//SmsCommunicator
api(Libs.javaOtp)
api(Libs.qrGen)
// Overview
api(Libs.Google.Android.flexbox)
// Food
api(Libs.AndroidX.Work.runtimeKtx)
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,28 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.plugins.sensitivity'
}
dependencies {
implementation project(':database:entities')
implementation project(':database:impl')
implementation project(':core:interfaces')
implementation project(':core:utils')
implementation project(':core:ui')
implementation project(':core:validators')
testImplementation project(':shared:tests')
}

View file

@ -0,0 +1,27 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.plugins.sensitivity"
}
dependencies {
implementation(project(":database:entities"))
implementation(project(":database:impl"))
implementation(project(":core:interfaces"))
implementation(project(":core:utils"))
implementation(project(":core:ui"))
implementation(project(":core:validators"))
testImplementation(project(":shared:tests"))
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,23 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.plugins.smoothing'
}
dependencies {
implementation project(':database:entities')
implementation project(':core:interfaces')
implementation project(':core:ui')
}

View file

@ -0,0 +1,22 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.plugins.smoothing"
}
dependencies {
implementation(project(":database:entities"))
implementation(project(":core:interfaces"))
implementation(project(":core:ui"))
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,30 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.plugins.source'
}
dependencies {
implementation project(':shared:impl')
implementation project(':database:entities')
implementation project(':database:impl')
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:nssdk')
implementation project(':core:ui')
implementation project(':core:utils')
testImplementation project(':shared:tests')
}

View file

@ -0,0 +1,29 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.plugins.source"
}
dependencies {
implementation(project(":database:entities"))
implementation(project(":database:impl"))
implementation(project(":shared:impl"))
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:nssdk"))
implementation(project(":core:ui"))
implementation(project(":core:utils"))
testImplementation(project(":shared:tests"))
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,55 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'app.aaps.plugins.sync'
}
dependencies {
implementation project(':shared:impl')
implementation project(':database:entities')
implementation project(':database:impl')
implementation project(':core:graphview')
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:nssdk')
implementation project(':core:ui')
implementation project(':core:utils')
implementation project(':core:validators')
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
testImplementation "androidx.work:work-testing:$work_version"
testImplementation project(':shared:tests')
testImplementation project(':implementation')
testImplementation project(':plugins:aps')
// OpenHuman
api "com.squareup.okhttp3:okhttp:$okhttp3_version"
api "com.squareup.retrofit2:retrofit:$retrofit2_version"
api "androidx.browser:browser:1.6.0"
api "androidx.work:work-runtime-ktx:$work_version"
api "com.google.android.material:material:$material_version"
// NSClient, Tidepool
api("io.socket:socket.io-client:2.1.0")
api "com.squareup.okhttp3:okhttp:$okhttp3_version"
api "com.squareup.okhttp3:logging-interceptor:$okhttp3_version"
api "com.squareup.retrofit2:adapter-rxjava3:$retrofit2_version"
api "com.squareup.retrofit2:converter-gson:$retrofit2_version"
api "com.google.code.gson:gson:$gson_version"
// DataLayerListenerService
api "com.google.android.gms:play-services-wearable:$play_services_wearable_version"
}

View file

@ -0,0 +1,54 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "app.aaps.plugins.sync"
}
dependencies {
implementation(project(":shared:impl"))
implementation(project(":database:entities"))
implementation(project(":database:impl"))
implementation(project(":core:graphview"))
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:nssdk"))
implementation(project(":core:ui"))
implementation(project(":core:utils"))
implementation(project(":core:validators"))
testImplementation(Libs.KotlinX.coroutinesTest)
testImplementation(Libs.AndroidX.Work.testing)
testImplementation(project(":shared:tests"))
testImplementation(project(":implementation"))
testImplementation(project(":plugins:aps"))
// OpenHuman
api(Libs.Squareup.Okhttp3.okhttp)
api(Libs.Squareup.Retrofit2.retrofit)
api(Libs.AndroidX.browser)
api(Libs.AndroidX.Work.runtimeKtx)
api(Libs.AndroidX.gridLayout)
api(Libs.Google.Android.material)
// NSClient, Tidepool
api(Libs.socketIo)
api(Libs.Squareup.Okhttp3.loggingInterceptor)
api(Libs.Squareup.Retrofit2.adapterRxJava3)
api(Libs.Squareup.Retrofit2.converterGson)
api(Libs.Google.gson)
// DataLayerListenerService
api(Libs.Google.Android.PlayServices.wearable)
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -116,6 +116,7 @@
<string name="xdrip_local_broadcasts_summary">Envoyer les glycémies et les traitements à xDrip+. La source de données \"xDrip+ Sync Follower\" doit être sélectionnée et l\'acceptation des données doit être activée dans Paramètres - Paramètres Inter-app - Accepter Glycémies/Traitements</string>
<string name="xdrip_local_broadcasts_title">Activer les diffusions vers xDrip+.</string>
<!-- DataBroadcast-->
<string name="data_broadcaster">Diffusue de données</string>
<string name="data_broadcaster_short">DD</string>
<string name="data_broadcaster_description">Diffuser des données sur l\'application G-Watch Wear de Garmin</string>
<!-- GarminPlugin -->

View file

@ -1,32 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
buildFeatures {
aidl true
}
namespace 'info.nightscout.pump.combo'
}
dependencies {
implementation project(':core:libraries')
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:ui')
implementation project(':core:utils')
testImplementation project(':shared:tests')
// RuffyScripter
api "com.google.guava:guava:$guava_version"
}

View file

@ -0,0 +1,32 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
buildFeatures {
aidl = true
}
namespace = "info.nightscout.pump.combo"
}
dependencies {
implementation(project(":core:libraries"))
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:ui"))
implementation(project(":core:utils"))
testImplementation(project(":shared:tests"))
// RuffyScripter
api(Libs.Google.guava)
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,46 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
dependencies {
implementation project(':core:libraries')
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:ui')
implementation project(':core:utils')
implementation(project(":pump:combov2:comboctl"))
api "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
api "org.jetbrains.kotlinx:kotlinx-datetime:$kotlinx_datetime_version"
// This is necessary to avoid errors like these which otherwise come up often at runtime:
// "WARNING: Failed to transform class kotlinx/datetime/TimeZone$Companion
// java.lang.NoClassDefFoundError: kotlinx/serialization/KSerializer"
//
// "Rejecting re-init on previously-failed class java.lang.Class<
// kotlinx.datetime.serializers.LocalDateTimeIso8601Serializer>:
// java.lang.NoClassDefFoundError: Failed resolution of: Lkotlinx/serialization/KSerializer"
//
// kotlinx-datetime higher than 0.2.0 depends on kotlinx-serialization, but that dependency
// is declared as "compileOnly". The runtime dependency on kotlinx-serialization is missing,
// causing this error. Solution is to add runtimeOnly here.
//
// Source: https://github.com/mockk/mockk/issues/685#issuecomment-907076353:
// TODO: Revisit this when upgrading kotlinx-datetime
runtimeOnly("org.jetbrains.kotlinx:kotlinx-serialization-core:$kotlinx_serialization_version")
}
android {
namespace 'info.nightscout.pump.combov2'
buildFeatures {
dataBinding true
}
}

View file

@ -0,0 +1,46 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "info.nightscout.pump.combov2"
buildFeatures {
dataBinding = true
}
}
dependencies {
implementation(project(":core:libraries"))
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:ui"))
implementation(project(":core:utils"))
implementation(project(":pump:combov2:comboctl"))
api(Libs.AndroidX.lifecycleViewmodel)
api(Libs.KotlinX.datetime)
// This is necessary to avoid errors like these which otherwise come up often at runtime:
// "WARNING: Failed to transform class kotlinx/datetime/TimeZone$Companion
// java.lang.NoClassDefFoundError: kotlinx/serialization/KSerializer"
//
// "Rejecting re-init on(previously-failed class java.lang.Class<
// kotlinx.datetime.serializers.LocalDateTimeIso8601Serializer>:
// java.lang.NoClassDefFoundError: Failed resolution of: Lkotlinx/serialization/KSerializer"
//
// kotlinx-datetime higher than 0.2.0 depends on kotlinx-serialization, but that dependency
// is declared as "compileOnly". The runtime dependency on kotlinx-serialization is missing,
// causing this error. Solution is to add runtimeOnly here.
//
// Source: https://github.com/mockk/mockk/issues/685#issuecomment-907076353:
// TODO: Revisit this when upgrading kotlinx-datetime
runtimeOnly(Libs.KotlinX.serializationCore)
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,34 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'info.nightscout.comboctl'
sourceSets {
main {
kotlin.srcDirs += ['src/commonMain/kotlin', 'src/androidMain/kotlin']
manifest.srcFile 'src/androidMain/AndroidManifest.xml'
}
test {
kotlin.srcDirs += ['src/jvmTest/kotlin']
}
}
}
dependencies {
implementation platform("org.jetbrains.kotlin:kotlin-bom")
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-datetime:$kotlinx_datetime_version"
implementation "androidx.core:core-ktx:$core_version"
testImplementation 'org.jetbrains.kotlin:kotlin-test'
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit5'
testImplementation "io.kotlintest:kotlintest-runner-junit5:3.4.2"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junit_jupiter_version"
}

View file

@ -0,0 +1,30 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "info.nightscout.comboctl"
sourceSets.getByName("main") {
kotlin.srcDir("src/commonMain/kotlin")
kotlin.srcDir("src/androidMain/kotlin")
manifest.srcFile("src/androidMain/AndroidManifest.xml")
}
sourceSets.getByName("test") {
kotlin.srcDir("src/jvmTest/kotlin")
}
}
dependencies {
api(Libs.KotlinX.coroutinesCore)
api(Libs.KotlinX.datetime)
api(Libs.AndroidX.core)
testImplementation(kotlin("test"))
testImplementation(Libs.kotlinTestRunner)
testRuntimeOnly(Libs.JUnit.jupiterEngine)
}

View file

@ -1,41 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'info.nightscout.pump.dana'
defaultConfig {
kapt {
arguments {
arg("room.incremental", "true")
arg("room.schemaLocation", "$projectDir/schemas")
}
}
}
}
dependencies {
implementation project(':core:libraries')
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:ui')
implementation project(':core:utils')
api "androidx.room:room-ktx:$room_version"
api "androidx.room:room-runtime:$room_version"
api "androidx.room:room-rxjava3:$room_version"
kapt "androidx.room:room-compiler:$room_version"
testImplementation project(':shared:tests')
testImplementation project(':core:main') // create profile from json
}

View file

@ -0,0 +1,40 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "info.nightscout.pump.dana"
defaultConfig {
kapt {
arguments {
arg("room.incremental", "true")
arg("room.schemaLocation", "$projectDir/schemas")
}
}
}
}
dependencies {
implementation(project(":core:libraries"))
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:ui"))
implementation(project(":core:utils"))
api(Libs.AndroidX.Room.room)
api(Libs.AndroidX.Room.runtime)
api(Libs.AndroidX.Room.rxJava3)
kapt(Libs.AndroidX.Room.compiler)
testImplementation(project(":shared:tests"))
testImplementation(project(":core:main")) // create profile from json
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

View file

@ -1,29 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'info.nightscout.androidaps.danar'
}
dependencies {
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:utils')
implementation project(':core:ui')
implementation project(':core:validators')
implementation project(':pump:dana')
api 'androidx.media3:media3-common:1.1.1'
testImplementation project(':shared:tests')
testImplementation project(':core:main')
}

View file

@ -0,0 +1,29 @@
plugins {
id("com.android.library")
id("kotlin-android")
id("kotlin-kapt")
id("android-module-dependencies")
id("test-module-dependencies")
id("jacoco-module-dependencies")
}
android {
namespace = "info.nightscout.androidaps.danar"
}
dependencies {
implementation(project(":core:interfaces"))
implementation(project(":core:main"))
implementation(project(":core:utils"))
implementation(project(":core:ui"))
implementation(project(":core:validators"))
implementation(project(":pump:dana"))
api(Libs.AndroidX.media3)
testImplementation(project(":shared:tests"))
testImplementation(project(":core:main"))
kapt(Libs.Dagger.compiler)
kapt(Libs.Dagger.androidProcessor)
}

Some files were not shown because too many files have changed in this diff Show more