Skip to content

Commit cac3c81

Browse files
authored
Merge pull request #154 from YAPP-Github/BOOK-274-feature/#151
feat: 설정 화면 내 최신 버전 정보 조회 기능 구현
2 parents af02634 + 4b2fd58 commit cac3c81

File tree

27 files changed

+556
-126
lines changed

27 files changed

+556
-126
lines changed

build-logic/src/main/kotlin/AndroidApplicationConventionPlugin.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import com.ninecraft.booket.convention.ApplicationConstants
33
import com.ninecraft.booket.convention.Plugins
44
import com.ninecraft.booket.convention.applyPlugins
55
import com.ninecraft.booket.convention.configureAndroid
6+
import com.ninecraft.booket.convention.libs
67
import org.gradle.api.Plugin
78
import org.gradle.api.Project
89
import org.gradle.kotlin.dsl.configure
@@ -19,9 +20,9 @@ internal class AndroidApplicationConventionPlugin : Plugin<Project> {
1920
configureAndroid(this)
2021

2122
defaultConfig {
22-
targetSdk = ApplicationConstants.TARGET_SDK
23-
versionName = ApplicationConstants.VERSION_NAME
24-
versionCode = ApplicationConstants.VERSION_CODE
23+
targetSdk = libs.versions.targetSdk.get().toInt()
24+
versionName = libs.versions.versionName.get()
25+
versionCode = libs.versions.versionCode.get().toInt()
2526
}
2627
}
2728
}

build-logic/src/main/kotlin/AndroidLibraryConventionPlugin.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import com.android.build.gradle.LibraryExtension
22
import com.ninecraft.booket.convention.Plugins
33
import com.ninecraft.booket.convention.applyPlugins
44
import com.ninecraft.booket.convention.configureAndroid
5+
import com.ninecraft.booket.convention.libs
56
import org.gradle.api.Plugin
67
import org.gradle.api.Project
78
import org.gradle.kotlin.dsl.configure
8-
import com.ninecraft.booket.convention.ApplicationConstants
99

1010
internal class AndroidLibraryConventionPlugin : Plugin<Project> {
1111
override fun apply(target: Project) {
@@ -19,7 +19,7 @@ internal class AndroidLibraryConventionPlugin : Plugin<Project> {
1919
configureAndroid(this)
2020

2121
defaultConfig.apply {
22-
targetSdk = ApplicationConstants.TARGET_SDK
22+
targetSdk = libs.versions.targetSdk.get().toInt()
2323
}
2424
}
2525
}

build-logic/src/main/kotlin/com/ninecraft/booket/convention/Android.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
88

99
internal fun Project.configureAndroid(extension: CommonExtension<*, *, *, *, *, *>) {
1010
extension.apply {
11-
compileSdk = ApplicationConstants.COMPILE_SDK
11+
compileSdk = libs.versions.compileSdk.get().toInt()
1212

1313
defaultConfig {
14-
minSdk = ApplicationConstants.MIN_SDK
14+
minSdk = libs.versions.minSdk.get().toInt()
1515
}
1616

1717
compileOptions {

build-logic/src/main/kotlin/com/ninecraft/booket/convention/ApplicationConstants.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,6 @@ package com.ninecraft.booket.convention
33
import org.gradle.api.JavaVersion
44

55
internal object ApplicationConstants {
6-
const val MIN_SDK = 28
7-
const val TARGET_SDK = 35
8-
const val COMPILE_SDK = 35
9-
const val VERSION_CODE = 3
10-
const val VERSION_NAME = "1.0.0"
116
const val JAVA_VERSION_INT = 17
127
val javaVersion = JavaVersion.VERSION_17
138
}

core/common/build.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ plugins {
99

1010
android {
1111
namespace = "com.ninecraft.booket.core.common"
12+
13+
buildFeatures {
14+
buildConfig = true
15+
}
16+
17+
defaultConfig {
18+
buildConfigField("String", "PACKAGE_NAME", "\"${libs.versions.packageName.get()}\"")
19+
}
1220
}
1321

1422
dependencies {

core/common/src/main/kotlin/com/ninecraft/booket/core/common/extensions/Context.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package com.ninecraft.booket.core.common.extensions
22

33
import android.content.ContentValues
44
import android.content.Context
5+
import android.content.Intent
6+
import androidx.core.net.toUri
7+
import com.ninecraft.booket.core.common.BuildConfig
58
import android.graphics.Bitmap
69
import android.os.Build
710
import android.os.Environment
@@ -41,7 +44,8 @@ fun Context.saveImageToGallery(bitmap: ImageBitmap) {
4144
}
4245
}
4346

44-
val imageUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
47+
val imageUri =
48+
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
4549
imageUri?.let { uri ->
4650
contentResolver.openOutputStream(uri)?.use { outputStream ->
4751
bitmap.asAndroidBitmap().compress(Bitmap.CompressFormat.PNG, 100, outputStream)
@@ -57,3 +61,9 @@ fun Context.saveImageToGallery(bitmap: ImageBitmap) {
5761
Logger.e("Failed to save image to gallery: ${e.message}")
5862
}
5963
}
64+
65+
fun Context.openPlayStore() {
66+
val intent =
67+
Intent(Intent.ACTION_VIEW, "market://details?id=${BuildConfig.PACKAGE_NAME}".toUri())
68+
startActivity(intent)
69+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.ninecraft.booket.core.common.util
2+
3+
import com.orhanobut.logger.Logger
4+
5+
/**
6+
* 두 버전을 비교하는 함수
7+
*
8+
* @param version1 첫 번째 버전 (예: "1.2.3")
9+
* @param version2 두 번째 버전 (예: "1.1.0")
10+
* @return 양수면 version1 > version2, 음수면 version1 < version2, 0이면 같음
11+
*
12+
* 버전 형식: "메이저.마이너.패치" (예: 1.2.3)
13+
* 비교 순서: 메이저 → 마이너 → 패치 버전 순으로 비교
14+
*/
15+
fun compareVersions(version1: String, version2: String): Int {
16+
Logger.d("compareVersions: version1: $version1, version2: $version2")
17+
18+
if (!Regex("""^\d+\.\d+\.\d+$""").matches(version1)) return 0
19+
if (!Regex("""^\d+\.\d+\.\d+$""").matches(version2)) return 0
20+
21+
val v1 = version1.split('.').map { it.toInt() }
22+
val v2 = version2.split('.').map { it.toInt() }
23+
24+
// 메이저 버전 비교
25+
if (v1[0] != v2[0]) return v1[0] - v2[0]
26+
27+
// 마이너 버전 비교
28+
if (v1[1] != v2[1]) return v1[1] - v2[1]
29+
30+
// 패치 버전 비교
31+
return v1[2] - v2[2]
32+
}
33+
34+
/**
35+
* 현재 앱 버전이 최소 요구 버전보다 낮은지 확인하는 함수
36+
*
37+
* @param currentVersion 현재 앱의 버전 (예: "1.0.0")
38+
* @param minVersion 최소 요구 버전 (Firebase Remote Config에서 가져온 값)
39+
* @return true면 강제 업데이트 필요 (현재 버전 < 최소 요구 버전), false면 업데이트 불필요
40+
*/
41+
fun isUpdateRequired(currentVersion: String, minVersion: String): Boolean {
42+
return compareVersions(currentVersion, minVersion) < 0
43+
}

core/common/src/main/kotlin/com/ninecraft/booket/core/common/utils/HandleException.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import java.net.UnknownHostException
1919
fun handleException(
2020
exception: Throwable,
2121
onError: (String) -> Unit,
22-
onLoginRequired: () -> Unit,
22+
onLoginRequired: () -> Unit = {},
2323
) {
2424
when {
2525
exception is HttpException && exception.code() == 401 -> {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.ninecraft.booket.core.data.api.repository
2+
3+
interface RemoteConfigRepository {
4+
suspend fun getLatestVersion(): Result<String>
5+
suspend fun shouldUpdate(): Result<Boolean>
6+
}

core/data/impl/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ plugins {
88

99
android {
1010
namespace = "com.ninecraft.booket.core.data.impl"
11+
12+
buildFeatures {
13+
buildConfig = true
14+
}
15+
16+
defaultConfig {
17+
buildConfigField("String", "APP_VERSION", "\"${libs.versions.versionName.get()}\"")
18+
}
1119
}
1220

1321
dependencies {
@@ -18,6 +26,8 @@ dependencies {
1826
projects.core.model,
1927
projects.core.network,
2028

29+
platform(libs.firebase.bom),
30+
libs.firebase.remote.config,
2131
libs.logger,
2232
)
2333
}

0 commit comments

Comments
 (0)