session-android/build.gradle

452 lines
17 KiB
Groovy
Raw Normal View History

import java.security.MessageDigest
buildscript {
2019-05-31 14:26:14 +10:00
ext.kotlin_version = "1.3.31"
2019-06-07 15:21:25 +10:00
ext.kovenant_version = "3.3.0"
repositories {
mavenLocal()
google()
2019-05-31 14:26:14 +10:00
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:3.4.1"
classpath files('libs/gradle-witness.jar')
2019-05-29 14:25:19 +10:00
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.google.gms:google-services:4.3.3"
}
}
2014-07-23 15:40:45 -07:00
apply plugin: 'com.android.application'
2019-05-29 14:25:19 +10:00
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
apply plugin: 'witness'
2019-12-19 11:15:58 +01:00
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.gms.google-services'
repositories {
2019-07-17 11:40:30 +10:00
mavenLocal()
maven {
url "https://raw.github.com/signalapp/maven/master/photoview/releases/"
2019-01-25 18:23:00 -08:00
content {
includeGroupByRegex "com\\.github\\.chrisbanes.*"
}
}
maven {
url "https://raw.github.com/signalapp/maven/master/shortcutbadger/releases/"
2019-01-25 18:23:00 -08:00
content {
includeGroupByRegex "me\\.leolin.*"
}
}
maven {
url "https://raw.github.com/signalapp/maven/master/circular-progress-button/releases/"
2019-01-25 18:23:00 -08:00
content {
includeGroupByRegex "com\\.github\\.dmytrodanylyk\\.circular-progress-button\\.*"
}
}
maven {
url "https://raw.github.com/signalapp/maven/master/sqlcipher/release/"
2019-01-25 18:23:00 -08:00
content {
includeGroupByRegex "org\\.signal.*"
}
}
maven { // textdrawable
url 'https://dl.bintray.com/amulyakhare/maven'
2019-01-25 18:23:00 -08:00
content {
includeGroupByRegex "com\\.amulyakhare.*"
}
}
google()
2015-01-23 18:38:45 -10:00
jcenter()
2019-09-06 14:00:36 +10:00
maven { url "https://jitpack.io" }
}
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
exclude group: "org.whispersystems", module: "signal-protocol-java"
exclude group: "org.whispersystems", module: "signal-protocol-android"
exclude group: "org.signal", module: "signal-metadata-java"
exclude group: "org.signal", module: "signal-metadata-android"
2020-06-04 21:36:22 +10:00
exclude module: "commons-logging"
}
dependencies {
2020-08-19 10:42:46 +10:00
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.android.material:material:1.2.0'
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
2020-08-19 10:42:46 +10:00
implementation 'androidx.preference:preference:1.1.1'
implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
implementation 'androidx.gridlayout:gridlayout:1.0.0'
2020-08-19 10:42:46 +10:00
implementation 'androidx.exifinterface:exifinterface:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
2020-08-19 10:42:46 +10:00
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-common-java8:2.2.0'
2019-06-03 16:25:02 +10:00
implementation ("com.google.firebase:firebase-messaging:18.0.0") {
2020-06-09 15:24:28 +10:00
exclude group: 'com.google.firebase', module: 'firebase-core'
exclude group: 'com.google.firebase', module: 'firebase-analytics'
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
2020-06-04 14:17:44 +10:00
}
2019-06-03 16:25:02 +10:00
implementation 'com.google.android.exoplayer:exoplayer-core:2.9.1'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.9.1'
implementation 'org.conscrypt:conscrypt-android:2.0.0'
implementation 'org.signal:aesgcmprovider:0.0.3'
implementation 'org.whispersystems:webrtc-android:M74'
implementation "me.leolin:ShortcutBadger:1.1.16"
implementation 'se.emilsjolander:stickylistheaders:2.7.0'
implementation 'com.jpardogo.materialtabstrip:library:1.0.9'
implementation 'org.apache.httpcomponents:httpclient-android:4.3.5'
implementation 'com.github.chrisbanes:PhotoView:2.1.3'
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
kapt 'com.github.bumptech.glide:compiler:4.11.0'
2019-06-03 16:25:02 +10:00
implementation 'com.makeramen:roundedimageview:2.1.0'
implementation 'com.pnikosis:materialish-progress:1.5'
implementation 'org.greenrobot:eventbus:3.0.0'
implementation 'pl.tajchert:waitingdots:0.1.0'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0'
implementation 'com.melnykov:floatingactionbutton:1.3.0'
implementation 'com.google.zxing:android-integration:3.1.0'
implementation 'com.squareup.dagger:dagger:1.2.2'
2017-11-06 09:20:52 -08:00
annotationProcessor 'com.squareup.dagger:dagger-compiler:1.2.2'
2019-06-03 16:25:02 +10:00
implementation 'mobi.upod:time-duration-picker:1.1.3'
2019-01-25 18:23:00 -08:00
compileOnly 'com.squareup.dagger:dagger-compiler:1.2.2'
2019-06-03 16:25:02 +10:00
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
implementation 'com.google.zxing:core:3.2.1'
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.6.0') {
exclude group: 'com.android.support', module: 'support-annotations'
}
2019-06-03 16:25:02 +10:00
implementation ('cn.carbswang.android:NumberPickerView:1.0.9') {
exclude group: 'com.android.support', module: 'appcompat-v7'
}
2019-06-03 16:25:02 +10:00
implementation ('com.tomergoldst.android:tooltips:1.0.6') {
exclude group: 'com.android.support', module: 'appcompat-v7'
}
2019-06-03 16:25:02 +10:00
implementation ('com.klinkerapps:android-smsmms:4.0.1') {
exclude group: 'com.squareup.okhttp', module: 'okhttp'
exclude group: 'com.squareup.okhttp', module: 'okhttp-urlconnection'
}
2019-06-03 16:25:02 +10:00
implementation 'com.annimon:stream:1.1.8'
implementation ('com.takisoft.fix:colorpicker:0.9.1') {
exclude group: 'com.android.support', module: 'appcompat-v7'
exclude group: 'com.android.support', module: 'recyclerview-v7'
}
2019-06-03 16:25:02 +10:00
implementation 'com.codewaves.stickyheadergrid:stickyheadergrid:0.9.4'
implementation 'com.github.dmytrodanylyk.circular-progress-button:library:1.1.3-S2'
implementation 'org.signal:android-database-sqlcipher:3.5.9-S3'
implementation ('com.googlecode.ez-vcard:ez-vcard:0.9.11') {
exclude group: 'com.fasterxml.jackson.core'
exclude group: 'org.freemarker'
}
2019-01-25 18:23:00 -08:00
testImplementation 'junit:junit:4.12'
testImplementation 'org.assertj:assertj-core:3.11.1'
2019-01-25 18:23:00 -08:00
testImplementation 'org.mockito:mockito-core:1.9.5'
testImplementation 'org.powermock:powermock-api-mockito:1.6.1'
testImplementation 'org.powermock:powermock-module-junit4:1.6.1'
testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.1'
testImplementation 'org.powermock:powermock-classloading-xstream:1.6.1'
2020-08-19 10:42:46 +10:00
testImplementation 'androidx.test:core:1.3.0-rc03'
androidTestImplementation 'androidx.multidex:multidex:2.0.1'
androidTestImplementation 'androidx.multidex:multidex-instrumentation:2.0.0'
2019-01-25 18:23:00 -08:00
androidTestImplementation 'com.google.dexmaker:dexmaker:1.2'
androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.2'
androidTestImplementation ('org.assertj:assertj-core:1.7.1') {
exclude group: 'org.hamcrest', module: 'hamcrest-core'
}
2019-01-25 18:23:00 -08:00
androidTestImplementation ('com.squareup.assertj:assertj-android:1.1.1') {
exclude group: 'org.hamcrest', module: 'hamcrest-core'
exclude group: 'com.android.support', module: 'support-annotations'
}
testImplementation 'org.robolectric:robolectric:4.2'
testImplementation 'org.robolectric:shadows-multidex:4.2'
2019-07-17 11:40:30 +10:00
// Loki
2019-08-29 10:03:31 +10:00
// Local:
2020-08-19 10:42:46 +10:00
implementation "org.whispersystems:signal-service-android:2.13.2" // Run ./gradlew install from session-android-service to install
implementation "org.whispersystems:curve25519-java:0.5.0"
2019-08-29 10:03:31 +10:00
// Remote:
2019-07-17 11:40:30 +10:00
implementation "com.google.protobuf:protobuf-java:2.5.0"
implementation "com.fasterxml.jackson.core:jackson-databind:2.9.8"
implementation "com.squareup.okhttp3:okhttp:3.12.1"
2019-05-29 14:25:19 +10:00
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
2019-06-07 15:21:25 +10:00
implementation "nl.komponents.kovenant:kovenant:$kovenant_version"
2019-09-19 15:00:52 +10:00
implementation "nl.komponents.kovenant:kovenant-android:$kovenant_version"
implementation "com.github.lelloman:android-identicons:v11"
implementation "com.prof.rssparser:rssparser:2.0.4"
implementation "com.jakewharton.rxbinding3:rxbinding:3.1.0"
implementation "com.github.tbruyelle:rxpermissions:0.10.2"
2020-01-07 14:51:11 +11:00
implementation "com.github.ybq:Android-SpinKit:1.4.0"
implementation "com.opencsv:opencsv:4.6"
}
2020-08-06 12:24:22 +10:00
def canonicalVersionCode = 65
2020-08-05 09:32:39 +10:00
def canonicalVersionName = "1.4.1"
def postFixSize = 10
def abiPostFix = ['armeabi-v7a' : 1,
'arm64-v8a' : 2,
'x86' : 3,
'x86_64' : 4,
'universal' : 5]
android {
2017-11-06 09:20:52 -08:00
flavorDimensions "none"
compileSdkVersion 29
2019-01-25 18:23:00 -08:00
buildToolsVersion '28.0.3'
useLibrary 'org.apache.http.legacy'
dexOptions {
javaMaxHeapSize "4g"
}
defaultConfig {
versionCode canonicalVersionCode * postFixSize
versionName canonicalVersionName
2019-07-22 12:13:53 +10:00
minSdkVersion 21
targetSdkVersion 29
2017-01-08 09:43:43 -08:00
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
project.ext.set("archivesBaseName", "Signal")
buildConfigField "long", "BUILD_TIMESTAMP", getLastCommitTimestamp() + "L"
2020-02-01 12:30:56 +11:00
buildConfigField "String", "SIGNAL_URL", "\"\""
buildConfigField "String", "SIGNAL_CDN_URL", "\"\""
buildConfigField "String", "SIGNAL_CONTACT_DISCOVERY_URL", "\"\""
buildConfigField "String", "SIGNAL_SERVICE_STATUS_URL", "\"\""
2019-01-15 00:41:05 -08:00
buildConfigField "String", "CONTENT_PROXY_HOST", "\"contentproxy.signal.org\""
buildConfigField "int", "CONTENT_PROXY_PORT", "443"
buildConfigField "String", "USER_AGENT", "\"OWA\""
buildConfigField "boolean", "DEV_BUILD", "false"
buildConfigField "String", "MRENCLAVE", "\"cd6cfc342937b23b1bdd3bbf9721aa5615ac9ff50a75c5527d441cd3276826c9\""
2018-10-11 16:45:22 -07:00
buildConfigField "String", "UNIDENTIFIED_SENDER_TRUST_ROOT", "\"BXu6QIKVz5MA8gstzfOgRQGqyLqOwNKHL6INkv3IHWMF\""
buildConfigField "String[]", "LANGUAGES", "new String[]{\"" + autoResConfig().collect { s -> s.replace('-r', '_') }.join('", "') + '"}'
buildConfigField "int", "CANONICAL_VERSION_CODE", "$canonicalVersionCode"
2018-02-02 16:31:49 -08:00
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
2018-02-02 16:31:49 -08:00
}
resConfigs autoResConfig()
2019-03-28 17:21:57 -03:00
splits {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
2019-03-28 17:21:57 -03:00
universalApk true
}
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
exclude 'LICENSE.txt'
exclude 'LICENSE'
exclude 'NOTICE'
exclude 'asm-license.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/proguard/androidx-annotations.pro'
}
buildTypes {
debug {
2015-01-20 21:26:58 -10:00
minifyEnabled true
2015-04-01 18:04:23 -07:00
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-dagger.pro',
'proguard-jackson.pro',
'proguard-sqlite.pro',
'proguard-appcompat-v7.pro',
'proguard-square-okhttp.pro',
'proguard-square-okio.pro',
'proguard-spongycastle.pro',
'proguard-rounded-image-view.pro',
'proguard-glide.pro',
'proguard-shortcutbadger.pro',
'proguard-retrofit.pro',
'proguard-webrtc.pro',
'proguard-klinker.pro',
'proguard-retrolambda.pro',
'proguard-okhttp.pro',
'proguard-ez-vcard.pro',
2015-04-01 18:04:23 -07:00
'proguard.cfg'
testProguardFiles 'proguard-automation.pro',
'proguard.cfg'
}
release {
2015-01-20 21:26:58 -10:00
minifyEnabled true
proguardFiles = buildTypes.debug.proguardFiles
}
}
2014-01-10 16:20:25 -10:00
productFlavors {
play {
2017-11-06 09:20:52 -08:00
dimension "none"
ext.websiteUpdateUrl = "null"
buildConfigField "boolean", "PLAY_STORE_DISABLED", "false"
buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl"
}
website {
2017-11-06 09:20:52 -08:00
dimension "none"
ext.websiteUpdateUrl = "https://updates.signal.org/android"
buildConfigField "boolean", "PLAY_STORE_DISABLED", "true"
buildConfigField "String", "NOPLAY_UPDATE_URL", "\"$ext.websiteUpdateUrl\""
}
}
2017-11-06 09:20:52 -08:00
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk")
def abiName = output.getFilter("ABI") ?: 'universal'
def postFix = abiPostFix.get(abiName, 0)
if (postFix >= postFixSize) throw new AssertionError("postFix is too large")
output.versionCodeOverride = canonicalVersionCode * postFixSize + postFix
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
androidTest {
java.srcDirs = ['test/androidTest/java']
}
test {
java.srcDirs = ['test/unitTest/java']
2019-03-28 08:56:35 -07:00
resources.srcDirs = ['test/unitTest/resources']
}
website.manifest.srcFile 'website/AndroidManifest.xml'
}
lintOptions {
abortOnError true
baseline file("lint-baseline.xml")
2014-01-10 16:20:25 -10:00
}
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
2018-10-26 10:54:12 -07:00
def assembleWebsiteDescriptor = { variant, file ->
if (file.exists()) {
MessageDigest md = MessageDigest.getInstance("SHA-256")
2018-10-26 10:54:12 -07:00
file.eachByte 4096, {bytes, size ->
md.update(bytes, 0, size)
}
2018-10-26 10:54:12 -07:00
String digest = md.digest().collect {String.format "%02x", it}.join()
2018-10-26 10:54:12 -07:00
String url = variant.productFlavors.get(0).ext.websiteUpdateUrl
String apkName = file.getName()
String descriptor = "{" +
"\"versionCode\" : $canonicalVersionCode," +
"\"versionName\" : \"$canonicalVersionName\"," +
2018-10-26 10:54:12 -07:00
"\"sha256sum\" : \"$digest\"," +
"\"url\" : \"$url/$apkName\"" +
"}"
File descriptorFile = new File(file.getParent(), apkName.replace(".apk", ".json"))
descriptorFile.write(descriptor)
}
}
2019-08-07 15:24:05 +10:00
/*
2018-10-26 10:54:12 -07:00
def signProductionRelease = { variant ->
2019-03-28 17:21:57 -03:00
variant.outputs.collect { output ->
String apkName = output.outputFile.name
File inputFile = new File(output.outputFile.path)
File outputFile = new File(output.outputFile.parent, apkName.replace('-unsigned', ''))
new ApkSignerUtil('sun.security.pkcs11.SunPKCS11',
'pkcs11.config',
'PKCS11',
'file:pkcs11.password').calculateSignature(inputFile.getAbsolutePath(),
outputFile.getAbsolutePath())
inputFile.delete()
outputFile
}
2018-10-26 10:54:12 -07:00
}
2019-01-25 18:23:00 -08:00
task signProductionPlayRelease {
doLast {
2019-03-28 17:21:57 -03:00
signProductionRelease(android.applicationVariants.find { (it.name == 'playRelease') })
2019-01-25 18:23:00 -08:00
}
2018-10-26 10:54:12 -07:00
}
2019-01-25 18:23:00 -08:00
task signProductionWebsiteRelease {
doLast {
2019-03-28 17:21:57 -03:00
def variant = android.applicationVariants.find { (it.name == 'websiteRelease') }
File signedRelease = signProductionRelease(variant).find { it.name.contains('universal') }
assembleWebsiteDescriptor(variant, signedRelease)
2019-01-25 18:23:00 -08:00
}
2018-10-26 10:54:12 -07:00
}
tasks.whenTaskAdded { task ->
2018-10-26 10:54:12 -07:00
if (task.name.equals("assemblePlayRelease")) {
task.finalizedBy signProductionPlayRelease
}
if (task.name.equals("assembleWebsiteRelease")) {
task.finalizedBy signProductionWebsiteRelease
}
}
2019-08-07 15:24:05 +10:00
*/
def getLastCommitTimestamp() {
new ByteArrayOutputStream().withStream { os ->
def result = exec {
executable = 'git'
args = ['log', '-1', '--pretty=format:%ct']
standardOutput = os
}
return os.toString() + "000"
}
}
/**
* Discovers supported languages listed as under the res/values- directory.
*/
static def autoResConfig() {
def files = new ArrayList<String>()
def root = new File('res')
root.eachFile { f -> files.add(f.name) }
['en'] + files.collect { f -> f =~ /^values-([a-z]{2}(-r[A-Z]{2})?)$/ }
.findAll { matcher -> matcher.find() }
.collect { matcher -> matcher.group(1) }
.sort()
}
2019-03-21 09:34:26 -03:00
task qa {
group 'Verification'
description 'Quality Assurance. Run before pushing.'
dependsOn ':testPlayReleaseUnitTest', ':lintPlayRelease', ':assemblePlayDebug'
2019-03-21 09:34:26 -03:00
}