mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-11 18:29:05 +01:00
If an Android module depends on another module's default configuration, Android Studio's linter won't recognise references to classes in the other module. Instead, the Android module must depend on the other module without specifying a configuration. This entails some changes in the handling of transitive dependencies, and the other module must include its main classes in its testOutput artifact so the Android module's tests can use them.
222 lines
7.6 KiB
Groovy
222 lines
7.6 KiB
Groovy
apply plugin: 'com.android.application'
|
|
apply plugin: 'witness'
|
|
apply from: 'witness.gradle'
|
|
|
|
def getStdout = { command, defaultValue ->
|
|
def stdout = new ByteArrayOutputStream()
|
|
try {
|
|
exec {
|
|
commandLine = command
|
|
standardOutput = stdout
|
|
}
|
|
return stdout.toString().trim()
|
|
} catch (Exception ignored) {
|
|
return defaultValue
|
|
}
|
|
}
|
|
|
|
android {
|
|
compileSdkVersion 33
|
|
buildToolsVersion '33.0.0'
|
|
|
|
packagingOptions {
|
|
doNotStrip '**/*.so'
|
|
}
|
|
|
|
defaultConfig {
|
|
minSdkVersion 16
|
|
targetSdkVersion 31
|
|
versionCode 10417
|
|
versionName "1.4.17"
|
|
applicationId "org.briarproject.briar.android"
|
|
buildConfigField "String", "TorVersion", "\"$tor_version\""
|
|
|
|
vectorDrawables.useSupportLibrary = true
|
|
buildConfigField "String", "GitHash",
|
|
"\"${getStdout(['git', 'rev-parse', '--short=7', 'HEAD'], 'No commit hash')}\""
|
|
def now = (long) (System.currentTimeMillis() / 1000)
|
|
buildConfigField "Long", "BuildTimestamp",
|
|
"${getStdout(['git', 'log', '-n', '1', '--format=%ct'], now)}000L"
|
|
testInstrumentationRunner 'org.briarproject.briar.android.BriarTestRunner'
|
|
testInstrumentationRunnerArguments disableAnalytics: 'true'
|
|
}
|
|
|
|
buildTypes {
|
|
debug {
|
|
applicationIdSuffix ".debug"
|
|
shrinkResources false
|
|
minifyEnabled true
|
|
crunchPngs false
|
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
|
|
testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt', 'proguard-test.txt'
|
|
}
|
|
release {
|
|
shrinkResources false
|
|
minifyEnabled true
|
|
crunchPngs false
|
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
|
|
}
|
|
}
|
|
|
|
flavorDimensions "version"
|
|
productFlavors {
|
|
screenshot {
|
|
dimension "version"
|
|
minSdkVersion 21
|
|
applicationIdSuffix ".screenshot" // = org.briarproject.briar.android.screenshot.debug
|
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt', 'proguard-test.txt'
|
|
}
|
|
official {
|
|
dimension "version"
|
|
}
|
|
}
|
|
variantFilter { variant ->
|
|
if (variant.flavors*.name.contains("screenshot") && variant.buildType.name == "release") {
|
|
setIgnore(true)
|
|
}
|
|
}
|
|
|
|
compileOptions {
|
|
sourceCompatibility JavaVersion.VERSION_1_8
|
|
targetCompatibility JavaVersion.VERSION_1_8
|
|
}
|
|
|
|
testOptions {
|
|
execution 'ANDROIDX_TEST_ORCHESTRATOR'
|
|
unitTests {
|
|
includeAndroidResources = true
|
|
}
|
|
}
|
|
|
|
lintOptions {
|
|
warning 'MissingTranslation'
|
|
warning 'ImpliedQuantity'
|
|
warning 'ExtraTranslation'
|
|
// FIXME
|
|
warning 'InvalidPackage'
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
// To satisfy Android Studio's linter, an Android module that depends on another module must
|
|
// not specify which configuration of the other module it depends on. Therefore we don't
|
|
// inherit implementation dependencies of the other module and must declare any such
|
|
// dependencies we want to use.
|
|
implementation project(':bramble-api')
|
|
implementation project(':bramble-core')
|
|
implementation project(':bramble-android')
|
|
implementation project(':briar-api')
|
|
implementation project(':briar-core')
|
|
|
|
implementation 'androidx.fragment:fragment:1.3.4'
|
|
implementation 'androidx.preference:preference:1.1.1'
|
|
implementation 'androidx.exifinterface:exifinterface:1.3.3'
|
|
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
|
|
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
|
implementation 'com.google.android.material:material:1.3.0'
|
|
implementation 'androidx.recyclerview:recyclerview-selection:1.1.0'
|
|
|
|
implementation 'org.briarproject:dont-kill-me-lib:0.2.5'
|
|
implementation "com.google.dagger:dagger:$dagger_version"
|
|
//noinspection GradleDependency
|
|
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
|
|
implementation "org.jsoup:jsoup:$jsoup_version"
|
|
implementation 'info.guardianproject.panic:panic:1.0'
|
|
implementation 'de.hdodenhof:circleimageview:3.1.0'
|
|
implementation 'com.google.zxing:core:3.3.3' // newer version need minSdk 24
|
|
implementation 'uk.co.samuelwall:material-tap-target-prompt:3.3.0'
|
|
implementation 'com.vanniktech:emoji-google:0.7.0' // newer versions need minSdk 21
|
|
implementation 'com.github.kobakei:MaterialFabSpeedDial:1.2.1'
|
|
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
|
|
def glideVersion = '4.12.0'
|
|
implementation("com.github.bumptech.glide:glide:$glideVersion") {
|
|
exclude group: 'com.android.support'
|
|
exclude module: 'disklrucache' // when there's no disk cache, we can't accidentally use it
|
|
}
|
|
implementation 'org.nanohttpd:nanohttpd:2.3.1'
|
|
|
|
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
|
annotationProcessor "com.github.bumptech.glide:compiler:$glideVersion"
|
|
|
|
compileOnly 'javax.annotation:jsr250-api:1.0'
|
|
|
|
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
|
|
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
|
|
|
|
def espressoVersion = '3.3.0'
|
|
testImplementation 'androidx.test:runner:1.4.0'
|
|
testImplementation 'androidx.test.ext:junit:1.1.3'
|
|
testImplementation 'androidx.fragment:fragment-testing:1.4.0'
|
|
testImplementation "androidx.arch.core:core-testing:2.1.0"
|
|
testImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
|
|
testImplementation 'org.robolectric:robolectric:4.4'
|
|
testImplementation 'org.mockito:mockito-core:3.9.0'
|
|
testImplementation "junit:junit:$junit_version"
|
|
testImplementation "org.jmock:jmock:$jmock_version"
|
|
testImplementation "org.jmock:jmock-junit4:$jmock_version"
|
|
testImplementation "org.jmock:jmock-imposters:$jmock_version"
|
|
|
|
testAnnotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
|
|
|
androidTestImplementation project(path: ':bramble-api', configuration: 'testOutput')
|
|
|
|
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
|
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
|
|
androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion"
|
|
androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion"
|
|
androidTestImplementation 'androidx.test:runner:1.3.0'
|
|
androidTestImplementation "junit:junit:$junit_version"
|
|
|
|
androidTestUtil 'androidx.test:orchestrator:1.3.0'
|
|
|
|
androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
|
|
|
|
androidTestCompileOnly 'javax.annotation:jsr250-api:1.0'
|
|
|
|
androidTestScreenshotImplementation 'tools.fastlane:screengrab:2.1.1'
|
|
androidTestScreenshotImplementation 'com.jraska:falcon:2.2.0'
|
|
androidTestScreenshotImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
|
|
}
|
|
|
|
task verifyTranslations {
|
|
doLast {
|
|
def file = project.file("src/main/res/values/arrays.xml")
|
|
def arrays = new XmlParser().parse(file)
|
|
def lc = arrays.children().find { it.@name == "pref_language_values" }
|
|
def translations = []
|
|
lc.children().each { value -> translations.add(value.text()) }
|
|
|
|
def folders = ["default", "en-US"]
|
|
def exceptions = ["values-night", "values-v21", "values-v31", "values-ldrtl"]
|
|
project.file("src/main/res").eachDir { dir ->
|
|
if (dir.name.startsWith("values-") && !exceptions.contains(dir.name)) {
|
|
folders.add(dir.name.substring(7).replace("-r", "-"))
|
|
}
|
|
}
|
|
folders.each { n ->
|
|
if (!translations.remove(n) && n != 'iw') {
|
|
throw new GradleException("Translation " + n + " is missing in $file")
|
|
}
|
|
}
|
|
if (translations.size() != 0)
|
|
throw new GradleException("Translations\n" + translations.join("\n")
|
|
+ "\nhave no matching value folder")
|
|
|
|
// Some devices use iw instead of he for hebrew
|
|
def hebrew_legacy = project.file("src/main/res/values-iw")
|
|
def hebrew = project.file("src/main/res/values-he")
|
|
// Copy values-he to values-iw
|
|
if (hebrew.exists()) {
|
|
hebrew_legacy.mkdir()
|
|
copy {
|
|
from hebrew.getAbsolutePath()
|
|
into hebrew_legacy.getAbsolutePath()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
project.afterEvaluate {
|
|
preBuild.dependsOn.add(verifyTranslations)
|
|
}
|