148 lines
6.2 KiB
Groovy
148 lines
6.2 KiB
Groovy
apply plugin: 'com.android.application'
|
|
|
|
// Mirror of resolveAppVersion() in ../../vite.config.js so the APK's
|
|
// versionName matches __APP_VERSION__ rendered in the About screen.
|
|
// `git describe --tags --match 'v*'` against tag v0.2.0 yields
|
|
// `v0.2.0-<commits>-g<hash>`; patch = commit count since the tag.
|
|
// Falls back to package.json only when git is unavailable.
|
|
def gitDescribe = providers.exec {
|
|
it.commandLine 'git', 'describe', '--tags', '--match', 'v*', '--always'
|
|
it.workingDir rootDir.parentFile
|
|
it.ignoreExitValue = true
|
|
}
|
|
def appVersion = {
|
|
def fromGit = gitDescribe.result.get().exitValue == 0 ? gitDescribe.standardOutput.asText.get().trim() : null
|
|
def m = fromGit =~ /^v?(\d+)\.(\d+)\.(\d+)(?:-(\d+)-g[0-9a-f]+)?$/
|
|
if (fromGit && m.matches()) {
|
|
def major = m[0][1].toInteger()
|
|
def minor = m[0][2].toInteger()
|
|
def patch = (m[0][4] ?: m[0][3]).toInteger()
|
|
return [name: "${major}.${minor}.${patch}", major: major, minor: minor, patch: patch]
|
|
}
|
|
def pkg = new groovy.json.JsonSlurper().parseText(file('../../package.json').text)
|
|
def parts = pkg.version.split('\\.')
|
|
return [name: pkg.version, major: parts[0].toInteger(), minor: parts[1].toInteger(), patch: parts[2].toInteger()]
|
|
}()
|
|
def computedVersionCode = appVersion.major * 1000000 + appVersion.minor * 1000 + appVersion.patch
|
|
|
|
android {
|
|
namespace = "chat.vojo.app"
|
|
compileSdk = rootProject.ext.compileSdkVersion
|
|
defaultConfig {
|
|
applicationId "chat.vojo.app"
|
|
minSdkVersion rootProject.ext.minSdkVersion
|
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
|
versionCode computedVersionCode
|
|
versionName appVersion.name
|
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
aaptOptions {
|
|
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
|
|
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
|
|
ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
|
|
}
|
|
}
|
|
// AGP 8+ requires explicit opt-in for BuildConfig generation. We rely on
|
|
// BuildConfig.DEBUG to gate Log.d calls that dump privacy-sensitive
|
|
// identifiers (roomId, eventId) so release builds don't leak them through
|
|
// logcat / crash-reporter buffers. See dlog() in VojoFirebaseMessagingService.
|
|
buildFeatures {
|
|
buildConfig = true
|
|
}
|
|
|
|
signingConfigs {
|
|
release {
|
|
if (project.hasProperty('VOJO_RELEASE_STORE_FILE')) {
|
|
storeFile file(VOJO_RELEASE_STORE_FILE)
|
|
storePassword VOJO_RELEASE_STORE_PASSWORD
|
|
keyAlias VOJO_RELEASE_KEY_ALIAS
|
|
keyPassword VOJO_RELEASE_KEY_PASSWORD
|
|
}
|
|
}
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
minifyEnabled true
|
|
shrinkResources true
|
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
|
signingConfig signingConfigs.release
|
|
}
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
flatDir{
|
|
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
|
implementation "androidx.activity:activity:$androidxActivityVersion"
|
|
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
|
|
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
|
|
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
|
|
implementation project(':capacitor-android')
|
|
// Needed for VojoFirebaseMessagingService. @capacitor/push-notifications
|
|
// already depends on firebase-messaging but declares it `implementation`
|
|
// so classes aren't exposed at app-module compile time.
|
|
implementation "com.google.firebase:firebase-messaging:25.0.1"
|
|
// WorkManager hosts VojoPollWorker — periodic /notifications poll that
|
|
// delivers messages and missed-call surfaces on networks where FCM
|
|
// (mtalk.google.com:5228) is blocked. Library self-registers its scheduler
|
|
// in the merged manifest; we declare no permission for it.
|
|
implementation "androidx.work:work-runtime:2.10.0"
|
|
testImplementation "junit:junit:$junitVersion"
|
|
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
|
|
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
|
|
implementation project(':capacitor-cordova-android-plugins')
|
|
}
|
|
|
|
apply from: 'capacitor.build.gradle'
|
|
|
|
abstract class GeneratePushStringsTask extends DefaultTask {
|
|
@InputFiles
|
|
abstract ConfigurableFileCollection getInputFiles()
|
|
|
|
@OutputDirectory
|
|
abstract DirectoryProperty getOutputDir()
|
|
|
|
@TaskAction
|
|
void generate() {
|
|
def nodeBin = project.findProperty('NODE_BIN') ?: 'node'
|
|
project.exec {
|
|
commandLine nodeBin,
|
|
new File(project.rootProject.projectDir.parentFile, 'scripts/gen-push-strings.mjs').absolutePath,
|
|
'--out', outputDir.get().asFile.absolutePath
|
|
}
|
|
}
|
|
}
|
|
|
|
androidComponents {
|
|
onVariants(selector().all()) { variant ->
|
|
def repoRoot = rootProject.projectDir.parentFile
|
|
def taskProvider = tasks.register(
|
|
"generatePushStrings${variant.name.capitalize()}",
|
|
GeneratePushStringsTask
|
|
) {
|
|
inputFiles.from(
|
|
new File(repoRoot, 'public/locales/en.json'),
|
|
new File(repoRoot, 'public/locales/ru.json'),
|
|
new File(repoRoot, 'scripts/gen-push-strings.mjs')
|
|
)
|
|
outputDir.set(layout.buildDirectory.dir("generated/res/push/${variant.name}"))
|
|
}
|
|
variant.sources.res.addGeneratedSourceDirectory(
|
|
taskProvider, GeneratePushStringsTask::getOutputDir
|
|
)
|
|
}
|
|
}
|
|
|
|
try {
|
|
def servicesJSON = file('google-services.json')
|
|
if (servicesJSON.text) {
|
|
apply plugin: 'com.google.gms.google-services'
|
|
}
|
|
} catch(Exception e) {
|
|
logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
|
|
}
|