Skip to content
Open
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ build/
# Local configuration file (sdk path, etc)
local.properties
secrets.properties
signing.properties
# Log/OS Files
*.log

Expand All @@ -13,6 +14,7 @@ captures/
.externalNativeBuild/
.cxx/
*.apk
*.aab
output.json

# IntelliJ
Expand All @@ -25,6 +27,7 @@ render.experimental.xml
# Keystore files
*.jks
*.keystore
navi-keystore

# Google Services (e.g. APIs or Firebase)
google-services.json
Expand Down
209 changes: 153 additions & 56 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,20 +1,75 @@
import java.util.Properties
import org.gradle.api.GradleException

plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
id("kotlin-kapt")
id("org.jetbrains.kotlin.plugin.compose")
id("com.google.dagger.hilt.android")
id("kotlinx-serialization")
id("org.jetbrains.kotlin.plugin.compose") version "2.0.0"
id("com.apollographql.apollo") version "4.3.3"
id("org.jetbrains.kotlin.plugin.serialization")
id("com.apollographql.apollo")
id("com.google.devtools.ksp")
}

val secretsPropertiesFile = rootProject.file("secrets.properties")
val secretsProperties = Properties().apply {
if (!secretsPropertiesFile.exists()) {
throw GradleException("secrets.properties not found at ${secretsPropertiesFile.absolutePath}. " +
"Please create this file with the required API keys and configuration values. " +
"Refer to the project README or CI configuration for required properties.")
}
secretsPropertiesFile.inputStream().use(::load)
}

secrets {
propertiesFileName = "secrets.properties"
val signingPropertiesFile = rootProject.file("signing.properties")
val signingProperties = Properties()
if (signingPropertiesFile.exists()) {
signingPropertiesFile.inputStream().use(signingProperties::load)
}

hilt {
enableExperimentalClasspathAggregation = true
fun Properties.requireString(key: String): String =
getProperty(key) ?: error("Missing required property '$key' in properties file.")

fun String.unquoteIfWrapped(): String {
val trimmed = trim()
return if (trimmed.length >= 2 && trimmed.first() == '"' && trimmed.last() == '"') {
trimmed.substring(1, trimmed.length - 1)
} else {
trimmed
}
}

fun asBuildConfigString(value: String): String {
val normalized = value.unquoteIfWrapped()
return "\"${normalized.replace("\\", "\\\\").replace("\"", "\\\"")}\""
}

fun asManifestPlaceholder(value: String): String =
value.unquoteIfWrapped()

fun configureUrlsForVariant(
prefix: String,
block: Any
) {
val buildTypeBlock = block as com.android.build.gradle.internal.dsl.BuildType
buildTypeBlock.buildConfigField(
"String",
"BACKEND_URL",
asBuildConfigString(secretsProperties.requireString("${prefix}_BACKEND_URL")),
)
buildTypeBlock.manifestPlaceholders["BACKEND_URL"] = asManifestPlaceholder(
secretsProperties.requireString("${prefix}_BACKEND_URL")
)
buildTypeBlock.buildConfigField(
"String",
"EATERY_URL",
asBuildConfigString(secretsProperties.requireString("${prefix}_EATERY_URL")),
)
buildTypeBlock.buildConfigField(
"String",
"UPLIFT_URL",
asBuildConfigString(secretsProperties.requireString("${prefix}_UPLIFT_URL")),
)
}

android {
Expand All @@ -25,129 +80,171 @@ android {
applicationId = "com.cornellappdev.transit"
minSdk = 26
targetSdk = 36
versionCode = 11
versionName = "2.1"
versionCode = 12
versionName = "2.1.1"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}

buildConfigField(
"String",
"MAPS_KEY",
asBuildConfigString(secretsProperties.requireString("MAPS_KEY")),
)
manifestPlaceholders["MAPS_KEY"] = asManifestPlaceholder(secretsProperties.requireString("MAPS_KEY"))
}

signingConfigs {
create("release") {
if (signingProperties.isNotEmpty()) {
storeFile = rootProject.file(signingProperties.requireString("KEYSTORE_PATH"))
storePassword = signingProperties.requireString("KEYSTORE_PASSWORD")
keyAlias = signingProperties.requireString("KEY_ALIAS")
keyPassword = signingProperties.requireString("KEY_PASSWORD")
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}
}

buildTypes {
debug {
configureUrlsForVariant("DEBUG", this)
buildConfigField("boolean", "ECOSYSTEM_FLAG", "true")
}
create("ecosystem") {
initWith(getByName("debug"))
isDebuggable = true
configureUrlsForVariant("DEBUG", this)
buildConfigField("boolean", "ECOSYSTEM_FLAG", "true")
signingConfig = signingConfigs.getByName("debug")
}
debug {
buildConfigField("boolean", "ECOSYSTEM_FLAG", "true")
}
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
optimization {
baselineProfile {
ignoreFromAllExternalDependencies = true
}
}
configureUrlsForVariant("PROD", this)
buildConfigField("boolean", "ECOSYSTEM_FLAG", "true")
signingConfig = signingConfigs.getByName("debug")
if (signingProperties.isNotEmpty()) {
signingConfig = signingConfigs.getByName("release")
}
}
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}

kotlinOptions {
jvmTarget = "1.8"
}

buildFeatures {
buildConfig = true
compose = true
}

composeOptions {
kotlinCompilerExtensionVersion = "1.5.2"
}

packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
// Work around device/OS install failures with embedded baseline profiles.
excludes += "assets/dexopt/baseline.prof"
excludes += "assets/dexopt/baseline.profm"
}
}
}

dependencies {
// Testing
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
androidTestImplementation(platform("androidx.compose:compose-bom:2024.11.00"))
androidTestImplementation("androidx.compose.ui:ui-test-junit4")

// Android Core
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7")
implementation("androidx.activity:activity-compose:1.9.3")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("androidx.constraintlayout:constraintlayout:2.2.0")
implementation("androidx.constraintlayout:constraintlayout-compose:1.1.0")

// Compose
implementation(platform("androidx.compose:compose-bom:2024.11.00"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material:material:1.7.5")
implementation("androidx.compose.material3:material3")
implementation("com.google.android.gms:play-services-location:21.3.0")
implementation("androidx.compose.material3:material3:1.3.1")
implementation("androidx.constraintlayout:constraintlayout:2.2.0")
implementation("androidx.media3:media3-common:1.3.0")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
androidTestImplementation(platform("androidx.compose:compose-bom:2024.11.00"))
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
implementation("androidx.activity:activity-compose:1.9.3")
debugImplementation("androidx.compose.ui:ui-tooling")
"ecosystemImplementation"("androidx.compose.ui:ui-tooling")
debugImplementation("androidx.compose.ui:ui-test-manifest")
implementation("androidx.constraintlayout:constraintlayout-compose:1.1.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")

// Images
implementation("io.coil-kt.coil3:coil-compose:3.0.4")
implementation("io.coil-kt.coil3:coil-network-okhttp:3.0.4")
implementation("com.valentinilk.shimmer:compose-shimmer:1.3.1")

//Maps
implementation("com.google.maps.android:maps-compose:4.0.0")
implementation("com.google.android.gms:play-services-maps:19.0.0")

//Accompanist Permissions
implementation("com.google.accompanist:accompanist-permissions:0.34.0")

// Lifecycle & Navigation
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.7")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7")
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7")
implementation("androidx.navigation:navigation-compose:2.8.4")
implementation("androidx.hilt:hilt-navigation-compose:1.2.0")

// OkHTTP
// Networking
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.12.0"))
implementation("com.squareup.okhttp3:okhttp")
implementation("com.squareup.okhttp3:logging-interceptor")

// Retrofit
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-moshi:2.9.0")
implementation("com.squareup.retrofit2:converter-scalars:2.9.0")
implementation("com.squareup.moshi:moshi-kotlin:1.14.0")

//Dagger Hilt
implementation("com.google.dagger:hilt-android:2.50")
kapt("com.google.dagger:hilt-android-compiler:2.50")
// Images & Media
implementation("io.coil-kt.coil3:coil-compose:3.0.4")
implementation("io.coil-kt.coil3:coil-network-okhttp:3.0.4")
implementation("com.valentinilk.shimmer:compose-shimmer:1.3.1")
implementation("androidx.media3:media3-common:1.3.0")

//Navigation
implementation("androidx.hilt:hilt-navigation-fragment:1.2.0")
implementation("androidx.hilt:hilt-navigation-compose:1.2.0")
implementation("androidx.navigation:navigation-compose:2.8.4")
// Maps
implementation("com.google.maps.android:maps-compose:4.0.0")
implementation("com.google.android.gms:play-services-maps:19.0.0")
implementation("com.google.android.gms:play-services-location:21.3.0")

//Datastore
// Permissions
implementation("com.google.accompanist:accompanist-permissions:0.34.0")

// Data Storage
implementation("androidx.datastore:datastore-preferences:1.1.1")

//Datetime
// DateTime
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.3.0")

//Bottomsheet
implementation("io.morfly.compose:advanced-bottomsheet-material3:0.1.0")
// Coroutines
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")

// Serialization
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")

//Apollo GraphQL
// Dependency Injection
implementation("com.google.dagger:hilt-android:2.50")
ksp("com.google.dagger:hilt-android-compiler:2.50")
implementation("androidx.hilt:hilt-navigation-fragment:1.2.0")

// Apollo GraphQL
implementation("com.apollographql.apollo:apollo-runtime:4.3.3")

// Bottom Sheet
implementation("io.morfly.compose:advanced-bottomsheet-material3:0.1.0")
}

apollo {
Expand Down
Binary file removed app/release/app-release.aab
Binary file not shown.
3 changes: 3 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@
<meta-data
android:name="BACKEND_URL"
android:value="${BACKEND_URL}" />
<meta-data
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why are we setting this to false?

android:name="androidx.profileinstaller.enabled"
android:value="false" />

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
android:value="true" />
Expand Down
Loading