import java.io.ByteArrayOutputStream import java.text.SimpleDateFormat import java.util.Date import kotlin.io.println 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") } apply(from = "${project.rootDir}/core/main/android_dependencies.gradle") apply(from = "${project.rootDir}/core/main/jacoco_global.gradle") apply(from = "${project.rootDir}/core/main/test_dependencies.gradle") 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 { multiDexEnabled = true versionCode = Versions.versionCode version = Versions.appVersion 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") { 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 dataBinding { enable } } 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: listOf("*.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(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") }