Skip to content

Commit ff0d17c

Browse files
authored
Merge pull request #40 from MONEYMONG/release/release
Release/release -> master merge
2 parents 5405d12 + d26f74d commit ff0d17c

File tree

44 files changed

+225
-119
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+225
-119
lines changed

app/build.gradle.kts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
2-
import java.io.FileInputStream
3-
import java.util.Properties
42

53
@Suppress("DSL_SCOPE_VIOLATION")
64
plugins {
@@ -21,16 +19,16 @@ android {
2119
applicationId = "com.moneymong.moneymong"
2220
minSdk = 24
2321
targetSdk = 34
24-
versionCode = 26
25-
versionName = "1.2.1"
22+
versionCode = 27
23+
versionName = "1.2.2"
2624

2725
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2826
vectorDrawables {
2927
useSupportLibrary = true
3028
}
3129
buildConfigField("String", "NATIVE_APP_KEY", getApiKey("native_app_key"))
3230
}
33-
buildFeatures{
31+
buildFeatures {
3432
buildConfig = true
3533
}
3634

@@ -74,6 +72,7 @@ dependencies {
7472

7573
implementation(libs.androidx.activity.compose)
7674
implementation(libs.androidx.compose.material3)
75+
implementation(libs.lifecycle.runtime.compose)
7776
implementation(libs.orbit.core)
7877
implementation(libs.orbit.compose)
7978
implementation(libs.orbit.viewModel)
@@ -85,6 +84,6 @@ dependencies {
8584
androidTestImplementation(libs.androidx.test.espresso.core)
8685
}
8786

88-
fun getApiKey(propertyKey : String): String {
87+
fun getApiKey(propertyKey: String): String {
8988
return gradleLocalProperties(rootDir).getProperty(propertyKey)
9089
}
Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,30 @@
11
package com.moneymong.moneymong
22

3+
import android.content.Intent
4+
import android.net.Uri
35
import android.os.Bundle
4-
import android.util.Log
56
import androidx.activity.ComponentActivity
67
import androidx.activity.compose.setContent
7-
import androidx.compose.material3.Text
8-
import androidx.compose.runtime.Composable
9-
import androidx.compose.runtime.MutableState
8+
import androidx.activity.viewModels
9+
import androidx.compose.runtime.getValue
1010
import androidx.compose.runtime.mutableStateOf
11-
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.platform.LocalContext
12+
import androidx.lifecycle.compose.LifecycleStartEffect
1213
import com.moneymong.moneymong.common.event.EventTracker
13-
import dagger.hilt.android.AndroidEntryPoint
14+
import com.moneymong.moneymong.design_system.error.ErrorDialog
1415
import com.moneymong.moneymong.design_system.theme.MMTheme
15-
import com.moneymong.moneymong.domain.repository.TokenRepository
16-
import com.moneymong.moneymong.domain.repository.user.UserRepository
17-
import com.moneymong.moneymong.feature.sign.LoginScreen
18-
import com.moneymong.moneymong.feature.sign.SignUpScreen
19-
import com.moneymong.moneymong.ocr.OCRScreen
16+
import com.moneymong.moneymong.domain.repository.token.TokenRepository
2017
import com.moneymong.moneymong.ui.MoneyMongApp
21-
import kotlinx.coroutines.CoroutineDispatcher
18+
import dagger.hilt.android.AndroidEntryPoint
2219
import kotlinx.coroutines.CoroutineScope
2320
import kotlinx.coroutines.Dispatchers
24-
import kotlinx.coroutines.coroutineScope
2521
import kotlinx.coroutines.launch
22+
import org.orbitmvi.orbit.compose.collectAsState
2623
import javax.inject.Inject
27-
import kotlin.coroutines.CoroutineContext
2824

2925
@AndroidEntryPoint
3026
class MainActivity : ComponentActivity() {
27+
private val viewModel: MainViewModel by viewModels()
3128

3229
@Inject
3330
lateinit var tokenRepository: TokenRepository
@@ -41,7 +38,32 @@ class MainActivity : ComponentActivity() {
4138
eventTracker.initialize()
4239

4340
setContent {
41+
val context = LocalContext.current
42+
val state by viewModel.collectAsState()
43+
44+
val shouldUpdate = state.shouldUpdate
45+
LifecycleStartEffect(key1 = Unit, effects = {
46+
viewModel.checkShouldUpdate(version = BuildConfig.VERSION_NAME)
47+
onStopOrDispose { }
48+
})
49+
4450
MMTheme {
51+
if (shouldUpdate) {
52+
ErrorDialog(
53+
message = "안정적인 머니몽 사용을 위해\n최신 버전으로 업데이트가 필요해요!",
54+
confirmText = "업데이트",
55+
onConfirm = {
56+
val playStoreUrl =
57+
"https://play.google.com/store/apps/details?id=${BuildConfig.APPLICATION_ID}"
58+
val intent = Intent(Intent.ACTION_VIEW).apply {
59+
data = Uri.parse(playStoreUrl)
60+
setPackage("com.android.vending")
61+
}
62+
context.startActivity(intent)
63+
}
64+
)
65+
}
66+
4567
MoneyMongApp(expired.value) {
4668
expired.value = false
4769
}
@@ -54,12 +76,4 @@ class MainActivity : ComponentActivity() {
5476
}
5577
}
5678
}
57-
}
58-
59-
@Composable
60-
fun Greeting(name: String, modifier: Modifier = Modifier) {
61-
Text(
62-
text = "Hello $name!",
63-
modifier = modifier
64-
)
6579
}

app/src/main/java/com/moneymong/moneymong/MainState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ package com.moneymong.moneymong
33
import com.moneymong.moneymong.common.base.State
44

55
data class MainState(
6-
val something: Any? = null // TODO
6+
val shouldUpdate: Boolean = false
77
): State
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
11
package com.moneymong.moneymong
22

33
import com.moneymong.moneymong.common.base.BaseViewModel
4+
import com.moneymong.moneymong.domain.usecase.version.CheckVersionUpdateUseCase
45
import dagger.hilt.android.lifecycle.HiltViewModel
6+
import org.orbitmvi.orbit.syntax.simple.intent
7+
import org.orbitmvi.orbit.syntax.simple.reduce
58
import javax.inject.Inject
69

710
@HiltViewModel
8-
class MainViewModel @Inject constructor() : BaseViewModel<MainState, MainSideEffect>(MainState()) {
11+
class MainViewModel @Inject constructor(
12+
val checkVersionUpdateUseCase: CheckVersionUpdateUseCase
13+
) : BaseViewModel<MainState, MainSideEffect>(MainState()) {
14+
15+
fun checkShouldUpdate(version: String) = intent {
16+
val shouldUpdate =
17+
checkVersionUpdateUseCase(version = version).isFailure
18+
reduce {
19+
state.copy(shouldUpdate = shouldUpdate)
20+
}
21+
}
922
}

core/design-system/src/main/java/com/moneymong/moneymong/design_system/error/ErrorDialog.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ fun ErrorDialog(
4444
modifier: Modifier = Modifier,
4545
message: String,
4646
description: String = "",
47-
onConfirm: () -> Unit
47+
confirmText: String = "확인",
48+
onConfirm: () -> Unit,
4849
) {
4950
val horizontalPadding = 22.dp
5051
val buttonWidth = 276.dp
@@ -93,7 +94,7 @@ fun ErrorDialog(
9394
MDSButton(
9495
modifier = Modifier.width(buttonWidth),
9596
onClick = onConfirm,
96-
text = "확인",
97+
text = confirmText,
9798
type = MDSButtonType.PRIMARY,
9899
size = MDSButtonSize.LARGE,
99100
)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.moneymong.moneymong.model.version
2+
3+
data class VersionRequest(
4+
val version: String
5+
)

core/network/src/main/java/com/moneymong/moneymong/network/adapter/ResultCallAdapter.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,16 @@ private class ResultCall<T>(
4848
return Result.failure(MoneyMongError.UnExpectedError)
4949
}
5050

51-
val errorResponse = fromJsonToErrorResponse(errorBody)
52-
val httpError = getErrorByStatusCode(
53-
statusCode = errorResponse.status,
54-
message = errorResponse.message
55-
)
56-
return Result.failure(httpError)
51+
return try {
52+
val errorResponse = fromJsonToErrorResponse(errorBody)
53+
val httpError = getErrorByStatusCode(
54+
statusCode = errorResponse.status,
55+
message = errorResponse.message
56+
)
57+
Result.failure(httpError)
58+
} catch (e: Exception) {
59+
Result.failure(MoneyMongError.UnExpectedError)
60+
}
5761
}
5862

5963
override fun onFailure(call: Call<T>, t: Throwable) {

core/network/src/main/java/com/moneymong/moneymong/network/api/MoneyMongApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package com.moneymong.moneymong.network.api
33
import com.moneymong.moneymong.model.ocr.FileUploadResponse
44
import okhttp3.MultipartBody
55
import retrofit2.http.Multipart
6-
import retrofit2.http.Part
76
import retrofit2.http.POST
7+
import retrofit2.http.Part
88

99
interface MoneyMongApi {
1010

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.moneymong.moneymong.network.api
2+
3+
import com.moneymong.moneymong.model.version.VersionRequest
4+
import retrofit2.http.Body
5+
import retrofit2.http.POST
6+
7+
interface VersionApi {
8+
9+
@POST("api/v1/version")
10+
suspend fun checkUpdate(
11+
@Body version: VersionRequest
12+
): Result<Unit>
13+
}

core/network/src/main/java/com/moneymong/moneymong/network/di/NetworkModule.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.moneymong.moneymong.network.api.MemberApi
1717
import com.moneymong.moneymong.network.api.MoneyMongApi
1818
import com.moneymong.moneymong.network.api.UniversityApi
1919
import com.moneymong.moneymong.network.api.UserApi
20+
import com.moneymong.moneymong.network.api.VersionApi
2021
import com.moneymong.moneymong.network.util.AuthInterceptor
2122
import com.moneymong.moneymong.network.util.MoneyMongTokenAuthenticator
2223
import dagger.Module
@@ -143,6 +144,10 @@ object NetworkModule {
143144
fun provideMemberApi(@MoneyMongRetrofit retrofit: Retrofit): MemberApi =
144145
retrofit.create(MemberApi::class.java)
145146

147+
@Provides
148+
fun provideVersionApi(@MoneyMongRetrofit retrofit: Retrofit): VersionApi =
149+
retrofit.create(VersionApi::class.java)
150+
146151
@Provides
147152
fun provideClovaApi(@ClovaRetrofit retrofit: Retrofit): ClovaApi =
148153
retrofit.create(ClovaApi::class.java)

0 commit comments

Comments
 (0)