mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-25 02:55:23 +00:00
304679dac6
Updating strings Removed non crowdin strings Removed the locale wrapper as we do not support in app language changes
396 lines
17 KiB
Groovy
396 lines
17 KiB
Groovy
plugins {
|
|
id 'com.google.devtools.ksp'
|
|
id 'com.google.dagger.hilt.android'
|
|
}
|
|
|
|
apply plugin: 'com.android.application'
|
|
apply plugin: 'kotlin-android'
|
|
apply plugin: 'witness'
|
|
apply plugin: 'kotlin-parcelize'
|
|
apply plugin: 'kotlinx-serialization'
|
|
|
|
configurations.forEach {
|
|
it.exclude module: "commons-logging"
|
|
}
|
|
|
|
def canonicalVersionCode = 382
|
|
def canonicalVersionName = "1.20.0"
|
|
|
|
def postFixSize = 10
|
|
def abiPostFix = ['armeabi-v7a' : 1,
|
|
'arm64-v8a' : 2,
|
|
'x86' : 3,
|
|
'x86_64' : 4,
|
|
'universal' : 5]
|
|
|
|
// Function to get the current git commit hash so we can embed it along w/ the build version.
|
|
// Note: This is visible in the SettingsActivity, right at the bottom (R.id.versionTextView).
|
|
def getGitHash = { ->
|
|
def stdout = new ByteArrayOutputStream()
|
|
exec {
|
|
commandLine "git", "rev-parse", "--short", "HEAD"
|
|
standardOutput = stdout
|
|
}
|
|
return stdout.toString().trim()
|
|
}
|
|
|
|
android {
|
|
compileSdkVersion androidCompileSdkVersion
|
|
namespace 'network.loki.messenger'
|
|
useLibrary 'org.apache.http.legacy'
|
|
|
|
compileOptions {
|
|
sourceCompatibility JavaVersion.VERSION_1_8
|
|
targetCompatibility JavaVersion.VERSION_1_8
|
|
}
|
|
|
|
kotlinOptions {
|
|
jvmTarget = '1.8'
|
|
}
|
|
|
|
packagingOptions {
|
|
resources {
|
|
excludes += ['LICENSE.txt', 'LICENSE', 'NOTICE', 'asm-license.txt', 'META-INF/LICENSE', 'META-INF/NOTICE', 'META-INF/proguard/androidx-annotations.pro']
|
|
}
|
|
}
|
|
|
|
splits {
|
|
abi {
|
|
enable true
|
|
reset()
|
|
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
|
universalApk true
|
|
}
|
|
}
|
|
|
|
buildFeatures {
|
|
compose true
|
|
}
|
|
|
|
composeOptions {
|
|
kotlinCompilerExtensionVersion '1.5.14'
|
|
}
|
|
|
|
defaultConfig {
|
|
versionCode canonicalVersionCode * postFixSize
|
|
versionName canonicalVersionName
|
|
|
|
minSdkVersion androidMinimumSdkVersion
|
|
targetSdkVersion androidTargetSdkVersion
|
|
|
|
multiDexEnabled = true
|
|
|
|
vectorDrawables.useSupportLibrary = true
|
|
project.ext.set("archivesBaseName", "session")
|
|
|
|
buildConfigField "long", "BUILD_TIMESTAMP", getLastCommitTimestamp() + "L"
|
|
buildConfigField "String", "GIT_HASH", "\"$getGitHash\""
|
|
buildConfigField "String", "CONTENT_PROXY_HOST", "\"contentproxy.signal.org\""
|
|
buildConfigField "int", "CONTENT_PROXY_PORT", "443"
|
|
buildConfigField "String", "USER_AGENT", "\"OWA\""
|
|
buildConfigField "int", "CANONICAL_VERSION_CODE", "$canonicalVersionCode"
|
|
resourceConfigurations += []
|
|
|
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
// The following argument makes the Android Test Orchestrator run its
|
|
// "pm clear" command after each test invocation. This command ensures
|
|
// that the app's state is completely cleared between tests.
|
|
testInstrumentationRunnerArguments clearPackageData: 'true'
|
|
testOptions {
|
|
execution 'ANDROIDX_TEST_ORCHESTRATOR'
|
|
}
|
|
}
|
|
|
|
sourceSets {
|
|
String sharedTestDir = 'src/sharedTest/java'
|
|
test.java.srcDirs += sharedTestDir
|
|
androidTest.java.srcDirs += sharedTestDir
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
minifyEnabled false
|
|
}
|
|
debug {
|
|
isDefault true
|
|
minifyEnabled false
|
|
enableUnitTestCoverage true
|
|
}
|
|
}
|
|
|
|
flavorDimensions "distribution"
|
|
productFlavors {
|
|
play {
|
|
isDefault true
|
|
dimension "distribution"
|
|
apply plugin: 'com.google.gms.google-services'
|
|
ext.websiteUpdateUrl = "null"
|
|
buildConfigField "boolean", "PLAY_STORE_DISABLED", "false"
|
|
buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.ANDROID"
|
|
buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl"
|
|
buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"\"'
|
|
}
|
|
|
|
huawei {
|
|
dimension "distribution"
|
|
ext.websiteUpdateUrl = "null"
|
|
buildConfigField "boolean", "PLAY_STORE_DISABLED", "true"
|
|
buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.HUAWEI"
|
|
buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl"
|
|
buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"_HUAWEI\"'
|
|
}
|
|
|
|
website {
|
|
dimension "distribution"
|
|
ext.websiteUpdateUrl = "https://github.com/oxen-io/session-android/releases"
|
|
buildConfigField "boolean", "PLAY_STORE_DISABLED", "true"
|
|
buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.ANDROID"
|
|
buildConfigField "String", "NOPLAY_UPDATE_URL", "\"$ext.websiteUpdateUrl\""
|
|
buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"\"'
|
|
}
|
|
}
|
|
|
|
applicationVariants.forEach { variant ->
|
|
variant.outputs.each { output ->
|
|
def abiName = output.getFilter("ABI") ?: 'universal'
|
|
def postFix = abiPostFix.get(abiName, 0)
|
|
|
|
if (postFix >= postFixSize) throw new AssertionError("postFix is too large")
|
|
output.outputFileName = output.outputFileName = "session-${variant.versionName}-${abiName}.apk"
|
|
output.versionCodeOverride = canonicalVersionCode * postFixSize + postFix
|
|
}
|
|
}
|
|
|
|
|
|
testOptions {
|
|
unitTests {
|
|
includeAndroidResources = true
|
|
}
|
|
}
|
|
|
|
buildFeatures {
|
|
viewBinding true
|
|
}
|
|
|
|
def huaweiEnabled = project.properties['huawei'] != null
|
|
|
|
applicationVariants.configureEach { variant ->
|
|
if (variant.flavorName == 'huawei') {
|
|
variant.getPreBuildProvider().configure { task ->
|
|
task.doFirst {
|
|
if (!huaweiEnabled) {
|
|
def message = 'Huawei is not enabled. Please add -Phuawei command line arg. See BUILDING.md'
|
|
logger.error(message)
|
|
throw new GradleException(message)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
tasks.register('testPlayDebugUnitTestCoverageReport', JacocoReport) {
|
|
dependsOn 'testPlayDebugUnitTest'
|
|
|
|
reports {
|
|
xml.required = true
|
|
}
|
|
|
|
// Add files that should not be listed in the report (e.g. generated Files from dagger)
|
|
def fileFilter = []
|
|
def mainSrc = "$projectDir/src/main/java"
|
|
def kotlinDebugTree = fileTree(dir: "${buildDir}/tmp/kotlin-classes/playDebug", excludes: fileFilter)
|
|
|
|
// Compiled Kotlin class files are written into build-variant-specific subdirectories of 'build/tmp/kotlin-classes'.
|
|
classDirectories.from = files([kotlinDebugTree])
|
|
|
|
// To produce an accurate report, the bytecode is mapped back to the original source code.
|
|
sourceDirectories.from = files([mainSrc])
|
|
|
|
// Execution data generated when running the tests against classes instrumented by the JaCoCo agent.
|
|
// This is enabled with 'enableUnitTestCoverage' in the 'debug' build type.
|
|
executionData.from = "${project.buildDir}/outputs/unit_test_code_coverage/playDebugUnitTest/testPlayDebugUnitTest.exec"
|
|
}
|
|
|
|
|
|
testNamespace 'network.loki.messenger.test'
|
|
lint {
|
|
abortOnError true
|
|
baseline file('lint-baseline.xml')
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
implementation project(':content-descriptions')
|
|
|
|
ksp("androidx.hilt:hilt-compiler:$jetpackHiltVersion")
|
|
ksp("com.google.dagger:hilt-compiler:$daggerHiltVersion")
|
|
ksp("com.github.bumptech.glide:ksp:$glideVersion")
|
|
|
|
implementation("com.google.dagger:hilt-android:$daggerHiltVersion")
|
|
implementation "androidx.appcompat:appcompat:$appcompatVersion"
|
|
implementation 'androidx.recyclerview:recyclerview:1.2.1'
|
|
implementation "com.google.android.material:material:$materialVersion"
|
|
implementation 'com.google.android.flexbox:flexbox:3.0.0'
|
|
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
|
|
implementation 'androidx.cardview:cardview:1.0.0'
|
|
implementation "androidx.preference:preference-ktx:$preferenceVersion"
|
|
implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
|
|
implementation 'androidx.gridlayout:gridlayout:1.0.0'
|
|
implementation 'androidx.exifinterface:exifinterface:1.3.4'
|
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
|
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion"
|
|
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion"
|
|
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion"
|
|
implementation "androidx.lifecycle:lifecycle-process:$lifecycleVersion"
|
|
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycleVersion"
|
|
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
|
|
implementation "androidx.paging:paging-runtime-ktx:$pagingVersion"
|
|
implementation 'androidx.activity:activity-ktx:1.5.1'
|
|
implementation 'androidx.activity:activity-compose:1.5.1'
|
|
implementation 'androidx.fragment:fragment-ktx:1.5.3'
|
|
implementation "androidx.core:core-ktx:$coreVersion"
|
|
implementation "androidx.work:work-runtime-ktx:2.7.1"
|
|
|
|
playImplementation ("com.google.firebase:firebase-messaging:24.0.0") {
|
|
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'
|
|
}
|
|
|
|
if (project.hasProperty('huawei')) huaweiImplementation 'com.huawei.hms:push:6.7.0.300'
|
|
|
|
implementation 'androidx.media3:media3-exoplayer:1.4.0'
|
|
implementation 'androidx.media3:media3-ui:1.4.0'
|
|
implementation 'org.conscrypt:conscrypt-android:2.5.2'
|
|
implementation 'org.signal:aesgcmprovider:0.0.3'
|
|
implementation 'io.github.webrtc-sdk:android:125.6422.04'
|
|
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 'commons-net:commons-net:3.7.2'
|
|
implementation 'com.github.chrisbanes:PhotoView:2.1.3'
|
|
implementation "com.github.bumptech.glide:glide:$glideVersion"
|
|
implementation "com.github.bumptech.glide:compose:1.0.0-beta01"
|
|
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.vanniktech:android-image-cropper:4.5.0'
|
|
implementation 'com.melnykov:floatingactionbutton:1.3.0'
|
|
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.6.0') {
|
|
exclude group: 'com.android.support', module: 'support-annotations'
|
|
}
|
|
implementation ('com.tomergoldst.android:tooltips:1.0.6') {
|
|
exclude group: 'com.android.support', module: 'appcompat-v7'
|
|
}
|
|
implementation ('com.klinkerapps:android-smsmms:4.0.1') {
|
|
exclude group: 'com.squareup.okhttp', module: 'okhttp'
|
|
exclude group: 'com.squareup.okhttp', module: 'okhttp-urlconnection'
|
|
}
|
|
implementation 'com.annimon:stream:1.1.8'
|
|
implementation 'com.github.dmytrodanylyk.circular-progress-button:library:1.1.3-S2'
|
|
implementation 'androidx.sqlite:sqlite-ktx:2.3.1'
|
|
implementation 'net.zetetic:sqlcipher-android:4.5.4@aar'
|
|
implementation project(":libsignal")
|
|
implementation project(":libsession")
|
|
implementation project(":libsession-util")
|
|
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinxJsonVersion"
|
|
implementation "com.github.oxen-io.session-android-curve-25519:curve25519-java:$curve25519Version"
|
|
implementation project(":liblazysodium")
|
|
implementation "net.java.dev.jna:jna:5.12.1@aar"
|
|
implementation "com.google.protobuf:protobuf-java:$protobufVersion"
|
|
implementation "com.fasterxml.jackson.core:jackson-databind:$jacksonDatabindVersion"
|
|
implementation "com.squareup.okhttp3:okhttp:$okhttpVersion"
|
|
implementation "com.squareup.phrase:phrase:$phraseVersion"
|
|
implementation 'app.cash.copper:copper-flow:1.0.0'
|
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
|
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
|
|
implementation "nl.komponents.kovenant:kovenant:$kovenantVersion"
|
|
implementation "nl.komponents.kovenant:kovenant-android:$kovenantVersion"
|
|
implementation "com.jakewharton.rxbinding3:rxbinding:3.1.0"
|
|
implementation "com.github.ybq:Android-SpinKit:1.4.0"
|
|
implementation "com.opencsv:opencsv:4.6"
|
|
testImplementation "junit:junit:$junitVersion"
|
|
testImplementation 'org.assertj:assertj-core:3.11.1'
|
|
testImplementation "org.mockito:mockito-inline:4.11.0"
|
|
testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
|
|
androidTestImplementation "org.mockito:mockito-android:4.11.0"
|
|
androidTestImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
|
|
testImplementation "androidx.test:core:$testCoreVersion"
|
|
testImplementation "androidx.arch.core:core-testing:2.2.0"
|
|
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion"
|
|
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion"
|
|
// Core library
|
|
androidTestImplementation "androidx.test:core:$testCoreVersion"
|
|
|
|
androidTestImplementation('com.adevinta.android:barista:4.2.0') {
|
|
exclude group: 'org.jetbrains.kotlin'
|
|
}
|
|
|
|
// AndroidJUnitRunner and JUnit Rules
|
|
androidTestImplementation 'androidx.test:runner:1.5.2'
|
|
androidTestImplementation 'androidx.test:rules:1.5.0'
|
|
|
|
// Assertions
|
|
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
|
androidTestImplementation 'androidx.test.ext:truth:1.5.0'
|
|
testImplementation 'com.google.truth:truth:1.1.3'
|
|
androidTestImplementation 'com.google.truth:truth:1.1.3'
|
|
|
|
// Espresso dependencies
|
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
|
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.5.1'
|
|
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.5.1'
|
|
androidTestImplementation 'androidx.test.espresso:espresso-accessibility:3.5.1'
|
|
androidTestImplementation 'androidx.test.espresso:espresso-web:3.5.1'
|
|
androidTestImplementation 'androidx.test.espresso.idling:idling-concurrent:3.5.1'
|
|
androidTestImplementation 'androidx.test.espresso:espresso-idling-resource:3.5.1'
|
|
androidTestUtil 'androidx.test:orchestrator:1.4.2'
|
|
|
|
testImplementation 'org.robolectric:robolectric:4.12.2'
|
|
testImplementation 'org.robolectric:shadows-multidex:4.12.2'
|
|
testImplementation 'org.conscrypt:conscrypt-openjdk-uber:2.5.2' // For Robolectric
|
|
testImplementation 'app.cash.turbine:turbine:1.1.0'
|
|
|
|
implementation 'com.github.bumptech.glide:compose:1.0.0-alpha.5'
|
|
implementation "androidx.compose.ui:ui:$composeVersion"
|
|
implementation "androidx.compose.animation:animation:$composeVersion"
|
|
implementation "androidx.compose.ui:ui-tooling:$composeVersion"
|
|
implementation "androidx.compose.runtime:runtime-livedata:$composeVersion"
|
|
implementation "androidx.compose.foundation:foundation-layout:$composeVersion"
|
|
implementation "androidx.compose.material3:material3:1.2.1"
|
|
androidTestImplementation "androidx.compose.ui:ui-test-junit4-android:$composeVersion"
|
|
debugImplementation "androidx.compose.ui:ui-test-manifest:$composeVersion"
|
|
|
|
implementation "com.google.accompanist:accompanist-themeadapter-appcompat:0.33.1-alpha"
|
|
implementation "com.google.accompanist:accompanist-permissions:0.36.0"
|
|
implementation "com.google.accompanist:accompanist-drawablepainter:0.33.1-alpha"
|
|
|
|
implementation "androidx.camera:camera-camera2:1.3.2"
|
|
implementation "androidx.camera:camera-lifecycle:1.3.2"
|
|
implementation "androidx.camera:camera-view:1.3.2"
|
|
|
|
// Note: ZXing 3.5.3 is the latest stable release as of 2024/08/21
|
|
implementation "com.google.zxing:core:$zxingVersion"
|
|
}
|
|
|
|
static def getLastCommitTimestamp() {
|
|
new ByteArrayOutputStream().withStream { os ->
|
|
return os.toString() + "000"
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Discovers supported languages listed as under the res/values- directory.
|
|
*/
|
|
def autoResConfig() {
|
|
def files = new ArrayList<String>()
|
|
def root = file("src/main/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()
|
|
}
|