Files
Amber/app/build.gradle
T
Claude e3914e56a5 Add built-in Tor support via kmptor library
Introduces embedded Tor functionality as an alternative to the existing
Orbot proxy integration, so users no longer need an external app to
route traffic through the Tor network.

Key changes:
- Add TorMode enum (DISABLED, ORBOT, BUILTIN) replacing the useProxy boolean
- Create TorManager (free-flavor only) using io.matthewnelson.kmp-tor:runtime
  and resource-exec-tor to manage the Tor daemon lifecycle
- Offline flavor gets a no-op TorManager stub to maintain build compatibility
- AmberSettings: replace useProxy field with torMode enum; useProxy becomes
  a computed property (torMode != DISABLED) for backward compatibility
- LocalPreferences: migrate old use_proxy boolean to TorMode on first load,
  save/load torMode, update proxy config per mode
- Amber: start built-in Tor on app launch when torMode == BUILTIN;
  isSocksProxyAlive returns TorManager.isRunning for built-in mode
- ConnectOrbotDialog: add Built-in Tor section above the Orbot section
- SettingsScreen: show mode-specific disconnect label (built-in vs orbot)
- HttpClientManager: add clearProxy() public method
- AndroidManifest: add INTERNET permission explicitly
- gradle: add kmptor 2.6.0 + resource-exec-tor 408.19.0 dependencies,
  enable jniLibs.useLegacyPackaging for native binary extraction

https://claude.ai/code/session_01JwcwxdYrDnr3QyHqTBz33a
2026-03-13 20:03:58 +00:00

258 lines
6.8 KiB
Groovy

plugins {
alias(libs.plugins.androidApplication)
alias(libs.plugins.gradle.ktlint) version(libs.versions.ktlint)
alias(libs.plugins.kotlin.ksp) version(libs.versions.ksp)
alias(libs.plugins.jetbrainsComposeCompiler)
}
android {
namespace = 'com.greenart7c3.nostrsigner'
compileSdk = 36
defaultConfig {
applicationId "com.greenart7c3.nostrsigner"
minSdk 26
versionCode 179
versionName "4.1.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
resourceConfigurations += [
'bn-rBD',
'cs',
'cy-rGB',
'da-rDK',
'de',
'el-rGR',
'en-rGB',
'eo',
'es',
'es-rES',
'es-rMX',
'es-rUS',
'et-rEE',
'fa',
'fi-rFI',
'fo-rFO',
'fr',
'fr-rCA',
'gu-rIN',
'hi-rIN',
'hr-rHR',
'hu',
'in',
'in-rID',
'it-rIT',
'iw-rIL',
'ja',
'kk-rKZ',
'ko-rKR',
'ks-rIN',
'ku-rTR',
'lt-rLT',
'ne-rNP',
'nl',
'nl-rBE',
'pcm-rNG',
'pl-rPL',
'pt-rBR',
'pt-rPT',
'ru',
'ru-rUA',
'sa-rIN',
'sl-rSI',
'so-rSO',
'sr-rSP',
'ss-rZA',
'sv-rSE',
'sw-rKE',
'sw-rTZ',
'ta',
'th',
'tr',
'uk',
'ur-rIN',
'uz-rUZ',
'vi-rVN',
'zh',
'zh-rCN',
'zh-rHK',
'zh-rSG',
'zh-rTW'
]
lint {
disable 'MissingTranslation'
}
}
ksp {
arg("room.schemaLocation", "$projectDir/schemas")
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_21
}
if (System.getenv('SIGN_RELEASE')) {
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
}
buildTypes {
release {
if (System.getenv('SIGN_RELEASE')) {
signingConfig signingConfigs.release
}
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), 'proguard-rules.pro'
minifyEnabled true
resValue "string", "app_name", "@string/app_name_release"
}
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
resValue "string", "app_name", "@string/app_name_debug"
}
}
flavorDimensions += "version"
productFlavors {
register("free") {
getIsDefault().set(true)
dimension = "version"
}
register("offline") {
dimension = "version"
}
}
splits {
abi {
enable = true
reset()
include "x86", "x86_64", "arm64-v8a", "armeabi-v7a"
universalApk = true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_21
}
buildFeatures {
compose = true
buildConfig = true
resValues = true
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
excludes +='META-INF/versions/9/OSGI-INF/MANIFEST.MF'
}
jniLibs.useLegacyPackaging = true
}
}
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
}
dependencies {
implementation(libs.quartz) {
exclude group: 'net.java.dev.jna'
}
implementation(libs.jna) {
artifact { type = "aar" }
}
implementation libs.core.ktx
implementation libs.activity.compose
implementation libs.ui
implementation libs.ui.tooling.preview
// Navigation
implementation libs.navigation.compose
implementation libs.material3
implementation libs.material.icons.extended
implementation libs.appcompat
implementation libs.work.runtime.ktx
implementation libs.material3.window
implementation libs.paging.common
implementation libs.paging.compose
implementation libs.paging.runtime
testImplementation libs.junit
testImplementation libs.mockk
testImplementation libs.kotlinx.coroutines.test
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
androidTestImplementation libs.ui.test.junit4
debugImplementation libs.ui.tooling
debugImplementation libs.ui.test.manifest
implementation libs.security.crypto.ktx
// Lifecycle
implementation libs.lifecycle.runtime.compose
implementation libs.lifecycle.viewmodel.compose
implementation libs.lifecycle.runtime.ktx
// For QR generation
implementation libs.core
implementation libs.zxing.android.embedded
// Markdown (With fix for full-image bleeds)
implementation(libs.richtext.ui)
implementation(libs.richtext.ui.material3)
implementation(libs.richtext.commonmark)
// Biometrics
implementation libs.biometric.ktx
ksp(libs.room.compiler)
implementation(libs.room.ktx)
implementation(libs.room.runtime)
implementation(libs.room.paging)
freeImplementation libs.okhttp
freeImplementation libs.okhttpCoroutines
freeImplementation libs.kmptor.runtime
freeImplementation libs.kmptor.resource.exec
// Load images from the web.
implementation libs.coil.compose
// view gifs
implementation libs.coil.gif
// view svgs
implementation libs.coil.svg
// enables network for coil
implementation libs.coil.okhttp
implementation libs.okhttpCoroutines
implementation libs.storage
implementation libs.datastore.preferences
implementation libs.security.crypto
implementation libs.lifecycle.process
implementation libs.kotlinx.collections.immutable
}