Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
3ef5d93
fix: 장부 온보딩 반복적으로 노출 되는 현상 수정
jhg3410 Aug 17, 2025
2555b72
refactor: LedgeViewModel 불필요한 로직 제거
jhg3410 Aug 17, 2025
bab4802
Merge pull request #60 from MONEYMONG/feature/ID-40
jhg3410 Aug 21, 2025
2756f6c
targetSdk, compileSdk 35 변경 및 AGP 버전 변경
jhg3410 Aug 21, 2025
247ad1b
EdgeToEdge 적용
jhg3410 Sep 21, 2025
3dd7097
장부 상세 운영진 여부에 따른 System NavigationBar 색상 변경
jhg3410 Sep 22, 2025
d74b242
NavigationBar border 위치 수정 및 하단 border 가려주는 Rect 크기 수정
jhg3410 Sep 24, 2025
bb25f06
장부 OnBoarding 화면 Component 위치 값(offset) 수정
jhg3410 Sep 24, 2025
a1a4b0d
화면별 기본 SystemBar 색상 설정 외에 커스텀 적용 가능하도록 개선 및 장부 온보딩에 적용
jhg3410 Sep 25, 2025
4acf05e
장부 상세 운영진 여부에 따른 System NavigationBar 색상 변경 로직 수정
jhg3410 Sep 25, 2025
450ff1a
장부 화면 snackbar 위치 수정
jhg3410 Sep 25, 2025
ec1db5e
targetSdk35에서 Kotlin stdlib, java.util.List의 충돌로 인한 removeFirst 함수 제거
jhg3410 Sep 27, 2025
23f8348
SystemBar Color 투명도 적용 시 기본 색상 베이스로 배치되도록 수정
jhg3410 Sep 27, 2025
63dd733
Merge pull request #61 from MONEYMONG/feature/ID-39
Heonbyeong Sep 29, 2025
07e1655
[ID-41] 리뷰 반영 https://github.com/MONEYMONG/Android-Moneymong/pull/62#…
jhg3410 Oct 5, 2025
54825b2
Merge remote-tracking branch 'origin/develop' into feature/ID-41
jhg3410 Oct 10, 2025
f48e744
병합 과정에서 생긴 불필요한 import 제거
jhg3410 Oct 10, 2025
79e9df1
Merge pull request #62 from MONEYMONG/feature/ID-41
jhg3410 Oct 10, 2025
407de97
장부 생성 화면 "초대코드 받았어요" UI 추가
jhg3410 Sep 25, 2025
50b70da
로그인 화면 -> 장부 생성하기 화면으로 이동했을 때만 초대코드 받았어요 visible 처리
jhg3410 Sep 26, 2025
73c3564
장부 생성 화면 "초대코드를 받았어요 >" 클릭 이벤트 처리
jhg3410 Sep 26, 2025
f2cfc8e
로그인 -> 장부 생성 화면 -> 뒤로 가기 했을 때 동작 없는 이슈 수정
jhg3410 Sep 26, 2025
3687de8
장부 화면 소속된 장부 없을 때도 [장부 생성, 초대 코드 입력 BottomSheet] 활성화할 수 있도록 수정
jhg3410 Sep 26, 2025
76cfd07
초대코드 입력 화면 뒤로가기 or 닫기 상태를 navigate 시 argument로 전달하도록 수정
jhg3410 Oct 5, 2025
1abfa92
초대코드 입력 화면 뒤로가기 or 닫기 상태(isBackButton)에 따른 UI 변경
jhg3410 Oct 5, 2025
4906049
Merge pull request #64 from MONEYMONG/feature/ID-48
jhg3410 Oct 20, 2025
1e6fdac
versionName 변경 2.0.1 -> 2.0.2
jhg3410 Oct 28, 2025
93b4cac
core:network 모듈 -> domain 모듈 의존성 추가
jhg3410 Oct 28, 2025
c0baf4f
android-ci.yml의 local.properties 키값 네이밍 변경
jhg3410 Oct 28, 2025
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
4 changes: 2 additions & 2 deletions .github/workflows/android-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
- name: Create API Certificate
run: |
echo "sdk.dir=$ANDROID_SDK_ROOT" > ./local.properties
echo "native_app_key=\"${{ secrets.NATIVE_APP_KEY }}\"" >> ./local.properties
echo "NATIVE_APP_KEY=\"${{ secrets.NATIVE_APP_KEY }}\"" >> ./local.properties
echo "CLOVA_OCR_DOCUMENT_SECRET=\"${{ secrets.CLOVA_OCR_DOCUMENT_SECRET }}\"" >> ./local.properties
echo "CLOVA_OCR_DOCUMENT_BASEURL=\"${{ secrets.CLOVA_OCR_DOCUMENT_BASEURL }}\"" >> ./local.properties

Expand Down Expand Up @@ -84,7 +84,7 @@ jobs:
- name: Create API Certificate
run: |
echo "sdk.dir=$ANDROID_SDK_ROOT" > ./local.properties
echo "native_app_key=\"${{ secrets.NATIVE_APP_KEY }}\"" >> ./local.properties
echo "NATIVE_APP_KEY=\"${{ secrets.NATIVE_APP_KEY }}\"" >> ./local.properties
echo "CLOVA_OCR_DOCUMENT_SECRET=\"${{ secrets.CLOVA_OCR_DOCUMENT_SECRET }}\"" >> ./local.properties
echo "CLOVA_OCR_DOCUMENT_BASEURL=\"${{ secrets.CLOVA_OCR_DOCUMENT_BASEURL }}\"" >> ./local.properties

Expand Down
18 changes: 7 additions & 11 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties

@Suppress("DSL_SCOPE_VIOLATION")
plugins {
alias(libs.plugins.moneymong.android.application)
Expand All @@ -13,21 +11,21 @@ plugins {

android {
namespace = "com.moneymong.moneymong"
compileSdk = 34
compileSdk = 35

defaultConfig {
applicationId = "com.moneymong.moneymong"
minSdk = 24
targetSdk = 34
targetSdk = 35
versionCode = 31
versionName = "2.0.1"
versionName = "2.0.2"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
buildConfigField("String", "NATIVE_APP_KEY", getApiKey("native_app_key"))
}

buildFeatures {
buildConfig = true
}
Expand All @@ -50,6 +48,8 @@ android {

dependencies {
implementation(projects.core.ui)
implementation(projects.core.analytics)
implementation(projects.core.android)
implementation(projects.core.designSystem)
implementation(projects.core.common)
implementation(projects.core.model)
Expand Down Expand Up @@ -82,8 +82,4 @@ dependencies {
testImplementation(libs.junit4)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.test.espresso.core)
}

fun getApiKey(propertyKey: String): String {
return gradleLocalProperties(rootDir).getProperty(propertyKey)
}
}
59 changes: 38 additions & 21 deletions app/src/main/java/com/moneymong/moneymong/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
package com.moneymong.moneymong

import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.compose.LifecycleStartEffect
import com.moneymong.moneymong.common.event.EventTracker
import com.moneymong.moneymong.analytics.AnalyticsTracker
import com.moneymong.moneymong.analytics.LocalAnalyticsTracker
import com.moneymong.moneymong.design_system.error.ErrorDialog
import com.moneymong.moneymong.design_system.theme.MMTheme
import com.moneymong.moneymong.domain.repository.token.TokenRepository
Expand All @@ -30,11 +36,20 @@ class MainActivity : ComponentActivity() {
lateinit var tokenRepository: TokenRepository

@Inject
lateinit var eventTracker: EventTracker
lateinit var analyticsTracker: AnalyticsTracker

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
eventTracker.initialize()
enableEdgeToEdge(
navigationBarStyle = SystemBarStyle.auto(
Color.TRANSPARENT,
Color.TRANSPARENT
)
).also {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
window.isNavigationBarContrastEnforced = false
}
}

setContent {
val context = LocalContext.current
Expand All @@ -53,27 +68,29 @@ class MainActivity : ComponentActivity() {
onStopOrDispose { }
})

MMTheme {
if (shouldUpdate) {
ErrorDialog(
message = "안정적인 머니몽 사용을 위해\n최신 버전으로 업데이트가 필요해요!",
confirmText = "업데이트",
onConfirm = {
val playStoreUrl =
"https://play.google.com/store/apps/details?id=${BuildConfig.APPLICATION_ID}"
val intent = Intent(Intent.ACTION_VIEW).apply {
data = Uri.parse(playStoreUrl)
setPackage("com.android.vending")
CompositionLocalProvider(LocalAnalyticsTracker provides analyticsTracker) {
MMTheme {
if (shouldUpdate) {
ErrorDialog(
message = "안정적인 머니몽 사용을 위해\n최신 버전으로 업데이트가 필요해요!",
confirmText = "업데이트",
onConfirm = {
val playStoreUrl =
"https://play.google.com/store/apps/details?id=${BuildConfig.APPLICATION_ID}"
val intent = Intent(Intent.ACTION_VIEW).apply {
data = Uri.parse(playStoreUrl)
setPackage("com.android.vending")
}
context.startActivity(intent)
}
context.startActivity(intent)
}
)
}

MoneyMongApp(
expired = expired,
onChangeExpired = { expired = false }
)
}

MoneyMongApp(
expired = expired,
onChangeExpired = { expired = false }
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.moneymong.moneymong

import com.moneymong.moneymong.common.base.SideEffect
import com.moneymong.moneymong.android.SideEffect

sealed class MainSideEffect: SideEffect {
}
2 changes: 1 addition & 1 deletion app/src/main/java/com/moneymong/moneymong/MainState.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.moneymong.moneymong

import com.moneymong.moneymong.common.base.State
import com.moneymong.moneymong.android.State

data class MainState(
val shouldUpdate: Boolean = false
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/moneymong/moneymong/MainViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.moneymong.moneymong

import com.moneymong.moneymong.common.base.BaseViewModel
import com.moneymong.moneymong.android.BaseViewModel
import com.moneymong.moneymong.domain.usecase.version.CheckVersionUpdateUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import org.orbitmvi.orbit.syntax.simple.intent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class AndroidApplicationConventionPlugin : Plugin<Project> {

extensions.configure<ApplicationExtension> {
configureKotlinAndroid(this)
defaultConfig.targetSdk = 34
defaultConfig.targetSdk = 35
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class AndroidLibraryConventionPlugin : Plugin<Project> {

extensions.configure<LibraryExtension> {
configureKotlinAndroid(this)
defaultConfig.targetSdk = 34
defaultConfig.targetSdk = 35
configureFlavors(this)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies

internal fun Project.configureAndroidCompose(
commonExtension: CommonExtension<*, *, *, *, *>,
commonExtension: CommonExtension<*, *, *, *, *, *>,
) {
commonExtension.apply {
buildFeatures {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies

internal fun Project.configureKotlinAndroid(
commonExtension: CommonExtension<*, *, *, *, *>,
commonExtension: CommonExtension<*, *, *, *, *, *>,
) {
commonExtension.apply {
compileSdk = 34
compileSdk = 35

defaultConfig {
minSdk = 24
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ enum class MoneyMongFlavor(val dimension: FlavorDimension, val applicationIdSuff
}

fun configureFlavors(
commonExtension: CommonExtension<*, *, *, *, *>,
commonExtension: CommonExtension<*, *, *, *, *, *>,
flavorConfigurationBlock: ProductFlavor.(flavor: MoneyMongFlavor) -> Unit = {}
) {
commonExtension.apply {
Expand Down
1 change: 1 addition & 0 deletions core/analytics/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
15 changes: 15 additions & 0 deletions core/analytics/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed
plugins {
alias(libs.plugins.moneymong.android.library)
alias(libs.plugins.moneymong.android.hilt)
}

android {
namespace = "com.moneymong.moneymong.analytics"
}

dependencies {
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.analytics)
implementation(libs.firebase.crashlytics)
}
Empty file.
21 changes: 21 additions & 0 deletions core/analytics/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.moneymong.moneymong.analytics

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4

import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*

/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.moneymong.moneymong.analytics.test", appContext.packageName)
}
}
4 changes: 4 additions & 0 deletions core/analytics/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.moneymong.moneymong.analytics

data class AnalyticsEvent(
val type: String,
val extras: List<Param> = emptyList(),
) {
data class Param(
val key: String,
val value: String,
)

companion object {
const val SCREEN_VIEW = "screen_view"
const val SCREEN_NAME = "screen_name"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.moneymong.moneymong.analytics

import com.google.firebase.Firebase
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.analytics
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
abstract class AnalyticsModule {

@Binds
@Singleton
abstract fun bindsAnalyticsTracker(firebaseAnalyticsTracker: FirebaseAnalyticsTracker): AnalyticsTracker

companion object {
@Provides
@Singleton
fun provideFirebaseAnalytics(): FirebaseAnalytics = Firebase.analytics
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.moneymong.moneymong.analytics

interface AnalyticsTracker {
fun logEvent(event: AnalyticsEvent)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.moneymong.moneymong.analytics

import androidx.compose.runtime.staticCompositionLocalOf

val LocalAnalyticsTracker = staticCompositionLocalOf<AnalyticsTracker> {
NoOpAnalyticsTracker()
}
Loading