diff --git a/.gitignore b/.gitignore index cefe824..f553324 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ google-services.json # Local configuration *(Mandatory) secrets.properties keystore.properties +development.properties +production.properties #-------------------------- diff --git a/README.md b/README.md index 65df587..602d446 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,6 @@
---- - ## 🚀 Overview This repository offers a robust foundation for Android app development, featuring: diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d42773c..600bba9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,7 +1,6 @@ plugins { alias(libs.plugins.kotlin.android) alias(libs.plugins.convention.compose.app) - alias(libs.plugins.kotlin.ksp) } android { @@ -12,6 +11,17 @@ android { versionCode = 1 versionName = "0.1.0" } + + flavorDimensions += "environment" + + productFlavors { + create("development") { + dimension = "environment" + } + create("production") { + dimension = "environment" + } + } } kotlin { diff --git a/core/navigation/src/main/kotlin/core/navigation/Transition.kt b/core/navigation/src/main/kotlin/core/navigation/Transition.kt index 87f822d..9d6f7a1 100644 --- a/core/navigation/src/main/kotlin/core/navigation/Transition.kt +++ b/core/navigation/src/main/kotlin/core/navigation/Transition.kt @@ -58,4 +58,3 @@ public val exitPop: AnimatedContentTransitionScope.() -> Exit targetOffset = { it }, ) } - diff --git a/feature/homepage/src/main/kotlin/feature/homepage/screen/dashboard/DashboardScreen.kt b/feature/homepage/src/main/kotlin/feature/homepage/screen/dashboard/DashboardScreen.kt index 23c22ff..860de86 100644 --- a/feature/homepage/src/main/kotlin/feature/homepage/screen/dashboard/DashboardScreen.kt +++ b/feature/homepage/src/main/kotlin/feature/homepage/screen/dashboard/DashboardScreen.kt @@ -1,14 +1,38 @@ package feature.homepage.screen.dashboard +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Email +import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material.icons.filled.Share +import androidx.compose.material3.Card +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import core.designSystem.theme.LocalTypography import kotlinx.coroutines.flow.Flow @Composable @@ -27,8 +51,58 @@ public fun DashboardScreen( .padding(paddingValues) .fillMaxSize(), ) { + Card( + shape = RoundedCornerShape(16.dp), + modifier = Modifier + .fillMaxWidth() + .padding(20.dp) + ) { + Column( + modifier = Modifier.padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + AsyncImage( + model = "https://drive.usercontent.google.com/download?id=1slq2O4ZChlcuvsNk7ZM3wP8_Webc7ua1", + contentDescription = "Profile Picture", + modifier = Modifier + .size(192.dp, 228.dp) + .clip(RoundedCornerShape(16.dp)), + contentScale = ContentScale.Crop + ) + Spacer(modifier = Modifier.height(12.dp)) + + Text( + text = "Indra Mahkota", + style = LocalTypography.current.header18Bold, + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Text( + text = "Android Software Engineer\nSkilled in Kotlin, Jetpack Compose, React Native, and Flutter.", + style = LocalTypography.current.body14Regular, + textAlign = TextAlign.Center, + ) + + Spacer(modifier = Modifier.height(12.dp)) + + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + modifier = Modifier.padding(top = 8.dp) + ) { + IconButton(onClick = { }) { + Icon(Icons.Default.Share, contentDescription = "Share", tint = Color(0xFFFF5722)) + } + IconButton(onClick = { }) { + Icon(Icons.Default.Favorite, contentDescription = "Favorite", tint = Color(0xFF1DA1F2)) + } + IconButton(onClick = { }) { + Icon(Icons.Default.Email, contentDescription = "Message", tint = Color(0xFFE4405F)) + } + } + } + } } } } - diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 153d7d7..87f8c80 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,41 +1,41 @@ [versions] accompanist = "0.34.0" -activityCompose = "1.9.3" -activityKtx = "1.9.3" -androidDatabaseSqlcipher = "4.4.3" -androidToolsBuild = "8.7.2" -androidToolsCommon = "31.7.2" -androidxComposeBom = "2024.11.00" +activityCompose = "1.10.1" +activityKtx = "1.10.1" +androidDatabaseSqlcipher = "4.5.4" +androidToolsBuild = "8.7.3" +androidToolsCommon = "31.8.2" +androidxComposeBom = "2025.02.00" androidxCoreKtx = "1.15.0" androidxCoreSplashscreen = "1.0.1" -androidxDataStore = "1.1.1" +androidxDataStore = "1.1.3" androidxEspressoCore = "3.6.1" androidxMetrics = "1.0.0-beta01" androidxProfileinstaller = "1.4.1" androidxTracing = "1.2.0" androidxWindow = "1.3.0" -apollo = "3.8.2" -appsFlyer = "6.14.0" -benManes = "0.51.0" -camerax = "1.4.0" +apollo = "3.8.5" +appsFlyer = "6.16.0" +benManes = "0.52.0" +camerax = "1.4.1" catalogUpdate = "0.8.5" chucker = "3.5.2" cloudy = "0.1.1" coil = "2.7.0" composeDatePicker = "2.2.0" -exifinterface = "1.3.7" -firebaseAuthKtx = "23.1.0" -firebaseBom = "33.6.0" +exifinterface = "1.4.0" +firebaseAuthKtx = "23.2.0" +firebaseBom = "33.9.0" guava = "33.3.1-jre" -indramahkota = "1.2.0" +indramahkota = "1.3.3" installreferrer = "2.2" jgit = "6.8.0.202311291450-r" joda = "2.12.7" -koin = "4.0.0" -kotlin = "2.0.21" -kotlinxCoroutines = "1.9.0" +koin = "4.0.1" +kotlin = "2.1.0" +kotlinxCoroutines = "1.10.1" kotlinxSerialization = "1.7.3" -ksp = "2.0.21-1.0.27" +ksp = "2.1.0-1.0.29" ktor = "2.3.3" lifecycle = "2.8.7" lifecycleRuntimeCompose = "2.8.7" @@ -44,25 +44,25 @@ mapbox = "10.16.2" mhktCommonBom = "0.1.2" mockito = "5.4.0" molecule = "0.7.1" -navigation = "2.8.4" +navigation = "2.8.8" okhttp = "4.12.0" okhttp3IdlingResource = "1.0.0" -paging = "3.3.4" -pagingCommonAndroid = "3.3.4" -playServicesAuth = "21.2.0" +paging = "3.3.6" +pagingCommonAndroid = "3.3.6" +playServicesAuth = "21.3.0" playServicesInstant = "18.1.0" playServicesLocation = "21.3.0" prettyTime = "5.0.0.Final" protobuf = "4.26.1" -r8Version = "8.5.35" +r8Version = "8.7.18" retrofit = "2.11.0" retrofitConverterKotlinxSerialization = "1.0.0" room = "2.6.1" -sentry = "7.15.0" +sentry = "8.2.0" sqliteKtx = "2.4.0" -turbine = "1.1.0" -uiTooling = "1.7.5" -uiToolingPreviewAndroid = "1.7.5" +turbine = "1.2.0" +uiTooling = "1.7.8" +uiToolingPreviewAndroid = "1.7.8" zxing = "3.5.0" [libraries] diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b9..9bbc975 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index df97d72..37f853b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6..faf9300 100755 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/sample.development.properties b/sample.development.properties new file mode 100644 index 0000000..3fef7e1 --- /dev/null +++ b/sample.development.properties @@ -0,0 +1 @@ +BACKEND_URL="https://development.example.com" diff --git a/secrets.defaults.properties b/secrets.defaults.properties index be3a03b..e3d9494 100644 --- a/secrets.defaults.properties +++ b/secrets.defaults.properties @@ -1 +1 @@ -BACKEND_URL="https://backend.example.com" +BACKEND_URL="https://production.example.com" diff --git a/settings.gradle.kts b/settings.gradle.kts index 5a666ce..77bd027 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -28,7 +28,7 @@ dependencyResolutionManagement { } plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" + id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" } include(":app")