diff --git a/.gitignore b/.gitignore index 3c3cef3..dccd6cd 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,9 @@ captures/ *.jks *.keystore +# Key properties (contains sensitive signing info) +app/key.properties + # External native build folder generated in Android Studio 2.2 and later .externalNativeBuild .cxx/ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8ab4813..332b5e4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,14 @@ +import java.util.Properties +import java.io.FileInputStream + +// Load keystore properties +val keystorePropertiesFile = rootProject.file("app/key.properties") +val keystoreProperties = Properties() +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + + plugins { id("com.android.application") id("org.jetbrains.kotlin.android") @@ -6,35 +17,45 @@ plugins { } android { - namespace = "com.hotdeal.alarm" - compileSdk = 35 + namespace = "com.hotdeal.alarm" + compileSdk = 35 - defaultConfig { - applicationId = "com.hotdeal.alarm" - minSdk = 31 - targetSdk = 35 - versionCode = 1 - versionName = "1.0.0" + defaultConfig { + applicationId = "com.hotdeal.alarm" + minSdk = 31 + targetSdk = 35 + versionCode = 1 + versionName = "1.0.0" - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { - useSupportLibrary = true - } - } + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } - buildTypes { - release { - isMinifyEnabled = true - isShrinkResources = true - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - debug { - isMinifyEnabled = false - } - } + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String? + keyPassword = keystoreProperties["keyPassword"] as String? + storeFile = keystoreProperties["storeFile"]?.let { file("$it") } + storePassword = keystoreProperties["storePassword"] as String? + } + } + + buildTypes { + release { + isMinifyEnabled = true + isShrinkResources = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + signingConfig = signingConfigs.getByName("release") + } + debug { + isMinifyEnabled = false + } + } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index fa4a837..51e276b 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -16,3 +16,7 @@ # Kotlin Coroutines -keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} -keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} + +# JSpecify annotations (for Jsoup compatibility) +-dontwarn org.jspecify.annotations.** + diff --git a/app/src/main/java/com/hotdeal/alarm/presentation/main/MainViewModel.kt b/app/src/main/java/com/hotdeal/alarm/presentation/main/MainViewModel.kt index d45c524..cd1217a 100644 --- a/app/src/main/java/com/hotdeal/alarm/presentation/main/MainViewModel.kt +++ b/app/src/main/java/com/hotdeal/alarm/presentation/main/MainViewModel.kt @@ -26,9 +26,9 @@ class MainViewModel @Inject constructor( private val _uiState = MutableStateFlow(MainUiState.Loading) val uiState: StateFlow = _uiState.asStateFlow() - // 폴� 주기 + // 폴링 주기 (저장된 값 즉시 반영) val pollingInterval: StateFlow = appSettings.pollingInterval - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), 2) + .stateIn(viewModelScope, SharingStarted.Eagerly, 2) init { initializeApp()