mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-12-27 11:05:49 +01:00
4c4ba623c4
This is to support watches with remote shutter applets that do not act as remote triggers for other apps automatically.
390 lines
13 KiB
Groovy
390 lines
13 KiB
Groovy
import com.github.spotbugs.SpotBugsTask
|
|
|
|
import java.nio.file.Files
|
|
|
|
apply plugin: "com.android.application"
|
|
apply plugin: "com.github.spotbugs"
|
|
apply plugin: "pmd"
|
|
apply plugin: 'com.google.protobuf'
|
|
|
|
def ABORT_ON_CHECK_FAILURE = true
|
|
|
|
tasks.withType(Test) {
|
|
systemProperty "MiFirmwareDir", System.getProperty("MiFirmwareDir", null)
|
|
systemProperty "logback.configurationFile", System.getProperty("user.dir", null) + "/app/src/main/assets/logback.xml"
|
|
systemProperty "GB_LOGFILES_DIR", Files.createTempDirectory("gblog").toString()
|
|
}
|
|
|
|
def getVersionCode = { ->
|
|
try {
|
|
def stdout = new ByteArrayOutputStream()
|
|
exec {
|
|
commandLine 'git', 'rev-list', 'HEAD', '--count'
|
|
standardOutput = stdout
|
|
}
|
|
return Integer.valueOf(stdout.toString().trim())
|
|
} catch (ignored) {
|
|
return null
|
|
}
|
|
}
|
|
|
|
def buildGitChangelog = {
|
|
def stdout = new ByteArrayOutputStream()
|
|
exec {
|
|
commandLine 'git', 'log', '--pretty=format:%h %s'
|
|
standardOutput = stdout
|
|
}
|
|
|
|
def commitVersionCode = getVersionCode()
|
|
def includedCommits = 0
|
|
def changelogNode = new Node(null, 'changelog')
|
|
|
|
stdout.toString().trim().eachLine { line ->
|
|
if (includedCommits > 100) {
|
|
return true;
|
|
}
|
|
|
|
def (commitHash, commitMessage) = line.split(" ", 2)
|
|
if (commitMessage.contains("Translated using Weblate")) {
|
|
return true;
|
|
}
|
|
|
|
def releaseNode = new Node(changelogNode, 'release', [version: commitHash, versioncode: commitVersionCode--])
|
|
def _ = new Node(releaseNode, 'change', [:], commitMessage)
|
|
includedCommits++
|
|
}
|
|
|
|
def changelogFile = new File("${project.rootDir}/app/build/generated/res/changelog/xml/changelog_git.xml")
|
|
changelogFile.getParentFile().mkdirs()
|
|
changelogFile.write(groovy.xml.XmlUtil.serialize(changelogNode))
|
|
}
|
|
|
|
def getGitHashShort = { ->
|
|
try {
|
|
def stdout = new ByteArrayOutputStream()
|
|
exec {
|
|
commandLine 'git', 'rev-parse', '--short', 'HEAD'
|
|
standardOutput = stdout
|
|
}
|
|
return stdout.toString().trim()
|
|
} catch (ignored) {
|
|
return null
|
|
}
|
|
}
|
|
|
|
android {
|
|
compileOptions {
|
|
// for Android 5+
|
|
sourceCompatibility JavaVersion.VERSION_1_8
|
|
targetCompatibility JavaVersion.VERSION_1_8
|
|
}
|
|
|
|
namespace 'nodomain.freeyourgadget.gadgetbridge'
|
|
|
|
defaultConfig {
|
|
applicationId "nodomain.freeyourgadget.gadgetbridge"
|
|
|
|
//noinspection OldTargetApi
|
|
targetSdkVersion 33
|
|
compileSdk 33
|
|
minSdkVersion 21
|
|
|
|
// Note: always bump BOTH versionCode and versionName!
|
|
versionName "0.80.0"
|
|
versionCode 231
|
|
vectorDrawables.useSupportLibrary = true
|
|
buildConfigField "String", "GIT_HASH_SHORT", "\"${getGitHashShort()}\""
|
|
buildConfigField "boolean", "INTERNET_ACCESS", "false"
|
|
}
|
|
|
|
signingConfigs {
|
|
nightly {
|
|
if (System.getProperty("nightly_store_file") != null) {
|
|
storeFile file(System.getProperty("nightly_store_file"))
|
|
storePassword System.getProperty("nightly_store_password")
|
|
keyAlias System.getProperty("nightly_key_alias")
|
|
keyPassword System.getProperty("nightly_key_password")
|
|
}
|
|
}
|
|
}
|
|
|
|
flavorDimensions "device_type"
|
|
productFlavors {
|
|
mainline {
|
|
// Ensure that when starting from scratch, 'mainline' is selected, not 'banglejs'
|
|
getIsDefault().set(true)
|
|
// the default build product flavor
|
|
dimension "device_type"
|
|
//applicationIdSuffix ""
|
|
//versionNameSuffix ""
|
|
}
|
|
|
|
banglejs {
|
|
dimension "device_type"
|
|
applicationId "com.espruino.gadgetbridge"
|
|
applicationIdSuffix ".banglejs"
|
|
versionNameSuffix "-banglejs"
|
|
buildConfigField "boolean", "INTERNET_ACCESS", "true"
|
|
targetSdkVersion 33
|
|
// Note: app/src/banglejs/AndroidManifest.xml contains some extra permissions
|
|
}
|
|
}
|
|
|
|
sourceSets {
|
|
main {
|
|
res.srcDirs += "build/generated/res/changelog"
|
|
}
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
minifyEnabled true
|
|
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
|
}
|
|
|
|
nightly {
|
|
applicationIdSuffix ".nightly"
|
|
versionNameSuffix "-${getGitHashShort}"
|
|
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
|
minifyEnabled true
|
|
debuggable true
|
|
|
|
if (System.getProperty("nightly_store_file") != null) {
|
|
signingConfig signingConfigs.nightly
|
|
} else {
|
|
signingConfig signingConfigs.debug
|
|
}
|
|
}
|
|
|
|
nopebble {
|
|
applicationIdSuffix ".nightly_nopebble"
|
|
versionNameSuffix "-${getGitHashShort}"
|
|
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
|
minifyEnabled true
|
|
debuggable true
|
|
|
|
if (System.getProperty("nightly_store_file") != null) {
|
|
signingConfig signingConfigs.nightly
|
|
} else {
|
|
signingConfig signingConfigs.debug
|
|
}
|
|
}
|
|
|
|
applicationVariants.all { variant ->
|
|
variant.resValue "string", "applicationId", variant.applicationId
|
|
buildGitChangelog()
|
|
|
|
if (variant.buildType.name == 'nightly' || variant.buildType.name == 'nopebble') {
|
|
variant.outputs.all {
|
|
setVersionCodeOverride(getVersionCode())
|
|
//setVersionNameOverride(getGitHashShort())
|
|
setVersionNameOverride(variant.versionName)
|
|
outputFileName = "${applicationId}_${variant.versionName}.apk"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
lint {
|
|
abortOnError ABORT_ON_CHECK_FAILURE
|
|
lintConfig file("$rootDir/app/src/main/lint.xml")
|
|
// If true, generate an HTML report (with issue explanations, sourcecode, etc)
|
|
htmlReport true
|
|
// Optional path to report (default will be lint-results.html in the builddir)
|
|
htmlOutput file("$project.buildDir/reports/lint/lint.html")
|
|
// Ignore checks present in the snapshot
|
|
baseline file("lint-baseline.xml")
|
|
}
|
|
|
|
testOptions {
|
|
unitTests {
|
|
returnDefaultValues = true
|
|
includeAndroidResources = true
|
|
}
|
|
}
|
|
}
|
|
|
|
pmd {
|
|
toolVersion = "5.5.5"
|
|
}
|
|
|
|
dependencies {
|
|
// testImplementation "ch.qos.logback:logback-classic:1.1.3"
|
|
// testImplementation "ch.qos.logback:logback-core:1.1.3"
|
|
implementation 'com.android.support.constraint:constraint-layout:2.0.4'
|
|
implementation "androidx.camera:camera-core:1.2.3"
|
|
implementation "androidx.camera:camera-camera2:1.2.3"
|
|
implementation 'androidx.camera:camera-view:1.2.3'
|
|
implementation 'androidx.camera:camera-lifecycle:1.2.3'
|
|
testImplementation "junit:junit:4.13.2"
|
|
testImplementation "org.mockito:mockito-core:2.28.2"
|
|
testImplementation "org.robolectric:robolectric:4.12"
|
|
testImplementation "org.hamcrest:hamcrest-library:2.2"
|
|
testImplementation "com.google.code.gson:gson:2.8.9"
|
|
|
|
implementation fileTree(dir: "libs", include: ["*.jar"])
|
|
implementation "androidx.appcompat:appcompat:1.6.1"
|
|
implementation "androidx.preference:preference:1.2.1"
|
|
implementation "androidx.cardview:cardview:1.0.0"
|
|
implementation "androidx.recyclerview:recyclerview:1.3.2"
|
|
implementation "androidx.legacy:legacy-support-v4:1.0.0"
|
|
implementation "androidx.gridlayout:gridlayout:1.0.0"
|
|
implementation "androidx.palette:palette:1.0.0"
|
|
implementation "androidx.activity:activity:1.7.2"
|
|
implementation "androidx.fragment:fragment:1.6.2"
|
|
implementation "androidx.viewpager2:viewpager2:1.0.0"
|
|
|
|
implementation "com.google.android.material:material:1.9.0"
|
|
implementation 'com.google.android.flexbox:flexbox:3.0.0'
|
|
implementation "com.google.code.gson:gson:2.8.9"
|
|
|
|
implementation "no.nordicsemi.android:dfu:1.12.0"
|
|
implementation("com.github.tony19:logback-android:2.0.0") {
|
|
exclude group: "com.google.android", module: "android"
|
|
}
|
|
implementation "org.slf4j:slf4j-api:1.7.36"
|
|
implementation "com.github.PhilJay:MPAndroidChart:v3.1.0"
|
|
implementation "com.github.pfichtner:durationformatter:0.1.1"
|
|
implementation "de.cketti.library.changelog:ckchangelog:1.2.2"
|
|
implementation "net.e175.klaus:solarpositioning:0.0.9"
|
|
implementation "co.nstant.in:cbor:0.9"
|
|
// use pristine greendao instead of our custom version, since our custom jitpack-packaged
|
|
// version contains way too much and our custom patches are in the generator only.
|
|
implementation "org.greenrobot:greendao:2.2.1"
|
|
implementation "org.apache.commons:commons-lang3:3.7"
|
|
implementation "org.cyanogenmod:platform.sdk:6.0"
|
|
implementation 'com.jaredrummler:colorpicker:1.0.2'
|
|
// implementation project(":DaoCore")
|
|
implementation 'com.github.wax911:android-emojify:0.1.7'
|
|
implementation 'com.google.protobuf:protobuf-javalite:3.25.3'
|
|
implementation 'com.android.volley:volley:1.2.1'
|
|
|
|
// Bouncy Castle is included directly in GB, to avoid pulling the entire dependency
|
|
// It's included in the org.bouncycastle.shaded package, to fix conflicts with
|
|
// roboelectric
|
|
//implementation 'org.bouncycastle:bcpkix-jdk18on:1.76'
|
|
//implementation 'org.bouncycastle:bcprov-jdk18on:1.76'
|
|
|
|
// NON-FOSS dependencies
|
|
// implementation('androidx.core:core-google-shortcuts:1.0.1') {
|
|
// exclude group:'com.google.android.gms'
|
|
// exclude group:'com.google.firebase'
|
|
// }
|
|
|
|
// JSR-310 timezones backport for Android, since we're still API 21
|
|
implementation 'com.jakewharton.threetenabp:threetenabp:1.4.7'
|
|
testImplementation 'org.threeten:threetenbp:1.6.9'
|
|
|
|
// Android SDK bundles org.json, but we need an actual implementation to replace the stubs in tests
|
|
testImplementation 'org.json:json:20240303'
|
|
|
|
// Fix Duplicate class build error
|
|
implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))
|
|
|
|
// Needed for Armenian transliteration
|
|
implementation group: 'org.ahocorasick', name: 'ahocorasick', version: '0.6.3'
|
|
}
|
|
|
|
preBuild.dependsOn(":GBDaoGenerator:genSources")
|
|
|
|
gradle.beforeProject {
|
|
preBuild.dependsOn(":GBDaoGenerator:genSources")
|
|
}
|
|
|
|
check.dependsOn "spotbugsMain", "pmd", "lint"
|
|
|
|
task pmd(type: Pmd) {
|
|
ruleSetFiles = files("${project.rootDir}/config/pmd/pmd-ruleset.xml")
|
|
ignoreFailures = !ABORT_ON_CHECK_FAILURE
|
|
ruleSets = [
|
|
"java-android",
|
|
"java-basic",
|
|
"java-braces",
|
|
"java-clone",
|
|
"java-codesize",
|
|
"java-controversial",
|
|
"java-coupling",
|
|
"java-design",
|
|
"java-empty",
|
|
"java-finalizers",
|
|
"java-imports",
|
|
"java-junit",
|
|
"java-optimizations",
|
|
"java-strictexception",
|
|
"java-strings",
|
|
"java-sunsecure",
|
|
"java-typeresolution",
|
|
"java-unnecessary",
|
|
"java-unusedcode"
|
|
]
|
|
|
|
source "src"
|
|
include "**/*.java"
|
|
exclude "**/gen/**"
|
|
|
|
reports {
|
|
xml.enabled = false
|
|
html.enabled = true
|
|
xml {
|
|
destination file("$project.buildDir/reports/pmd/pmd.xml")
|
|
}
|
|
html {
|
|
destination file("$project.buildDir/reports/pmd/pmd.html")
|
|
}
|
|
}
|
|
}
|
|
|
|
sourceSets {
|
|
main {
|
|
java.srcDirs += "${protobuf.generatedFilesBaseDir}"
|
|
java.srcDirs += "build/generated/source/buildConfig"
|
|
}
|
|
}
|
|
|
|
spotbugs {
|
|
toolVersion = "3.1.12"
|
|
ignoreFailures = !ABORT_ON_CHECK_FAILURE
|
|
effort = "default"
|
|
reportLevel = "medium"
|
|
}
|
|
|
|
tasks.withType(SpotBugsTask) {
|
|
source = fileTree('src/main/java')
|
|
classes = files("${project.rootDir}/app/build/intermediates/javac/debug/classes")
|
|
excludeFilter = new File("${project.rootDir}/config/findbugs/findbugs-filter.xml")
|
|
reports {
|
|
xml.enabled = false
|
|
html.enabled = true
|
|
xml {
|
|
destination file("$project.buildDir/reports/spotbugs/spotbugs-output.xml")
|
|
}
|
|
html {
|
|
destination file("$project.buildDir/reports/spotbugs/spotbugs-output.html")
|
|
}
|
|
}
|
|
}
|
|
|
|
task cleanGenerated(type: Delete) {
|
|
delete fileTree('src/main/java/nodomain/freeyourgadget/gadgetbridge/entities') {
|
|
include '**/*.java'
|
|
exclude '**/Abstract*.java'
|
|
}
|
|
}
|
|
|
|
tasks.clean.dependsOn(tasks.cleanGenerated)
|
|
|
|
protobuf {
|
|
protoc {
|
|
artifact = 'com.google.protobuf:protoc:3.25.3'
|
|
}
|
|
generateProtoTasks {
|
|
all().each { task ->
|
|
task.builtins {
|
|
java {
|
|
option 'lite'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|