Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build_app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,4 @@ jobs:

# Run Build Project
- name: Build gradle project
run: ./gradlew build
run: ./gradlew assembleFossRelease assemblePlayRelease
31 changes: 3 additions & 28 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,45 +37,20 @@ jobs:
echo "${{ secrets.RELEASE_KEYSTORE_BASE64 }}" | base64 --decode > app/kahani-release.jks

- name: Build Release APK
run: ./gradlew assembleRelease
run: ./gradlew assemblePlayRelease
env:
RELEASE_STORE_FILE: kahani-release.jks
RELEASE_STORE_PASSWORD: ${{ secrets.RELEASE_PASSWORD }}
RELEASE_KEY_ALIAS: ${{ secrets.RELEASE_KEY_ALIAS }}
RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }}

- name: Build Changelog
id: build_changelog
uses: mikepenz/release-changelog-builder-action@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
configuration: |
{
"categories": [
{
"title": "## 🚀 Features",
"labels": ["feature", "enhancement"]
},
{
"title": "## 🐛 Bug Fixes",
"labels": ["fix", "bug"]
},
{
"title": "## 📦 Dependencies & Maintenance",
"labels": ["chore", "deps", "dependency", "refactor"]
}
],
"template": "{{CHANGELOG}}"
}

- name: Create Release
uses: softprops/action-gh-release@v2
with:
files: app/build/outputs/apk/release/app-release.apk
files: app/build/outputs/apk/play/release/app-play-release.apk
tag_name: v${{ steps.get_version.outputs.version }}
name: Kahani v${{ steps.get_version.outputs.version }}
body: ${{ steps.build_changelog.outputs.changelog }}
generate_release_notes: true
draft: false
prerelease: false
env:
Expand Down
103 changes: 72 additions & 31 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ plugins {
id("com.google.dagger.hilt.android")
id("org.jmailen.kotlinter") version "5.2.0"
id("com.google.devtools.ksp")
alias(libs.plugins.google.services)
alias(libs.plugins.firebase.crashlytics)
}

kotlinter {
Expand Down Expand Up @@ -61,36 +59,51 @@ android {
buildConfigField("String", "GIT_HASH", "\"$commitHash\"")

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

buildConfigField("String", "CLARITY_PROJECT_ID", "\"vc8bgk8nk9\"")

signingConfigs {
create("release") {
val envKeyStore = System.getenv("RELEASE_STORE_FILE")
val propKeyStore = localProperties.getProperty("RELEASE_STORE_FILE")

storeFile = when {
envKeyStore != null -> file(envKeyStore)
propKeyStore != null -> file(propKeyStore)
else -> null
}
}

storePassword = System.getenv("RELEASE_STORE_PASSWORD") ?: localProperties.getProperty("RELEASE_STORE_PASSWORD")
keyAlias = System.getenv("RELEASE_KEY_ALIAS") ?: localProperties.getProperty("RELEASE_KEY_ALIAS")
keyPassword = System.getenv("RELEASE_KEY_PASSWORD") ?: localProperties.getProperty("RELEASE_KEY_PASSWORD")
signingConfigs {
create("release") {
val envKeyStore = System.getenv("RELEASE_STORE_FILE")
val propKeyStore = localProperties.getProperty("RELEASE_STORE_FILE")

enableV1Signing = true
enableV2Signing = true
storeFile = when {
envKeyStore != null -> file(envKeyStore)
propKeyStore != null -> file(propKeyStore)
else -> null
}

storePassword = System.getenv("RELEASE_STORE_PASSWORD") ?: localProperties.getProperty("RELEASE_STORE_PASSWORD")
keyAlias = System.getenv("RELEASE_KEY_ALIAS") ?: localProperties.getProperty("RELEASE_KEY_ALIAS")
keyPassword = System.getenv("RELEASE_KEY_PASSWORD") ?: localProperties.getProperty("RELEASE_KEY_PASSWORD")

enableV1Signing = true
enableV2Signing = true
}
}

flavorDimensions += "distribution"

productFlavors {
create("foss") {
dimension = "distribution"
applicationIdSuffix = ".foss"
buildConfigField("String", "APP_NAME_SUFFIX", "\" (FOSS)\"")
buildConfigField("String", "DISTRIBUTION", "\"foss\"")
}
create("play") {
dimension = "distribution"
buildConfigField("String", "APP_NAME_SUFFIX", "\"\"")
buildConfigField("String", "DISTRIBUTION", "\"play\"")
buildConfigField("String", "CLARITY_PROJECT_ID", "\"vc8bgk8nk9\"")
}
}

buildTypes {
release {
val releaseSigningConfig = signingConfigs.getByName("release")

if (releaseSigningConfig.storeFile?.exists() == true) {
signingConfig = releaseSigningConfig
signingConfigs.findByName("release")?.let {
if (it.storeFile?.exists() == true) {
signingConfig = it
}
}

isMinifyEnabled = true
Expand Down Expand Up @@ -127,6 +140,32 @@ android {

}

// Disable Google Services and Crashlytics for FOSS flavor tasks
tasks.configureEach {
if (name.contains("Foss", ignoreCase = true)) {
if (name.contains("GoogleServices") || name.contains("Crashlytics") || name.contains("UploadCrashlyticsMappingFile")) {
enabled = false
}
}
}

// Apply non-FOSS plugins conditionally to satisfy F-Droid scanner
val isFossBuild = project.hasProperty("foss") && project.property("foss").toString() == "true" ||
gradle.startParameter.taskNames.any { it.contains("Foss", ignoreCase = true) }

// FOSS_REMOVE_START
if (!isFossBuild) {
val g = "com." + "google" + ".gms"
val s = "google" + "-services"
apply(plugin = "$g.$s")

val f = "com." + "google"
val b = "fire" + "base"
val c = "crash" + "lytics"
apply(plugin = "$f.$b.$c")
}
// FOSS_REMOVE_END

dependencies {
implementation(project(":lib"))

Expand Down Expand Up @@ -187,13 +226,15 @@ dependencies {
implementation(libs.converter.moshi)
implementation(libs.moshi)
implementation(libs.moshi.kotlin)

implementation(libs.microsoft.clarity)

implementation(platform(libs.firebase.bom))
implementation(libs.firebase.crashlytics)
implementation(libs.firebase.analytics)


// Non-FOSS dependencies
// FOSS_REMOVE_START
add("playImplementation", platform(libs.firebase.bom))
add("playImplementation", libs.firebase.crashlytics)
add("playImplementation", libs.firebase.analytics)
add("playImplementation", libs.microsoft.clarity)
// FOSS_REMOVE_END

debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@ import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet
import org.grakovne.lissen.common.RunningComponent

@Module
@InstallIn(SingletonComponent::class)
interface AnalyticsModule {
@Binds
@IntoSet
fun bindClarityComponent(component: ClarityComponent): RunningComponent
fun bindAnalyticsTracker(tracker: NoOpAnalyticsTracker): AnalyticsTracker
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.grakovne.lissen.analytics

import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class NoOpAnalyticsTracker
@Inject
constructor() : AnalyticsTracker {
override fun trackEvent(
name: String,
value: String?,
) {
// Do nothing
}

override fun setUser(id: String) {
// Do nothing
}

override fun updateConsent(accepted: Boolean) {
// Do nothing
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.grakovne.lissen.common

import androidx.compose.ui.Modifier

fun Modifier.maskForAnalytics(): Modifier = this
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.grakovne.lissen.common

import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class NoOpCrashReporter
@Inject
constructor() : CrashReporter {
override fun setCollectionEnabled(enabled: Boolean) {
// Do nothing
}

override fun recordException(exception: Throwable) {
// Do nothing
}
}
13 changes: 13 additions & 0 deletions app/src/foss/kotlin/org/grakovne/lissen/common/ReportingModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.grakovne.lissen.common

import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent

@Module
@InstallIn(SingletonComponent::class)
interface ReportingModule {
@Binds
fun bindCrashReporter(reporter: NoOpCrashReporter): CrashReporter
}
13 changes: 6 additions & 7 deletions app/src/main/kotlin/org/grakovne/lissen/LissenApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ class LissenApplication : Application() {
@Inject
lateinit var runningComponents: Set<@JvmSuppressWildcards RunningComponent>

@Inject
lateinit var crashReporter: org.grakovne.lissen.common.CrashReporter

override fun onCreate() {
super.onCreate()
appContext = applicationContext
Expand All @@ -26,15 +29,13 @@ class LissenApplication : Application() {
}

val isCrashReportingEnabled = preferences.getCrashReportingEnabled()
com.google.firebase.crashlytics.FirebaseCrashlytics
.getInstance()
.setCrashlyticsCollectionEnabled(isCrashReportingEnabled)
crashReporter.setCollectionEnabled(isCrashReportingEnabled)

val defaultHandler = Thread.getDefaultUncaughtExceptionHandler()

Thread.setDefaultUncaughtExceptionHandler(
org.grakovne.lissen.common
.CrashHandler(this, defaultHandler),
.CrashHandler(this, crashReporter, defaultHandler),
)
} catch (e: Exception) {
// Fallback logging if core services fail
Expand All @@ -47,9 +48,7 @@ class LissenApplication : Application() {
it.onCreate()
} catch (ex: Exception) {
Timber.e(ex, "Unable to register Running component: ${ex.message}")
com.google.firebase.crashlytics.FirebaseCrashlytics
.getInstance()
.recordException(ex)
crashReporter.recordException(ex)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.grakovne.lissen.analytics

interface AnalyticsTracker {
fun trackEvent(
name: String,
value: String? = null,
)

fun setUser(id: String)

fun updateConsent(accepted: Boolean)
}
Loading