diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 79c35f00..a530fd72 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -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 @@ -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 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5306826d..b690974d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,5 +1,3 @@ -import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties - @Suppress("DSL_SCOPE_VIOLATION") plugins { alias(libs.plugins.moneymong.android.application) @@ -13,21 +11,21 @@ plugins { android { namespace = "com.moneymong.moneymong" - compileSdk = 34 + compileSdk = 35 defaultConfig { applicationId = "com.moneymong.moneymong" minSdk = 24 - targetSdk = 34 - versionCode = 31 - versionName = "2.0.1" + targetSdk = 35 + versionCode = 32 + versionName = "2.0.2" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true } - buildConfigField("String", "NATIVE_APP_KEY", getApiKey("native_app_key")) } + buildFeatures { buildConfig = true } @@ -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) @@ -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) -} +} \ No newline at end of file diff --git a/app/src/main/java/com/moneymong/moneymong/MainActivity.kt b/app/src/main/java/com/moneymong/moneymong/MainActivity.kt index bf56c412..f60ef692 100644 --- a/app/src/main/java/com/moneymong/moneymong/MainActivity.kt +++ b/app/src/main/java/com/moneymong/moneymong/MainActivity.kt @@ -1,11 +1,16 @@ 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 @@ -13,7 +18,8 @@ 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 @@ -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 @@ -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 } - ) } } } diff --git a/app/src/main/java/com/moneymong/moneymong/MainSideEffect.kt b/app/src/main/java/com/moneymong/moneymong/MainSideEffect.kt index 268a99d1..dd6b75e1 100644 --- a/app/src/main/java/com/moneymong/moneymong/MainSideEffect.kt +++ b/app/src/main/java/com/moneymong/moneymong/MainSideEffect.kt @@ -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 { } \ No newline at end of file diff --git a/app/src/main/java/com/moneymong/moneymong/MainState.kt b/app/src/main/java/com/moneymong/moneymong/MainState.kt index e52687e3..b2e68f38 100644 --- a/app/src/main/java/com/moneymong/moneymong/MainState.kt +++ b/app/src/main/java/com/moneymong/moneymong/MainState.kt @@ -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 diff --git a/app/src/main/java/com/moneymong/moneymong/MainViewModel.kt b/app/src/main/java/com/moneymong/moneymong/MainViewModel.kt index 191ab18b..78cecc74 100644 --- a/app/src/main/java/com/moneymong/moneymong/MainViewModel.kt +++ b/app/src/main/java/com/moneymong/moneymong/MainViewModel.kt @@ -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 diff --git a/build-logic/convention/src/main/java/AndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/java/AndroidApplicationConventionPlugin.kt index 9785904f..5f422999 100644 --- a/build-logic/convention/src/main/java/AndroidApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/java/AndroidApplicationConventionPlugin.kt @@ -14,7 +14,7 @@ class AndroidApplicationConventionPlugin : Plugin { extensions.configure { configureKotlinAndroid(this) - defaultConfig.targetSdk = 34 + defaultConfig.targetSdk = 35 } } } diff --git a/build-logic/convention/src/main/java/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/java/AndroidLibraryConventionPlugin.kt index 53dd9ebd..64b31aa1 100644 --- a/build-logic/convention/src/main/java/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/java/AndroidLibraryConventionPlugin.kt @@ -15,7 +15,7 @@ class AndroidLibraryConventionPlugin : Plugin { extensions.configure { configureKotlinAndroid(this) - defaultConfig.targetSdk = 34 + defaultConfig.targetSdk = 35 configureFlavors(this) } } diff --git a/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/AndroidCompose.kt b/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/AndroidCompose.kt index 5c07899e..1e0cb017 100644 --- a/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/AndroidCompose.kt +++ b/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/AndroidCompose.kt @@ -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 { diff --git a/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/KotlinAndroid.kt b/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/KotlinAndroid.kt index 9e85d246..a91b769c 100644 --- a/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/KotlinAndroid.kt +++ b/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/KotlinAndroid.kt @@ -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 diff --git a/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/MoneyMongFlavor.kt b/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/MoneyMongFlavor.kt index 1c5295da..b32fd0d8 100644 --- a/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/MoneyMongFlavor.kt +++ b/build-logic/convention/src/main/java/com/moneymong/moneymong/buildlogic/convention/MoneyMongFlavor.kt @@ -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 { diff --git a/core/analytics/.gitignore b/core/analytics/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/core/analytics/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/analytics/build.gradle.kts b/core/analytics/build.gradle.kts new file mode 100644 index 00000000..348ef22f --- /dev/null +++ b/core/analytics/build.gradle.kts @@ -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) +} \ No newline at end of file diff --git a/core/analytics/consumer-rules.pro b/core/analytics/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/core/analytics/proguard-rules.pro b/core/analytics/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/core/analytics/proguard-rules.pro @@ -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 \ No newline at end of file diff --git a/core/analytics/src/androidTest/java/com/moneymong/moneymong/analytics/ExampleInstrumentedTest.kt b/core/analytics/src/androidTest/java/com/moneymong/moneymong/analytics/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..27a857dc --- /dev/null +++ b/core/analytics/src/androidTest/java/com/moneymong/moneymong/analytics/ExampleInstrumentedTest.kt @@ -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) + } +} \ No newline at end of file diff --git a/core/analytics/src/main/AndroidManifest.xml b/core/analytics/src/main/AndroidManifest.xml new file mode 100644 index 00000000..a5918e68 --- /dev/null +++ b/core/analytics/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/core/analytics/src/main/java/com/moneymong/moneymong/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/AnalyticsEvent.kt new file mode 100644 index 00000000..df6bc9ad --- /dev/null +++ b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/AnalyticsEvent.kt @@ -0,0 +1,16 @@ +package com.moneymong.moneymong.analytics + +data class AnalyticsEvent( + val type: String, + val extras: List = emptyList(), +) { + data class Param( + val key: String, + val value: String, + ) + + companion object { + const val SCREEN_VIEW = "screen_view" + const val SCREEN_NAME = "screen_name" + } +} \ No newline at end of file diff --git a/core/analytics/src/main/java/com/moneymong/moneymong/analytics/AnalyticsModule.kt b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/AnalyticsModule.kt new file mode 100644 index 00000000..462a54af --- /dev/null +++ b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/AnalyticsModule.kt @@ -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 + } +} \ No newline at end of file diff --git a/core/analytics/src/main/java/com/moneymong/moneymong/analytics/AnalyticsTracker.kt b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/AnalyticsTracker.kt new file mode 100644 index 00000000..a1fdbe76 --- /dev/null +++ b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/AnalyticsTracker.kt @@ -0,0 +1,5 @@ +package com.moneymong.moneymong.analytics + +interface AnalyticsTracker { + fun logEvent(event: AnalyticsEvent) +} \ No newline at end of file diff --git a/core/analytics/src/main/java/com/moneymong/moneymong/analytics/CompositionEventTracker.kt b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/CompositionEventTracker.kt new file mode 100644 index 00000000..6ce1edd5 --- /dev/null +++ b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/CompositionEventTracker.kt @@ -0,0 +1,7 @@ +package com.moneymong.moneymong.analytics + +import androidx.compose.runtime.staticCompositionLocalOf + +val LocalAnalyticsTracker = staticCompositionLocalOf { + NoOpAnalyticsTracker() +} diff --git a/core/analytics/src/main/java/com/moneymong/moneymong/analytics/FirebaseAnalyticsTracker.kt b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/FirebaseAnalyticsTracker.kt new file mode 100644 index 00000000..604f6c9d --- /dev/null +++ b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/FirebaseAnalyticsTracker.kt @@ -0,0 +1,25 @@ +package com.moneymong.moneymong.analytics + +import com.google.firebase.analytics.FirebaseAnalytics +import com.google.firebase.analytics.logEvent +import javax.inject.Inject + +class FirebaseAnalyticsTracker @Inject constructor( + private val firebaseAnalytics: FirebaseAnalytics +) : AnalyticsTracker { + override fun logEvent(event: AnalyticsEvent) { + firebaseAnalytics.logEvent(event.type) { + for (extra in event.extras) { + param( + key = extra.key.take(MAX_KEY_TAKE_COUNT), + value = extra.value.take(MAX_VALUE_TAKE_COUNT), + ) + } + } + } + + companion object { + private const val MAX_KEY_TAKE_COUNT = 40 + private const val MAX_VALUE_TAKE_COUNT = 100 + } +} \ No newline at end of file diff --git a/core/analytics/src/main/java/com/moneymong/moneymong/analytics/NoOpAnalyticsTracker.kt b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/NoOpAnalyticsTracker.kt new file mode 100644 index 00000000..1e0f9c15 --- /dev/null +++ b/core/analytics/src/main/java/com/moneymong/moneymong/analytics/NoOpAnalyticsTracker.kt @@ -0,0 +1,5 @@ +package com.moneymong.moneymong.analytics + +class NoOpAnalyticsTracker : AnalyticsTracker { + override fun logEvent(event: AnalyticsEvent) = Unit +} \ No newline at end of file diff --git a/core/analytics/src/test/java/com/moneymong/moneymong/analytics/ExampleUnitTest.kt b/core/analytics/src/test/java/com/moneymong/moneymong/analytics/ExampleUnitTest.kt new file mode 100644 index 00000000..c4c0510d --- /dev/null +++ b/core/analytics/src/test/java/com/moneymong/moneymong/analytics/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.moneymong.moneymong.analytics + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/core/android/.gitignore b/core/android/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/core/android/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/android/build.gradle.kts b/core/android/build.gradle.kts new file mode 100644 index 00000000..8dbede6d --- /dev/null +++ b/core/android/build.gradle.kts @@ -0,0 +1,23 @@ +@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.android" +} + +dependencies { + implementation(libs.orbit.core) + implementation(libs.orbit.compose) + implementation(libs.orbit.viewModel) + implementation(libs.okhttp) + + implementation(libs.androidx.core.ktx) + implementation(libs.appcompat) + implementation(libs.material) + testImplementation(libs.junit4) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.test.espresso.core) +} \ No newline at end of file diff --git a/core/android/consumer-rules.pro b/core/android/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/core/android/proguard-rules.pro b/core/android/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/core/android/proguard-rules.pro @@ -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 \ No newline at end of file diff --git a/core/android/src/androidTest/java/com/moneymong/moneymong/android/ExampleInstrumentedTest.kt b/core/android/src/androidTest/java/com/moneymong/moneymong/android/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..3570676d --- /dev/null +++ b/core/android/src/androidTest/java/com/moneymong/moneymong/android/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.moneymong.moneymong.android + +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.android.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/core/android/src/main/AndroidManifest.xml b/core/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..a5918e68 --- /dev/null +++ b/core/android/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/base/BaseViewModel.kt b/core/android/src/main/java/com/moneymong/moneymong/android/BaseViewModel.kt similarity index 91% rename from core/common/src/main/java/com/moneymong/moneymong/common/base/BaseViewModel.kt rename to core/android/src/main/java/com/moneymong/moneymong/android/BaseViewModel.kt index 2869efc3..0c862903 100644 --- a/core/common/src/main/java/com/moneymong/moneymong/common/base/BaseViewModel.kt +++ b/core/android/src/main/java/com/moneymong/moneymong/android/BaseViewModel.kt @@ -1,4 +1,4 @@ -package com.moneymong.moneymong.common.base +package com.moneymong.moneymong.android import androidx.lifecycle.ViewModel import org.orbitmvi.orbit.ContainerHost diff --git a/core/android/src/main/java/com/moneymong/moneymong/android/SideEffect.kt b/core/android/src/main/java/com/moneymong/moneymong/android/SideEffect.kt new file mode 100644 index 00000000..df0c7d81 --- /dev/null +++ b/core/android/src/main/java/com/moneymong/moneymong/android/SideEffect.kt @@ -0,0 +1,4 @@ +package com.moneymong.moneymong.android + +interface SideEffect { +} \ No newline at end of file diff --git a/core/android/src/main/java/com/moneymong/moneymong/android/State.kt b/core/android/src/main/java/com/moneymong/moneymong/android/State.kt new file mode 100644 index 00000000..02781e13 --- /dev/null +++ b/core/android/src/main/java/com/moneymong/moneymong/android/State.kt @@ -0,0 +1,4 @@ +package com.moneymong.moneymong.android + +interface State { +} \ No newline at end of file diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/ext/ApplicationExt.kt b/core/android/src/main/java/com/moneymong/moneymong/android/util/ApplicationExt.kt similarity index 97% rename from core/common/src/main/java/com/moneymong/moneymong/common/ext/ApplicationExt.kt rename to core/android/src/main/java/com/moneymong/moneymong/android/util/ApplicationExt.kt index b41e04ef..426877fe 100644 --- a/core/common/src/main/java/com/moneymong/moneymong/common/ext/ApplicationExt.kt +++ b/core/android/src/main/java/com/moneymong/moneymong/android/util/ApplicationExt.kt @@ -1,4 +1,4 @@ -package com.moneymong.moneymong.common.ext +package com.moneymong.moneymong.android.util import android.content.Context import android.content.pm.PackageManager @@ -10,7 +10,6 @@ import android.net.Uri import android.os.Build import android.util.Base64 import androidx.core.content.ContextCompat -import androidx.core.content.FileProvider import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody diff --git a/core/android/src/test/java/com/moneymong/moneymong/android/ExampleUnitTest.kt b/core/android/src/test/java/com/moneymong/moneymong/android/ExampleUnitTest.kt new file mode 100644 index 00000000..858690a7 --- /dev/null +++ b/core/android/src/test/java/com/moneymong/moneymong/android/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.moneymong.moneymong.android + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index fba5fbee..010aecd3 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -1,31 +1,3 @@ -@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed plugins { - alias(libs.plugins.moneymong.android.library) - alias(libs.plugins.moneymong.android.library.compose) - alias(libs.plugins.moneymong.android.hilt) + alias(libs.plugins.kotlin.jvm) } - -android { - namespace = "com.moneymong.moneymong.common" -} - -dependencies { - - implementation(projects.domain) - implementation(libs.androidx.core.ktx) - implementation(libs.appcompat) - implementation(libs.material) - - implementation(libs.orbit.core) - implementation(libs.orbit.compose) - implementation(libs.orbit.viewModel) - implementation(libs.okhttp) - - implementation(platform(libs.firebase.bom)) - implementation(libs.firebase.analytics) - implementation(libs.firebase.crashlytics) - - testImplementation(libs.junit4) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.test.espresso.core) -} \ No newline at end of file diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/base/SideEffect.kt b/core/common/src/main/java/com/moneymong/moneymong/common/base/SideEffect.kt deleted file mode 100644 index 41a5de72..00000000 --- a/core/common/src/main/java/com/moneymong/moneymong/common/base/SideEffect.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.moneymong.moneymong.common.base - -interface SideEffect { -} \ No newline at end of file diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/base/State.kt b/core/common/src/main/java/com/moneymong/moneymong/common/base/State.kt deleted file mode 100644 index 6aecace4..00000000 --- a/core/common/src/main/java/com/moneymong/moneymong/common/base/State.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.moneymong.moneymong.common.base - -interface State { -} \ No newline at end of file diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/di/EventModule.kt b/core/common/src/main/java/com/moneymong/moneymong/common/di/EventModule.kt deleted file mode 100644 index d058d534..00000000 --- a/core/common/src/main/java/com/moneymong/moneymong/common/di/EventModule.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.moneymong.moneymong.common.di - -import com.moneymong.moneymong.common.event.EventTracker -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -object EventModule { - - @Provides - @Singleton - fun provideEventTracker(): EventTracker = - EventTracker() -} \ No newline at end of file diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/event/Event.kt b/core/common/src/main/java/com/moneymong/moneymong/common/event/Event.kt deleted file mode 100644 index 6d0fe619..00000000 --- a/core/common/src/main/java/com/moneymong/moneymong/common/event/Event.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.moneymong.moneymong.common.event - -enum class Event(val eventName: String, val desc: String) { - OPERATION_COST_CLICK( - eventName = "operation_cost_click", - desc = "운영비 등록하기 버튼 클릭" - ), - LEDGER_CLICK( - eventName = "ledger_click", - desc = "소속 장부 확인 버튼 클릭" - ), - OCR_REGISTER_CLICK( - eventName = "ocr_register_click", - desc = "등록하기 버튼 클릭" - ), - OCR_MODIFY_CLICK( - eventName = "ocr_modify_click", - desc = "수정하기 버튼 클릭" - ), - OCR_MODIFY_TO_REGISTER_CLICK( - eventName = "ocr_modify_to_register_click", - desc = "등록하기 버튼 클릭" - ), - PLUS_CLICK( - eventName = "plus_click", - desc = "+ 플로팅 버튼 클릭" - ), - HAND_CLICK( - eventName = "hand_click", - desc = "수동 등록 플로팅 버튼 클릭" - ), - OCR_CLICK( - eventName = "ocr_click", - desc = "OCR 등록 플로팅 버튼 클릭" - ) - ; - -} \ No newline at end of file diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/event/EventTracker.kt b/core/common/src/main/java/com/moneymong/moneymong/common/event/EventTracker.kt deleted file mode 100644 index c6288943..00000000 --- a/core/common/src/main/java/com/moneymong/moneymong/common/event/EventTracker.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.moneymong.moneymong.common.event - -import android.os.Bundle -import com.google.firebase.Firebase -import com.google.firebase.analytics.FirebaseAnalytics -import com.google.firebase.analytics.analytics -import javax.inject.Inject - -class EventTracker @Inject constructor() { - - private lateinit var firebaseAnalytics: FirebaseAnalytics - private var initialized: Boolean = false - - fun initialize() { - firebaseAnalytics = Firebase.analytics - initialized = true - } - - fun logEvent(event: Event, param: Bundle? = null) { - check(initialized) { "logEvent를 호출하기 전 초기화가 필요합니다." } - - firebaseAnalytics.logEvent(event.eventName, param) - } -} \ No newline at end of file diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/ext/DateExt.kt b/core/common/src/main/java/com/moneymong/moneymong/common/util/DateExt.kt similarity index 95% rename from core/common/src/main/java/com/moneymong/moneymong/common/ext/DateExt.kt rename to core/common/src/main/java/com/moneymong/moneymong/common/util/DateExt.kt index 062d7449..1fcfabe7 100644 --- a/core/common/src/main/java/com/moneymong/moneymong/common/ext/DateExt.kt +++ b/core/common/src/main/java/com/moneymong/moneymong/common/util/DateExt.kt @@ -1,4 +1,4 @@ -package com.moneymong.moneymong.common.ext +package com.moneymong.moneymong.common.util import java.time.Instant import java.time.LocalDateTime diff --git a/core/design-system/src/main/java/com/moneymong/moneymong/design_system/component/navigation/NavigationBar.kt b/core/design-system/src/main/java/com/moneymong/moneymong/design_system/component/navigation/NavigationBar.kt index 89bb0ec1..1e7ec9da 100644 --- a/core/design-system/src/main/java/com/moneymong/moneymong/design_system/component/navigation/NavigationBar.kt +++ b/core/design-system/src/main/java/com/moneymong/moneymong/design_system/component/navigation/NavigationBar.kt @@ -2,7 +2,6 @@ package com.moneymong.moneymong.design_system.component.navigation import androidx.annotation.DrawableRes import androidx.compose.foundation.background -import androidx.compose.foundation.border import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -14,16 +13,17 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.selection.selectableGroup -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon 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.draw.drawBehind +import androidx.compose.ui.geometry.CornerRadius import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -36,7 +36,6 @@ import com.moneymong.moneymong.design_system.theme.Blue04 import com.moneymong.moneymong.design_system.theme.Body2 import com.moneymong.moneymong.design_system.theme.Gray02 import com.moneymong.moneymong.design_system.theme.Gray04 -import com.moneymong.moneymong.design_system.theme.Gray09 import com.moneymong.moneymong.design_system.theme.White @Composable @@ -49,19 +48,19 @@ fun MDSNavigationBar( .fillMaxWidth() .navigationBarsPadding() .background(color = White) - .clip(shape = RoundedCornerShape(topStart = 20.dp, topEnd = 20.dp)) - .border( - width = 1.dp, - color = Gray02, - shape = RoundedCornerShape(topStart = 20.dp, topEnd = 20.dp) - ) .drawBehind { val strokeWidth = 1.dp.toPx() - drawLine( + drawRoundRect( color = Gray02, - strokeWidth = strokeWidth, - start = Offset(x = 0f, y = 0f + strokeWidth / 2), - end = Offset(x = size.width, y = 0f + strokeWidth / 2) + topLeft = Offset(x = strokeWidth / 2, y = strokeWidth / 2), + size = Size(size.width - strokeWidth, size.height - strokeWidth), + style = Stroke(width = strokeWidth), + cornerRadius = CornerRadius(20.dp.toPx(), 20.dp.toPx()) + ) + drawRect( + color = White, + topLeft = Offset(0f, size.height / 2), + size = Size(size.width, size.height/2) ) } .selectableGroup() diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index 037f5fcc..dea205aa 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -1,5 +1,3 @@ -import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties - @Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed plugins { alias(libs.plugins.moneymong.android.library) @@ -8,18 +6,9 @@ plugins { } -fun getApiKey(propertyKey : String): String { - return gradleLocalProperties(rootDir).getProperty(propertyKey) -} - android { namespace = "com.moneymong.moneymong.network" - defaultConfig { - buildConfigField("String", "CLOVA_OCR_DOCUMENT_SECRET", fetchClovaProperties("CLOVA_OCR_DOCUMENT_SECRET")) - buildConfigField("String", "CLOVA_OCR_DOCUMENT_BASEURL", fetchClovaProperties("CLOVA_OCR_DOCUMENT_BASEURL")) - } - buildTypes { debug { buildConfigField("String", "MONEYMONG_BASE_URL", "\"https://dev.moneymong.site/\"") @@ -51,7 +40,4 @@ dependencies { testImplementation(libs.junit4) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.test.espresso.core) -} - -fun fetchClovaProperties(propertyKey: String) = - gradleLocalProperties(rootDir).getProperty(propertyKey) \ No newline at end of file +} \ No newline at end of file diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index 22e5d63d..f3d28ae5 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -9,7 +9,7 @@ android { } dependencies { - + implementation(projects.core.analytics) implementation(libs.androidx.core.ktx) implementation(libs.appcompat) implementation(libs.material) diff --git a/core/ui/src/main/java/com/moneymong/moneymong/ui/AnalyticsExt.kt b/core/ui/src/main/java/com/moneymong/moneymong/ui/AnalyticsExt.kt new file mode 100644 index 00000000..eca5b953 --- /dev/null +++ b/core/ui/src/main/java/com/moneymong/moneymong/ui/AnalyticsExt.kt @@ -0,0 +1,13 @@ +package com.moneymong.moneymong.ui + +import com.moneymong.moneymong.analytics.AnalyticsEvent +import com.moneymong.moneymong.analytics.AnalyticsTracker + +fun AnalyticsTracker.logClicked(eventName: String) { + logEvent( + event = AnalyticsEvent( + type = eventName, + extras = emptyList(), + ) + ) +} \ No newline at end of file diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/ui/ModifierExt.kt b/core/ui/src/main/java/com/moneymong/moneymong/ui/ModifierExt.kt similarity index 97% rename from core/common/src/main/java/com/moneymong/moneymong/common/ui/ModifierExt.kt rename to core/ui/src/main/java/com/moneymong/moneymong/ui/ModifierExt.kt index 051f6a7e..c41ed444 100644 --- a/core/common/src/main/java/com/moneymong/moneymong/common/ui/ModifierExt.kt +++ b/core/ui/src/main/java/com/moneymong/moneymong/ui/ModifierExt.kt @@ -1,4 +1,4 @@ -package com.moneymong.moneymong.common.ui +package com.moneymong.moneymong.ui import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/ui/Padding.kt b/core/ui/src/main/java/com/moneymong/moneymong/ui/Padding.kt similarity index 94% rename from core/common/src/main/java/com/moneymong/moneymong/common/ui/Padding.kt rename to core/ui/src/main/java/com/moneymong/moneymong/ui/Padding.kt index 57396281..cdaf00f5 100644 --- a/core/common/src/main/java/com/moneymong/moneymong/common/ui/Padding.kt +++ b/core/ui/src/main/java/com/moneymong/moneymong/ui/Padding.kt @@ -1,4 +1,4 @@ -package com.moneymong.moneymong.common.ui +package com.moneymong.moneymong.ui import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.calculateEndPadding diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/ui/PrimitiveExt.kt b/core/ui/src/main/java/com/moneymong/moneymong/ui/PrimitiveExt.kt similarity index 97% rename from core/common/src/main/java/com/moneymong/moneymong/common/ui/PrimitiveExt.kt rename to core/ui/src/main/java/com/moneymong/moneymong/ui/PrimitiveExt.kt index 80a77736..56202803 100644 --- a/core/common/src/main/java/com/moneymong/moneymong/common/ui/PrimitiveExt.kt +++ b/core/ui/src/main/java/com/moneymong/moneymong/ui/PrimitiveExt.kt @@ -1,4 +1,4 @@ -package com.moneymong.moneymong.common.ui +package com.moneymong.moneymong.ui import androidx.core.text.isDigitsOnly import java.text.DecimalFormat diff --git a/core/ui/src/main/java/com/moneymong/moneymong/ui/SystemBarColorController.kt b/core/ui/src/main/java/com/moneymong/moneymong/ui/SystemBarColorController.kt new file mode 100644 index 00000000..78b59441 --- /dev/null +++ b/core/ui/src/main/java/com/moneymong/moneymong/ui/SystemBarColorController.kt @@ -0,0 +1,43 @@ +package com.moneymong.moneymong.common.ui + +import androidx.compose.ui.graphics.Color +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +data class SystemBarColors( + val statusBarColor: Color?, + val navigationBarColor: Color? +) { + companion object { + val INITIAL = SystemBarColors( + statusBarColor = null, + navigationBarColor = null + ) + } +} + +object SystemBarColorController { + + private val _systemBarColors = MutableStateFlow(SystemBarColors.INITIAL) + val systemBarColors: StateFlow = _systemBarColors.asStateFlow() + + fun setSystemBarColors(color: Color) { + _systemBarColors.value = SystemBarColors( + statusBarColor = color, + navigationBarColor = color + ) + } + + fun initialSystemBarColors() { + _systemBarColors.value = SystemBarColors.INITIAL + } + + fun setStatusBarColor(color: Color?) { + _systemBarColors.value = _systemBarColors.value.copy(statusBarColor = color) + } + + fun setNavigationBarColor(color: Color?) { + _systemBarColors.value = _systemBarColors.value.copy(navigationBarColor = color) + } +} \ No newline at end of file diff --git a/core/common/src/main/java/com/moneymong/moneymong/common/util/LifeCycleUtil.kt b/core/ui/src/main/java/com/moneymong/moneymong/ui/util/LifeCycleUtil.kt similarity index 97% rename from core/common/src/main/java/com/moneymong/moneymong/common/util/LifeCycleUtil.kt rename to core/ui/src/main/java/com/moneymong/moneymong/ui/util/LifeCycleUtil.kt index 9dbedcd7..6663ab96 100644 --- a/core/common/src/main/java/com/moneymong/moneymong/common/util/LifeCycleUtil.kt +++ b/core/ui/src/main/java/com/moneymong/moneymong/ui/util/LifeCycleUtil.kt @@ -1,4 +1,4 @@ -package com.moneymong.moneymong.common.util +package com.moneymong.moneymong.ui.util import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect diff --git a/feature/agency/build.gradle.kts b/feature/agency/build.gradle.kts index d87843e8..9924b181 100644 --- a/feature/agency/build.gradle.kts +++ b/feature/agency/build.gradle.kts @@ -10,6 +10,8 @@ android { } dependencies { + implementation(projects.core.analytics) + implementation(projects.core.android) implementation(projects.core.common) implementation(projects.core.model) implementation(projects.domain) diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteScreen.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteScreen.kt index 002f7118..e7d40a93 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteScreen.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteScreen.kt @@ -18,7 +18,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.theme.Black import com.moneymong.moneymong.design_system.theme.Heading1 diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteSideEffect.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteSideEffect.kt index 47e7929a..4f24f5da 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteSideEffect.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.agency.join -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed class AgencyCompleteSideEffect : SideEffect { diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteState.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteState.kt index f3b3e4cd..d33e4ce1 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteState.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteState.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.agency.join -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State data class AgencyCompleteState( val isBtnClicked: Boolean = false diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteViewModel.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteViewModel.kt index f309cc50..c048070f 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteViewModel.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyCompleteViewModel.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.agency.join -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import org.orbitmvi.orbit.syntax.simple.intent import org.orbitmvi.orbit.syntax.simple.reduce diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinScreen.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinScreen.kt index ccdab9fd..7f33fea4 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinScreen.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinScreen.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.component.snackbar.MDSSnackbarHost import com.moneymong.moneymong.design_system.error.ErrorDialog @@ -61,15 +61,18 @@ fun AgencyJoinScreen( .background(White) .height(44.dp), verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.End + horizontalArrangement = if (state.isBackButton) Arrangement.Start else Arrangement.End ) { + val navigateUpIconId = + if (state.isBackButton) R.drawable.ic_chevron_left else R.drawable.ic_close_default + Icon( modifier = Modifier .size(24.dp) .noRippleClickable { navigateUp() }, - painter = painterResource(id = R.drawable.ic_close_default), + painter = painterResource(id = navigateUpIconId), contentDescription = null, tint = Black ) diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinSideEffect.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinSideEffect.kt index 928e38df..e57ee4f5 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinSideEffect.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.agency.join -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed class AgencyJoinSideEffect : SideEffect { } \ No newline at end of file diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinState.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinState.kt index 4a1486cf..466fed1e 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinState.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinState.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.agency.join -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State data class AgencyJoinState( val isError: Boolean = false, @@ -8,5 +8,6 @@ data class AgencyJoinState( val inputCode: String = "", val codeAccess: Boolean = false, val visiblePopUpError: Boolean = false, - val errorPopUpMessage: String = "" + val errorPopUpMessage: String = "", + val isBackButton: Boolean = false, ) : State \ No newline at end of file diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinViewModel.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinViewModel.kt index cf406852..2b13da50 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinViewModel.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/AgencyJoinViewModel.kt @@ -1,11 +1,13 @@ package com.moneymong.moneymong.feature.agency.join import androidx.core.text.isDigitsOnly +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.domain.usecase.agency.AgencyJoinUseCase import com.moneymong.moneymong.domain.usecase.agency.SaveAgencyIdUseCase import com.moneymong.moneymong.feature.agency.join.component.CODE_MAX_SIZE +import com.moneymong.moneymong.feature.agency.join.navigation.AgencyJoinArgs import com.moneymong.moneymong.model.agency.AgencyJoinRequest import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch @@ -15,9 +17,11 @@ import javax.inject.Inject @HiltViewModel class AgencyJoinViewModel @Inject constructor( + savedStateHandle: SavedStateHandle, private val agencyJoinUseCase: AgencyJoinUseCase, private val saveAgencyIdUseCase: SaveAgencyIdUseCase -) : BaseViewModel(AgencyJoinState()) { +) : BaseViewModel( + state = AgencyJoinState(isBackButton = AgencyJoinArgs(savedStateHandle).isBackButton)) { fun findLedgerByInviteCode() = intent { viewModelScope.launch { diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/navigation/AgencyJoinNavigation.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/navigation/AgencyJoinNavigation.kt index 8cd81de5..95e92f28 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/navigation/AgencyJoinNavigation.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/join/navigation/AgencyJoinNavigation.kt @@ -1,25 +1,45 @@ package com.moneymong.moneymong.feature.agency.join.navigation +import androidx.lifecycle.SavedStateHandle import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions +import androidx.navigation.NavType import androidx.navigation.compose.composable +import androidx.navigation.navArgument import com.moneymong.moneymong.feature.agency.join.AgencyJoinScreen const val agencyJoinRoute = "agencyJoin_route" +const val IS_BACK_BUTTON = "IsBackButton" +const val agencyJoinRouteWithArgs = "$agencyJoinRoute/{${IS_BACK_BUTTON}}" -fun NavController.navigateAgencyJoin(navOptions: NavOptions? = null) { - navigate(agencyJoinRoute, navOptions) +fun NavController.navigateAgencyJoin( + navOptions: NavOptions? = null, + isBackButton: Boolean = false +) { + navigate("${agencyJoinRoute}/${isBackButton}", navOptions) } fun NavGraphBuilder.agencyJoinScreen( navigateToComplete: () -> Unit, navigateUp: () -> Unit, ) { - composable(route = agencyJoinRoute) { + composable( + route = agencyJoinRouteWithArgs, + arguments = listOf(navArgument(IS_BACK_BUTTON) { + type = NavType.BoolType + defaultValue = false + }) + ) { AgencyJoinScreen( navigateToComplete = navigateToComplete, navigateUp = navigateUp, ) } +} + +internal class AgencyJoinArgs(val isBackButton: Boolean) { + constructor(savedStateHandle: SavedStateHandle) : this( + isBackButton = checkNotNull(savedStateHandle[IS_BACK_BUTTON]) + ) } \ No newline at end of file diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/navigation/AgencyRegisterNavigation.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/navigation/AgencyRegisterNavigation.kt index 535a7feb..f3e5c231 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/navigation/AgencyRegisterNavigation.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/navigation/AgencyRegisterNavigation.kt @@ -1,25 +1,46 @@ package com.moneymong.moneymong.feature.agency.navigation +import androidx.lifecycle.SavedStateHandle import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions +import androidx.navigation.NavType import androidx.navigation.compose.composable +import androidx.navigation.navArgument import com.moneymong.moneymong.feature.agency.register.AgencyRegisterScreen const val agencyRegisterRoute = "agencyRegister_route" +const val VISIBLE_INVITE_CODE = "VisibleInviteCode" +const val agencyRegisterRouteWithArgs = "${agencyRegisterRoute}/{${VISIBLE_INVITE_CODE}}" fun NavController.navigateAgencyRegister( - navOptions: NavOptions? = null + navOptions: NavOptions? = null, + visibleInviteCode: Boolean = false, ) { - navigate(agencyRegisterRoute, navOptions) + navigate("${agencyRegisterRoute}/${visibleInviteCode}", navOptions) } fun NavGraphBuilder.agencyRegisterScreen( - navigateToLedger: () -> Unit + navigateToLedger: () -> Unit, + navigateToAgencyJoin: () -> Unit, ) { composable( - route = agencyRegisterRoute, + route = agencyRegisterRouteWithArgs, + arguments = listOf(navArgument(VISIBLE_INVITE_CODE) { + type = NavType.BoolType + defaultValue = false + }) ) { - AgencyRegisterScreen(navigateToLedger = navigateToLedger,) + AgencyRegisterScreen( + navigateToLedger = navigateToLedger, + navigateToAgencyJoin = navigateToAgencyJoin + ) } +} + + +internal class AgencyRegisterArgs(val visibleInviteCode: Boolean) { + constructor(savedStateHandle: SavedStateHandle) : this( + visibleInviteCode = checkNotNull(savedStateHandle[VISIBLE_INVITE_CODE]) + ) } \ No newline at end of file diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterScreen.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterScreen.kt index c575a041..869efa61 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterScreen.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterScreen.kt @@ -1,5 +1,6 @@ package com.moneymong.moneymong.feature.agency.register +import androidx.activity.compose.BackHandler import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Column @@ -25,7 +26,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.component.button.MDSButton import com.moneymong.moneymong.design_system.component.modal.MDSModal @@ -42,6 +43,7 @@ fun AgencyRegisterScreen( modifier: Modifier = Modifier, viewModel: AgencyRegisterViewModel = hiltViewModel(), navigateToLedger: () -> Unit, + navigateToAgencyJoin: () -> Unit ) { val state by viewModel.collectAsState() val focusManager = LocalFocusManager.current @@ -53,9 +55,15 @@ fun AgencyRegisterScreen( focusManager.clearFocus() navigateToLedger() } + + is AgencyRegisterSideEffect.NavigateToAgencyJoin -> { + navigateToAgencyJoin() + } } } + BackHandler(onBack = viewModel::navigateToLedger) + if (state.visibleOutDialog) { MDSModal( icon = R.drawable.ic_warning_filled, @@ -116,6 +124,8 @@ fun AgencyRegisterScreen( agencyName = state.agencyName, onAgencyNameChange = viewModel::changeAgencyName, changeNameTextFieldIsError = viewModel::changeNameTextFieldIsError, + visibleInviteCode = state.visibleInviteCode, + onClickInviteCode = viewModel::navigateToAgencyJoin ) } val canRegister = state.agencyName.text.isNotEmpty() && state.nameTextFieldIsError.not() @@ -135,5 +145,6 @@ fun AgencyRegisterScreen( fun AgencyRegisterScreenPreview() { AgencyRegisterScreen( navigateToLedger = {}, + navigateToAgencyJoin = {} ) } \ No newline at end of file diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterSideEffect.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterSideEffect.kt index 99b1b3b1..9101d02d 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterSideEffect.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterSideEffect.kt @@ -1,7 +1,9 @@ package com.moneymong.moneymong.feature.agency.register -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed interface AgencyRegisterSideEffect : SideEffect { data object NavigateToLedger : AgencyRegisterSideEffect + + data object NavigateToAgencyJoin : AgencyRegisterSideEffect } \ No newline at end of file diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterState.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterState.kt index 334203e5..9e94f939 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterState.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterState.kt @@ -1,7 +1,7 @@ package com.moneymong.moneymong.feature.agency.register import androidx.compose.ui.text.input.TextFieldValue -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State import com.moneymong.moneymong.feature.agency.search.AgencyType data class AgencyRegisterState( @@ -11,4 +11,5 @@ data class AgencyRegisterState( val nameTextFieldIsError: Boolean = false, val visibleOutDialog: Boolean = false, val visibleErrorDialog: Boolean = false, + val visibleInviteCode: Boolean = false ) : State \ No newline at end of file diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterViewModel.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterViewModel.kt index fcc3b09c..84266458 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterViewModel.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterViewModel.kt @@ -1,10 +1,12 @@ package com.moneymong.moneymong.feature.agency.register import androidx.compose.ui.text.input.TextFieldValue -import com.moneymong.moneymong.common.base.BaseViewModel +import androidx.lifecycle.SavedStateHandle +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.common.error.MoneyMongError import com.moneymong.moneymong.domain.usecase.agency.RegisterAgencyUseCase import com.moneymong.moneymong.domain.usecase.agency.SaveAgencyIdUseCase +import com.moneymong.moneymong.feature.agency.navigation.AgencyRegisterArgs import com.moneymong.moneymong.model.agency.AgencyRegisterRequest import dagger.hilt.android.lifecycle.HiltViewModel import org.orbitmvi.orbit.annotation.OrbitExperimental @@ -16,11 +18,18 @@ import javax.inject.Inject @HiltViewModel class AgencyRegisterViewModel @Inject constructor( + savedStateHandle: SavedStateHandle, private val registerAgencyUseCase: RegisterAgencyUseCase, private val saveAgencyIdUseCase: SaveAgencyIdUseCase -) : BaseViewModel(AgencyRegisterState()) { +) : BaseViewModel( + state = AgencyRegisterState(visibleInviteCode = AgencyRegisterArgs(savedStateHandle).visibleInviteCode) +) { - fun navigateToLedger() = eventEmit(sideEffect = AgencyRegisterSideEffect.NavigateToLedger) + fun navigateToLedger() = + eventEmit(sideEffect = AgencyRegisterSideEffect.NavigateToLedger) + + fun navigateToAgencyJoin() = + eventEmit(sideEffect = AgencyRegisterSideEffect.NavigateToAgencyJoin) fun registerAgency() = intent { registerAgencyUseCase( diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteSideEffect.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteSideEffect.kt index 51575359..827ae5aa 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteSideEffect.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.agency.register.complete -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed interface AgencyRegisterCompleteSideEffect : SideEffect { data object NavigateToAgencySearch : AgencyRegisterCompleteSideEffect diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteState.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteState.kt index 7ef7384a..14d97918 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteState.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteState.kt @@ -1,5 +1,5 @@ package com.moneymong.moneymong.feature.agency.register.complete -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State data object AgencyRegisterCompleteState : State \ No newline at end of file diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteViewModel.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteViewModel.kt index 4efbe5f1..1add2c81 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteViewModel.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteViewModel.kt @@ -1,21 +1,16 @@ package com.moneymong.moneymong.feature.agency.register.complete -import com.moneymong.moneymong.common.base.BaseViewModel -import com.moneymong.moneymong.common.event.Event -import com.moneymong.moneymong.common.event.EventTracker +import com.moneymong.moneymong.android.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel -class AgencyRegisterCompleteViewModel @Inject constructor( - private val eventTracker: EventTracker -) : +class AgencyRegisterCompleteViewModel @Inject constructor() : BaseViewModel( AgencyRegisterCompleteState ) { fun navigateToLedger() { - eventTracker.logEvent(Event.LEDGER_CLICK) eventEmit(sideEffect = AgencyRegisterCompleteSideEffect.NavigateToLedger) } @@ -23,7 +18,6 @@ class AgencyRegisterCompleteViewModel @Inject constructor( eventEmit(sideEffect = AgencyRegisterCompleteSideEffect.NavigateToAgencySearch) fun navigateToLedgerManual() { - eventTracker.logEvent(Event.OPERATION_COST_CLICK) eventEmit(sideEffect = AgencyRegisterCompleteSideEffect.NavigateToLedgerManual) } } \ No newline at end of file diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/view/AgencyRegisterContentView.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/view/AgencyRegisterContentView.kt index dd770151..dec52d8a 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/view/AgencyRegisterContentView.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/view/AgencyRegisterContentView.kt @@ -1,9 +1,11 @@ package com.moneymong.moneymong.feature.agency.register.view +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -14,15 +16,18 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.moneymong.moneymong.design_system.component.textfield.MDSTextField import com.moneymong.moneymong.design_system.component.textfield.util.MDSTextFieldIcons import com.moneymong.moneymong.design_system.component.textfield.util.withRequiredMark +import com.moneymong.moneymong.design_system.theme.Body1 import com.moneymong.moneymong.design_system.theme.Body3 import com.moneymong.moneymong.design_system.theme.Gray05 import com.moneymong.moneymong.design_system.theme.Gray10 @@ -34,6 +39,8 @@ internal fun AgencyResisterContentView( agencyName: TextFieldValue, onAgencyNameChange: (TextFieldValue) -> Unit, changeNameTextFieldIsError: (Boolean) -> Unit, + visibleInviteCode: Boolean, + onClickInviteCode: () -> Unit ) { Column(modifier = modifier) { TitleView() @@ -43,6 +50,20 @@ internal fun AgencyResisterContentView( onAgencyNameChange = onAgencyNameChange, changeIsError = changeNameTextFieldIsError ) + Spacer(modifier = Modifier.height(7.dp)) + + if (visibleInviteCode) { + Text( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .clickable(onClick = onClickInviteCode) + .padding(8.dp), + text = "초대코드를 받았어요 >", + style = Body1, + color = Gray05, + textDecoration = TextDecoration.Underline + ) + } } } @@ -119,5 +140,7 @@ private fun AgencyResisterContentViewPreview() { agencyName = TextFieldValue("동아리"), onAgencyNameChange = {}, changeNameTextFieldIsError = {}, + visibleInviteCode = true, + onClickInviteCode = {} ) } \ No newline at end of file diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchSideEffect.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchSideEffect.kt index 84fd3c20..0bad57d9 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchSideEffect.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.agency.search -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed interface AgencySearchSideEffect : SideEffect { data class NavigateToRegister(val isUniversityStudent: Boolean) : AgencySearchSideEffect diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchState.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchState.kt index ecb9cdf7..b8e8494b 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchState.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchState.kt @@ -1,7 +1,7 @@ package com.moneymong.moneymong.feature.agency.search import androidx.compose.foundation.text.input.TextFieldState -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State data class AgencySearchState( val joinedAgencies: List = emptyList(), diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchViewModel.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchViewModel.kt index 7682e377..69ed0ad8 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchViewModel.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchViewModel.kt @@ -4,7 +4,7 @@ import androidx.compose.foundation.text.input.clearText import androidx.lifecycle.viewModelScope import androidx.paging.cachedIn import androidx.paging.map -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.common.error.MoneyMongError import com.moneymong.moneymong.domain.usecase.agency.FetchAgenciesUseCase import com.moneymong.moneymong.domain.usecase.agency.FetchAgencyByNameUseCase diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/AgencySearchTopBar.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/AgencySearchTopBar.kt index 7ef1ac89..4cbc5ddb 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/AgencySearchTopBar.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/AgencySearchTopBar.kt @@ -18,7 +18,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.theme.Gray10 import com.moneymong.moneymong.design_system.theme.Heading1 import com.moneymong.moneymong.design_system.R as MDSR diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/searchbar/AgencySearchBar.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/searchbar/AgencySearchBar.kt index 9fbb230d..ad44faed 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/searchbar/AgencySearchBar.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/searchbar/AgencySearchBar.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.theme.Body2 import com.moneymong.moneymong.design_system.theme.Gray08 import com.moneymong.moneymong.design_system.theme.MMTheme diff --git a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/searchbar/AgencySearchTextField.kt b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/searchbar/AgencySearchTextField.kt index d35e352b..172d6b6c 100644 --- a/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/searchbar/AgencySearchTextField.kt +++ b/feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/component/searchbar/AgencySearchTextField.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.theme.Blue04 import com.moneymong.moneymong.design_system.theme.Body2 import com.moneymong.moneymong.design_system.theme.Gray04 diff --git a/feature/home/build.gradle.kts b/feature/home/build.gradle.kts index f9ace3df..0345cb4d 100644 --- a/feature/home/build.gradle.kts +++ b/feature/home/build.gradle.kts @@ -10,7 +10,7 @@ android { } dependencies { - + implementation(projects.core.android) implementation(projects.core.designSystem) implementation(projects.feature.sign) implementation(projects.feature.agency) diff --git a/feature/home/src/main/java/com/moneymong/moneymong/home/HomeBottomTabs.kt b/feature/home/src/main/java/com/moneymong/moneymong/home/HomeBottomTabs.kt index 6a703b26..ce330dc4 100644 --- a/feature/home/src/main/java/com/moneymong/moneymong/home/HomeBottomTabs.kt +++ b/feature/home/src/main/java/com/moneymong/moneymong/home/HomeBottomTabs.kt @@ -2,7 +2,6 @@ package com.moneymong.moneymong.home import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import com.moneymong.moneymong.feature.agency.navigation.agencyRoute import com.moneymong.moneymong.feature.mymong.navigation.mymongRoute import com.moneymong.moneymong.ledger.navigation.ledgerRouteWithArgs diff --git a/feature/home/src/main/java/com/moneymong/moneymong/home/HomeScreen.kt b/feature/home/src/main/java/com/moneymong/moneymong/home/HomeScreen.kt index ab9df73e..f871a995 100644 --- a/feature/home/src/main/java/com/moneymong/moneymong/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/moneymong/moneymong/home/HomeScreen.kt @@ -1,14 +1,31 @@ package com.moneymong.moneymong.home +import android.app.Activity import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsBottomHeight +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.layout.windowInsetsTopHeight import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.unit.dp +import androidx.core.view.WindowInsetsControllerCompat import androidx.navigation.compose.NavHost import androidx.navigation.navOptions -import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.moneymong.moneymong.design_system.error.ErrorDialog import com.moneymong.moneymong.feature.agency.join.navigation.agencyCompleteScreen import com.moneymong.moneymong.feature.agency.join.navigation.agencyJoinScreen @@ -45,6 +62,7 @@ import com.moneymong.moneymong.ocr_detail.navigation.navigateOCRDetail import com.moneymong.moneymong.ocr_detail.navigation.ocrDetailScreen import com.moneymong.moneymong.ocr_result.navigation.navigateOCRResult import com.moneymong.moneymong.ocr_result.navigation.ocrResultScreen +import com.moneymong.moneymong.ui.pxToDp @Composable fun HomeScreen( @@ -54,11 +72,14 @@ fun HomeScreen( val homeNavigator = rememberHomeNavigator() val homeNavController = homeNavigator.navHostController - val systemUiController = rememberSystemUiController() - systemUiController.setStatusBarColor( - color = homeNavigator.statusBarColor, - darkIcons = homeNavigator.darkIcons - ) + val view = LocalView.current + val window = (view.context as Activity).window + + WindowInsetsControllerCompat(window, view).run { + isAppearanceLightStatusBars = homeNavigator.isSystemBarDarkIcons + isAppearanceLightNavigationBars = homeNavigator.isSystemBarDarkIcons + } + if (expired) { ErrorDialog( @@ -80,125 +101,170 @@ fun HomeScreen( currentRoute = homeNavigator.currentRoute, navigateToTab = { homeNavigator.navigate(it.route) } ) - } + }, + contentWindowInsets = WindowInsets(0.dp) ) { padding -> - NavHost( - modifier = Modifier.fillMaxSize(), - navController = homeNavController, - startDestination = splashRoute, - enterTransition = { EnterTransition.None }, - exitTransition = { ExitTransition.None } - ) { - splashScreen( - navigateToLedger = homeNavController::navigateLedger, - navigateToLogin = homeNavController::navigateLogin - ) - // sign - loginScreen( - navigateToLedger = homeNavController::navigateLedger, - navigateToAgencyRegister = homeNavController::navigateAgencyRegister - ) + val bottomBarHeight = + (padding.calculateBottomPadding() - WindowInsets.safeDrawing.getBottom(LocalDensity.current).pxToDp) + .coerceAtLeast(0.dp) - signUpScreen( - navigateToLedger = homeNavController::navigateLedger, - navigateToSignUniversity = homeNavController::navigateSignUpUniversity, - navigateToAgency = homeNavController::navigateAgency, - navigateUp = homeNavController::navigateUp - ) + Box { + NavHost( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing), + navController = homeNavController, + startDestination = splashRoute, + enterTransition = { EnterTransition.None }, + exitTransition = { ExitTransition.None } + ) { + splashScreen( + navigateToLedger = homeNavController::navigateLedger, + navigateToLogin = homeNavController::navigateLogin + ) - signUpUniversity( - navigateToLedger = homeNavController::navigateLedger, - navigateToAgency = homeNavController::navigateAgency, - navigateUp = homeNavController::navigateUp - ) + // sign + loginScreen( + navigateToLedger = homeNavController::navigateLedger, + navigateToAgencyRegister = { + homeNavController.navigateAgencyRegister(visibleInviteCode = true) + } + ) - signCompleteScreen( - navigateToLedger = homeNavController::navigateLedger - ) + signUpScreen( + navigateToLedger = homeNavController::navigateLedger, + navigateToSignUniversity = homeNavController::navigateSignUpUniversity, + navigateToAgency = homeNavController::navigateAgency, + navigateUp = homeNavController::navigateUp + ) - // agency - agencyScreen( - padding = padding, - navigateToRegister = homeNavController::navigateAgencyRegister, - navigateAgencyJoin = {} - ) + signUpUniversity( + navigateToLedger = homeNavController::navigateLedger, + navigateToAgency = homeNavController::navigateAgency, + navigateUp = homeNavController::navigateUp + ) - agencyJoinScreen( - navigateToComplete = homeNavController::navigateAgencyJoinComplete, - navigateUp = homeNavController::navigateUp - ) + signCompleteScreen( + navigateToLedger = homeNavController::navigateLedger + ) - agencyCompleteScreen( - navigateToSearch = { - homeNavController.navigateAgency( - navOptions = navOptions { - popUpTo(agencyRoute) { inclusive = true } - } - ) - }, - navigateToLedger = homeNavController::navigateLedger, - ) + // agency + agencyScreen( + padding = padding, + navigateToRegister = homeNavController::navigateAgencyRegister, + navigateAgencyJoin = {} + ) - agencyRegisterScreen( - navigateToLedger = homeNavController::navigateLedger - ) + agencyJoinScreen( + navigateToComplete = homeNavController::navigateAgencyJoinComplete, + navigateUp = homeNavController::navigateUp + ) - agencyRegisterCompleteScreen( - navigateToSearch = { - homeNavController.navigateAgency( - navOptions = navOptions { - popUpTo(agencyRoute) { inclusive = true } - } - ) - }, - navigateToLedger = homeNavController::navigateLedger, - navigateToLedgerManual = homeNavController::navigateLedgerManual - ) + agencyCompleteScreen( + navigateToSearch = { + homeNavController.navigateAgency( + navOptions = navOptions { + popUpTo(agencyRoute) { inclusive = true } + } + ) + }, + navigateToLedger = homeNavController::navigateLedger, + ) - // ledger - ledgerScreen( - padding = padding, - navigateToAgencyRegister = homeNavController::navigateAgencyRegister, - navigateToAgencyJoin = homeNavController::navigateAgencyJoin, - navigateToLedgerDetail = homeNavController::navigateLedgerDetail, - navigateToLedgerManual = homeNavController::navigateLedgerManual, - ) + agencyRegisterScreen( + navigateToLedger = homeNavController::navigateLedger, + navigateToAgencyJoin = { homeNavController.navigateAgencyJoin(isBackButton = true) } + ) - ledgerDetailScreen(navigateToLedger = homeNavController::navigateLedger) + agencyRegisterCompleteScreen( + navigateToSearch = { + homeNavController.navigateAgency( + navOptions = navOptions { + popUpTo(agencyRoute) { inclusive = true } + } + ) + }, + navigateToLedger = homeNavController::navigateLedger, + navigateToLedgerManual = homeNavController::navigateLedgerManual + ) - ledgerManualScreen( - navigateToLedger = homeNavController::navigateLedger, - popBackStack = homeNavController::popBackStack - ) + // ledger + ledgerScreen( + padding = PaddingValues(bottom = bottomBarHeight), + navigateToAgencyRegister = homeNavController::navigateAgencyRegister, + navigateToAgencyJoin = homeNavController::navigateAgencyJoin, + navigateToLedgerDetail = homeNavController::navigateLedgerDetail, + navigateToLedgerManual = homeNavController::navigateLedgerManual, + ) - // ocr - ocrScreen( - navigateToOCRResult = homeNavController::navigateOCRResult, - navigateToLedger = homeNavController::navigateLedger, - popBackStack = homeNavController::popBackStack - ) + ledgerDetailScreen(navigateToLedger = homeNavController::navigateLedger) - ocrResultScreen( - navigateToLedger = homeNavController::navigateLedger, - navigateToOCRDetail = homeNavController::navigateOCRDetail, - popBackStack = homeNavController::popBackStack - ) + ledgerManualScreen( + navigateToLedger = homeNavController::navigateLedger, + popBackStack = homeNavController::popBackStack + ) - ocrDetailScreen( - navigateToLedger = homeNavController::navigateLedger, - popBackStack = homeNavController::popBackStack - ) + // ocr + ocrScreen( + navigateToOCRResult = homeNavController::navigateOCRResult, + navigateToLedger = homeNavController::navigateLedger, + popBackStack = homeNavController::popBackStack + ) - // mymong - myMongNavGraph( - padding = padding, - navigateToTermsOfUse = homeNavController::navigateTermsOfUse, - navigateToPrivacyPolicy = homeNavController::navigatePrivacyPolicy, - navigateToWithdrawal = homeNavController::navigateWithdrawal, - navigateToLogin = homeNavController::navigateLogin, - navigateUp = homeNavController::navigateUp - ) + ocrResultScreen( + navigateToLedger = homeNavController::navigateLedger, + navigateToOCRDetail = homeNavController::navigateOCRDetail, + popBackStack = homeNavController::popBackStack + ) + + ocrDetailScreen( + navigateToLedger = homeNavController::navigateLedger, + popBackStack = homeNavController::popBackStack + ) + + // mymong + myMongNavGraph( + padding = PaddingValues(bottom = bottomBarHeight), + navigateToTermsOfUse = homeNavController::navigateTermsOfUse, + navigateToPrivacyPolicy = homeNavController::navigatePrivacyPolicy, + navigateToWithdrawal = homeNavController::navigateWithdrawal, + navigateToLogin = homeNavController::navigateLogin, + navigateUp = homeNavController::navigateUp + ) + } + + if (homeNavigator.statusBarColor.alpha != 1f) { + CustomStatusBar(color = homeNavigator.statusBarColorWithPolicy) + } + CustomStatusBar(color = homeNavigator.statusBarColor) + + if (homeNavigator.navigationBarColor.alpha != 1f) { + CustomNavigationBar(color = homeNavigator.navigationBarColorWithPolicy) + } + CustomNavigationBar(color = homeNavigator.navigationBarColor) } } +} + +@Composable +private fun BoxScope.CustomStatusBar(color: Color) { + Spacer( + modifier = Modifier + .fillMaxWidth() + .windowInsetsTopHeight(WindowInsets.safeDrawing) + .align(alignment = Alignment.TopCenter) + .background(color = color) + ) +} + +@Composable +private fun BoxScope.CustomNavigationBar(color: Color) { + Spacer( + modifier = Modifier + .fillMaxWidth() + .windowInsetsBottomHeight(WindowInsets.safeDrawing) + .align(alignment = Alignment.BottomCenter) + .background(color = color) + ) } \ No newline at end of file diff --git a/feature/home/src/main/java/com/moneymong/moneymong/home/navigation/HomeNavigator.kt b/feature/home/src/main/java/com/moneymong/moneymong/home/navigation/HomeNavigator.kt index 2baf82ad..4db21d80 100644 --- a/feature/home/src/main/java/com/moneymong/moneymong/home/navigation/HomeNavigator.kt +++ b/feature/home/src/main/java/com/moneymong/moneymong/home/navigation/HomeNavigator.kt @@ -1,6 +1,8 @@ package com.moneymong.moneymong.home.navigation import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.graphics.Color import androidx.navigation.NavBackStackEntry @@ -8,13 +10,13 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions +import com.moneymong.moneymong.common.ui.SystemBarColorController import com.moneymong.moneymong.design_system.theme.Blue04 import com.moneymong.moneymong.design_system.theme.Gray01 import com.moneymong.moneymong.design_system.theme.Gray08 import com.moneymong.moneymong.design_system.theme.White import com.moneymong.moneymong.feature.agency.navigation.agencyRegisterCompleteRoute import com.moneymong.moneymong.feature.agency.navigation.agencyRoute -import com.moneymong.moneymong.feature.agency.navigation.navigateAgency import com.moneymong.moneymong.feature.mymong.navigation.mymongRoute import com.moneymong.moneymong.feature.mymong.navigation.navigateMyMong import com.moneymong.moneymong.feature.sign.navigation.loginRoute @@ -35,21 +37,32 @@ internal class HomeNavigator( @Composable get() = navHostController.currentBackStackEntryAsState().value private val routes: List - @Composable get() = remember { HomeBottomTabs.values().map { it.route } } + @Composable get() = remember { HomeBottomTabs.entries.map { it.route } } val currentRoute: String? @Composable get() = navBackStackEntry?.destination?.route val statusBarColor: Color + @Composable + get() { + val systemBarColors by SystemBarColorController.systemBarColors.collectAsState() + return systemBarColors.statusBarColor ?: statusBarColorWithPolicy + } + + val navigationBarColor: Color + @Composable + get() { + val systemBarColors by SystemBarColorController.systemBarColors.collectAsState() + return systemBarColors.navigationBarColor ?: navigationBarColorWithPolicy + } + + val statusBarColorWithPolicy: Color @Composable get() = when (currentRoute) { - in listOf( - splashRoute, - ) -> Blue04 + splashRoute -> Blue04 in listOf( loginRoute, - agencyRoute, ledgerDetailRoute, mymongRoute ) -> Gray01 @@ -59,7 +72,18 @@ internal class HomeNavigator( else -> White } - val darkIcons: Boolean + val navigationBarColorWithPolicy: Color + @Composable + get() = when (currentRoute) { + splashRoute -> Blue04 + loginRoute -> Gray01 + ledgerDetailRoute -> Gray01 + agencyRegisterCompleteRoute -> Gray08 + + else -> White + } + + val isSystemBarDarkIcons: Boolean @Composable get() = when (currentRoute) { in listOf( diff --git a/feature/ledger/build.gradle.kts b/feature/ledger/build.gradle.kts index b8b3f667..385268a9 100644 --- a/feature/ledger/build.gradle.kts +++ b/feature/ledger/build.gradle.kts @@ -10,6 +10,8 @@ android { } dependencies { + implementation(projects.core.analytics) + implementation(projects.core.android) implementation(projects.core.common) implementation(projects.core.ui) implementation(projects.core.model) diff --git a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerScreen.kt b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerScreen.kt index 11eec6ee..2571ac87 100644 --- a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerScreen.kt +++ b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerScreen.kt @@ -4,8 +4,10 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material.ExperimentalMaterialApi @@ -26,13 +28,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavOptions import com.example.member.MemberScreen -import com.moneymong.moneymong.common.event.Event -import com.moneymong.moneymong.common.ui.plus +import com.moneymong.moneymong.analytics.LocalAnalyticsTracker import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.component.bottomSheet.MDSBottomSheet import com.moneymong.moneymong.design_system.component.button.MDSFloatingActionButton @@ -50,6 +52,7 @@ import com.moneymong.moneymong.ledger.view.LedgerTab import com.moneymong.moneymong.ledger.view.LedgerTabRowView import com.moneymong.moneymong.ledger.view.LedgerTopbarView import com.moneymong.moneymong.ledger.view.onboarding.OnboardingComponentState +import com.moneymong.moneymong.ui.logClicked import kotlinx.coroutines.launch import org.orbitmvi.orbit.compose.collectAsState import org.orbitmvi.orbit.compose.collectSideEffect @@ -70,6 +73,7 @@ fun LedgerScreen( ) { val state = viewModel.collectAsState().value val tabs = listOf(LedgerTab.Ledger, LedgerTab.Member) + val systemBarTopHeight = WindowInsets.safeDrawing.getTop(LocalDensity.current).toFloat() val coroutineScope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } val pagerState = rememberPagerState(pageCount = { tabs.size }) @@ -79,6 +83,7 @@ fun LedgerScreen( refreshing = state.isRefreshing, onRefresh = viewModel::fetchLedgerTransactionList ) + val analyticsTracker = LocalAnalyticsTracker.current LaunchedEffect(Unit) { viewModel.fetchMyAgencyList() @@ -139,13 +144,14 @@ fun LedgerScreen( } Scaffold( - modifier = Modifier.pullRefresh(pullRefreshState), + modifier = Modifier + .pullRefresh(pullRefreshState) + .padding(padding), topBar = { LedgerTopbarView( modifier = Modifier.background(White), header = state.currentAgency?.name ?: "장부", icon = R.drawable.ic_chevron_bottom, - visibleArrow = state.agencyList.isNotEmpty(), onClickDownArrow = viewModel::onClickAgencyChange ) }, @@ -153,13 +159,14 @@ fun LedgerScreen( MDSSnackbarHost( modifier = Modifier.padding( start = MMHorizontalSpacing, - bottom = 12.dp + padding.calculateBottomPadding(), + bottom = 12.dp, end = MMHorizontalSpacing ), hostState = snackbarHostState ) - } - ) { + }, + contentWindowInsets = WindowInsets(0.dp) + ) { innerPadding -> if (state.showBottomSheet) { MDSBottomSheet( sheetState = sheetState, @@ -198,7 +205,7 @@ fun LedgerScreen( Column( modifier = Modifier .fillMaxSize() - .padding(it + padding) + .padding(innerPadding) ) { if (!state.existAgency) { LedgerAgencyEmptyView(onClickAgencyRegister = navigateToAgencyRegister) @@ -247,14 +254,19 @@ fun LedgerScreen( MDSFloatingActionButton( modifier = Modifier.onGloballyPositioned { layoutCoordinates -> addFABState = OnboardingComponentState( - offset = layoutCoordinates.localToRoot(Offset.Zero), + offset = layoutCoordinates.localToRoot( + Offset( + x = 0f, + y = -systemBarTopHeight + ) + ), size = layoutCoordinates.size ) }, iconResource = R.drawable.ic_plus_default, containerColor = Mint03, onClick = { - viewModel.eventTracker.logEvent(Event.PLUS_CLICK) + analyticsTracker.logClicked("plus_click") viewModel.onClickLedgerRegisterManual() } ) diff --git a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerSideEffect.kt b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerSideEffect.kt index ccae7da7..8dda7faf 100644 --- a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerSideEffect.kt +++ b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.ledger -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed class LedgerSideEffect : SideEffect { data object LedgerOpenSheet : LedgerSideEffect() diff --git a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerState.kt b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerState.kt index e4fdee2f..983bb129 100644 --- a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerState.kt +++ b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerState.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.ledger -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State import com.moneymong.moneymong.ledger.view.LedgerTransactionType import com.moneymong.moneymong.model.agency.MyAgencyResponse import com.moneymong.moneymong.model.ledger.LedgerDetail diff --git a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerViewModel.kt b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerViewModel.kt index dd5d5c57..c999a5ba 100644 --- a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerViewModel.kt +++ b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/LedgerViewModel.kt @@ -2,10 +2,8 @@ package com.moneymong.moneymong.ledger import android.util.Log import androidx.lifecycle.SavedStateHandle -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.common.error.MoneyMongError -import com.moneymong.moneymong.common.event.Event -import com.moneymong.moneymong.common.event.EventTracker import com.moneymong.moneymong.domain.usecase.agency.FetchAgencyIdUseCase import com.moneymong.moneymong.domain.usecase.agency.FetchMyAgencyListUseCase import com.moneymong.moneymong.domain.usecase.agency.SaveAgencyIdUseCase @@ -30,7 +28,6 @@ import javax.inject.Inject @HiltViewModel class LedgerViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - val eventTracker: EventTracker, private val fetchLedgerTransactionListUseCase: FetchLedgerTransactionListUseCase, private val fetchAgencyExistLedgerUseCase: FetchAgencyExistLedgerUseCase, private val fetchMyAgencyListUseCase: FetchMyAgencyListUseCase, @@ -55,10 +52,10 @@ class LedgerViewModel @Inject constructor( fetchAgencyExistLedger(), fetchAgencyMemberList(), fetchLedgerTransactionList(), - fetchVisibleLedgerOnboarding() ) jobList.joinAll() + fetchVisibleLedgerOnboarding() } fun fetchDefaultInfo() = intent { @@ -251,13 +248,11 @@ class LedgerViewModel @Inject constructor( } fun onClickLedgerRegisterManual() = intent { - eventTracker.logEvent(Event.HAND_CLICK) postSideEffect(LedgerSideEffect.LedgerNavigateToLedgerManual) } fun onDismissOnboarding() = intent { postDisplayedLedgerOnboardingUseCase(onboardingType = state.onboardingType) - reduce { state.copy(visibleOnboarding = false) } } diff --git a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/LedgerDefaultView.kt b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/LedgerDefaultView.kt index 28e447ff..8ec1abee 100644 --- a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/LedgerDefaultView.kt +++ b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/LedgerDefaultView.kt @@ -7,10 +7,12 @@ 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.WindowInsets 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.safeDrawing import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed @@ -29,12 +31,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.geometry.Offset import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable -import com.moneymong.moneymong.common.ui.toWonFormat +import com.moneymong.moneymong.ui.noRippleClickable +import com.moneymong.moneymong.ui.toWonFormat import com.moneymong.moneymong.design_system.R.drawable import com.moneymong.moneymong.design_system.component.chip.MDSChip import com.moneymong.moneymong.design_system.component.indicator.LoadingScreen @@ -102,6 +105,7 @@ internal fun LedgerDefaultView( LedgerTransactionType.수입 ) + val systemBarTopHeight = WindowInsets.safeDrawing.getTop(LocalDensity.current).toFloat() var dateRowState by remember { mutableStateOf(OnboardingComponentState()) } LazyColumn( @@ -140,7 +144,7 @@ internal fun LedgerDefaultView( LedgerDefaultDateRow( modifier = Modifier.onGloballyPositioned { dateRowState = OnboardingComponentState( - offset = it.localToRoot(Offset.Zero), + offset = it.localToRoot(Offset(x = 0f, y = -systemBarTopHeight)), size = it.size ) }, diff --git a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/LedgerTopbarView.kt b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/LedgerTopbarView.kt index 41398381..75a33a21 100644 --- a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/LedgerTopbarView.kt +++ b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/LedgerTopbarView.kt @@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer 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.layout.width @@ -19,17 +18,16 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.theme.Gray10 import com.moneymong.moneymong.design_system.theme.Heading1 -import com.moneymong.moneymong.design_system.R +import com.moneymong.moneymong.ui.noRippleClickable @Composable fun LedgerTopbarView( modifier: Modifier = Modifier, header: String, icon: Int, - visibleArrow: Boolean = false, onClickDownArrow: () -> Unit ) { Row( @@ -51,18 +49,16 @@ fun LedgerTopbarView( maxLines = 1 ) Spacer(modifier = Modifier.width(4.dp)) - if (visibleArrow) { - Icon( - modifier = Modifier - .size(20.dp) - .noRippleClickable { - onClickDownArrow() - }, - painter = painterResource(id = icon), - contentDescription = null, - tint = Gray10 - ) - } + Icon( + modifier = Modifier + .size(20.dp) + .noRippleClickable { + onClickDownArrow() + }, + painter = painterResource(id = icon), + contentDescription = null, + tint = Gray10 + ) } } @@ -72,6 +68,5 @@ fun LedgerTopbarPreview() { LedgerTopbarView( header = "장부장부장부장부장부장부장부장부장부", icon = R.drawable.ic_chevron_bottom, - visibleArrow = true ) {} } \ No newline at end of file diff --git a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/item/LedgerTransactionItem.kt b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/item/LedgerTransactionItem.kt index b2d850c2..17082783 100644 --- a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/item/LedgerTransactionItem.kt +++ b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/item/LedgerTransactionItem.kt @@ -19,8 +19,8 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ext.toDateFormat -import com.moneymong.moneymong.common.ui.toWonFormat +import com.moneymong.moneymong.common.util.toDateFormat +import com.moneymong.moneymong.ui.toWonFormat import com.moneymong.moneymong.design_system.R.* import com.moneymong.moneymong.design_system.theme.Blue01 import com.moneymong.moneymong.design_system.theme.Blue04 diff --git a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/onboarding/LedgerOnboarding.kt b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/onboarding/LedgerOnboarding.kt index 1beb6833..3281ee5a 100644 --- a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/onboarding/LedgerOnboarding.kt +++ b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/onboarding/LedgerOnboarding.kt @@ -10,9 +10,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.unit.IntSize -import com.google.accompanist.systemuicontroller.rememberSystemUiController +import com.moneymong.moneymong.common.ui.SystemBarColorController import com.moneymong.moneymong.design_system.theme.Gray10 -import com.moneymong.moneymong.design_system.theme.White import com.moneymong.moneymong.ledger.view.onboarding.popup.LedgerOnboardingPopup import java.time.LocalDate @@ -36,16 +35,14 @@ internal fun LedgerOnboarding( onDismiss: () -> Unit ) { - val systemUiController = rememberSystemUiController() DisposableEffect(key1 = Unit) { - systemUiController.setStatusBarColor( + SystemBarColorController.setSystemBarColors( color = Gray10.copy(alpha = 0.7f), - darkIcons = true ) onDispose { - systemUiController.setStatusBarColor(color = White) + SystemBarColorController.initialSystemBarColors() } } diff --git a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/onboarding/LedgerOnboardingControlButton.kt b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/onboarding/LedgerOnboardingControlButton.kt index acfdd8fb..ece95f2e 100644 --- a/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/onboarding/LedgerOnboardingControlButton.kt +++ b/feature/ledger/src/main/java/com/moneymong/moneymong/ledger/view/onboarding/LedgerOnboardingControlButton.kt @@ -10,7 +10,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.theme.Heading1 import com.moneymong.moneymong.design_system.theme.White diff --git a/feature/ledgerdetail/build.gradle.kts b/feature/ledgerdetail/build.gradle.kts index 280367a9..7dae8ad6 100644 --- a/feature/ledgerdetail/build.gradle.kts +++ b/feature/ledgerdetail/build.gradle.kts @@ -10,6 +10,7 @@ android { } dependencies { + implementation(projects.core.android) implementation(projects.core.common) implementation(projects.core.model) implementation(projects.domain) diff --git a/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailScreen.kt b/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailScreen.kt index 8dd5409a..8153008d 100644 --- a/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailScreen.kt +++ b/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailScreen.kt @@ -27,6 +27,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -43,14 +44,14 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage -import com.moneymong.moneymong.common.ext.base64ToFile -import com.moneymong.moneymong.common.ext.encodingBase64 -import com.moneymong.moneymong.common.ui.DottedShape -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.android.util.base64ToFile +import com.moneymong.moneymong.android.util.encodingBase64 +import com.moneymong.moneymong.common.ui.SystemBarColorController import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.component.button.MDSButton import com.moneymong.moneymong.design_system.component.button.MDSButtonSize import com.moneymong.moneymong.design_system.component.button.MDSButtonType +import com.moneymong.moneymong.design_system.component.indicator.LoadingScreen import com.moneymong.moneymong.design_system.component.modal.MDSModal import com.moneymong.moneymong.design_system.component.textfield.MDSTextField import com.moneymong.moneymong.design_system.component.textfield.util.MDSTextFieldIcons @@ -59,7 +60,6 @@ import com.moneymong.moneymong.design_system.component.textfield.visualtransform import com.moneymong.moneymong.design_system.component.textfield.visualtransformation.PriceVisualTransformation import com.moneymong.moneymong.design_system.component.textfield.visualtransformation.TimeVisualTransformation import com.moneymong.moneymong.design_system.error.ErrorDialog -import com.moneymong.moneymong.design_system.component.indicator.LoadingScreen import com.moneymong.moneymong.design_system.theme.Blue01 import com.moneymong.moneymong.design_system.theme.Blue03 import com.moneymong.moneymong.design_system.theme.Blue04 @@ -72,6 +72,8 @@ import com.moneymong.moneymong.design_system.theme.Gray10 import com.moneymong.moneymong.design_system.theme.MMHorizontalSpacing import com.moneymong.moneymong.design_system.theme.White import com.moneymong.moneymong.ledgerdetail.view.LedgerDetailTopbarView +import com.moneymong.moneymong.ui.DottedShape +import com.moneymong.moneymong.ui.noRippleClickable import org.orbitmvi.orbit.compose.collectAsState import org.orbitmvi.orbit.compose.collectSideEffect @@ -466,6 +468,14 @@ fun LedgerDetailScreen( } Spacer(modifier = Modifier.height(20.dp)) if (state.isStaff) { + DisposableEffect(key1 = Unit) { + SystemBarColorController.setNavigationBarColor(color = White) + + onDispose { + SystemBarColorController.initialSystemBarColors() + } + } + Column( modifier = Modifier .fillMaxWidth() diff --git a/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailSideEffect.kt b/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailSideEffect.kt index f1074f0f..a96bc726 100644 --- a/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailSideEffect.kt +++ b/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.ledgerdetail -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed class LedgerDetailSideEffect : SideEffect { data object LedgerDetailEdit : LedgerDetailSideEffect() diff --git a/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailState.kt b/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailState.kt index cfb27339..fb6dccf3 100644 --- a/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailState.kt +++ b/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailState.kt @@ -1,9 +1,9 @@ package com.moneymong.moneymong.ledgerdetail import androidx.compose.ui.text.input.TextFieldValue -import com.moneymong.moneymong.common.base.State -import com.moneymong.moneymong.common.ext.toDateFormat -import com.moneymong.moneymong.common.ui.toWonFormat +import com.moneymong.moneymong.android.State +import com.moneymong.moneymong.common.util.toDateFormat +import com.moneymong.moneymong.ui.toWonFormat import com.moneymong.moneymong.design_system.component.textfield.util.PriceType import com.moneymong.moneymong.model.ledger.FundType import com.moneymong.moneymong.model.ledgerdetail.LedgerTransactionDetailResponse diff --git a/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailViewModel.kt b/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailViewModel.kt index 1f4e0157..d9dc9c93 100644 --- a/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailViewModel.kt +++ b/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/LedgerDetailViewModel.kt @@ -2,13 +2,13 @@ package com.moneymong.moneymong.ledgerdetail import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.SavedStateHandle -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.common.error.MoneyMongError -import com.moneymong.moneymong.common.ext.toDateFormat -import com.moneymong.moneymong.common.ext.toMultipart -import com.moneymong.moneymong.common.ui.isValidPaymentDate -import com.moneymong.moneymong.common.ui.isValidPaymentTime -import com.moneymong.moneymong.common.ui.validateValue +import com.moneymong.moneymong.common.util.toDateFormat +import com.moneymong.moneymong.android.util.toMultipart +import com.moneymong.moneymong.ui.isValidPaymentDate +import com.moneymong.moneymong.ui.isValidPaymentTime +import com.moneymong.moneymong.ui.validateValue import com.moneymong.moneymong.domain.usecase.ledgerdetail.FetchLedgerTransactionDetailUseCase import com.moneymong.moneymong.domain.usecase.ledgerdetail.DeleteLedgerDetailUseCase import com.moneymong.moneymong.domain.usecase.ledgerdetail.DeleteLedgerDocumentTransactionUseCase diff --git a/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/view/LedgerDetailTopbarView.kt b/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/view/LedgerDetailTopbarView.kt index 06bb01b7..b5228cb4 100644 --- a/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/view/LedgerDetailTopbarView.kt +++ b/feature/ledgerdetail/src/main/java/com/moneymong/moneymong/ledgerdetail/view/LedgerDetailTopbarView.kt @@ -12,7 +12,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R.* import com.moneymong.moneymong.design_system.theme.Blue04 import com.moneymong.moneymong.design_system.theme.Body3 diff --git a/feature/ledgermanual/build.gradle.kts b/feature/ledgermanual/build.gradle.kts index 22c03c40..ed90cd41 100644 --- a/feature/ledgermanual/build.gradle.kts +++ b/feature/ledgermanual/build.gradle.kts @@ -10,6 +10,7 @@ android { } dependencies { + implementation(projects.core.android) implementation(projects.core.common) implementation(projects.core.model) implementation(projects.domain) diff --git a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualScreen.kt b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualScreen.kt index 3666a4db..067b91a7 100644 --- a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualScreen.kt +++ b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualScreen.kt @@ -44,19 +44,16 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage -import com.moneymong.moneymong.common.ext.base64ToFile -import com.moneymong.moneymong.common.ext.encodingBase64 -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.android.util.base64ToFile +import com.moneymong.moneymong.android.util.encodingBase64 +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R.drawable import com.moneymong.moneymong.design_system.component.button.MDSButton import com.moneymong.moneymong.design_system.component.button.MDSButtonSize @@ -76,7 +73,6 @@ import com.moneymong.moneymong.design_system.theme.Body3 import com.moneymong.moneymong.design_system.theme.Gray06 import com.moneymong.moneymong.design_system.theme.Gray10 import com.moneymong.moneymong.design_system.theme.MMHorizontalSpacing -import com.moneymong.moneymong.design_system.theme.Red03 import com.moneymong.moneymong.design_system.theme.White import com.moneymong.moneymong.ledgermanual.view.LedgerManualTopbarView import com.moneymong.moneymong.model.ledger.FundType diff --git a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualSideEffect.kt b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualSideEffect.kt index 74b0efe1..496ffb33 100644 --- a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualSideEffect.kt +++ b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.ledgermanual -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed class LedgerManualSideEffect : SideEffect { diff --git a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualState.kt b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualState.kt index 7b4725ee..294d825a 100644 --- a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualState.kt +++ b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualState.kt @@ -1,8 +1,8 @@ package com.moneymong.moneymong.ledgermanual import androidx.compose.ui.text.input.TextFieldValue -import com.moneymong.moneymong.common.base.State -import com.moneymong.moneymong.common.ext.toZonedDateTime +import com.moneymong.moneymong.android.State +import com.moneymong.moneymong.common.util.toZonedDateTime import com.moneymong.moneymong.design_system.component.textfield.util.PriceType import com.moneymong.moneymong.model.ledger.FundType import java.text.SimpleDateFormat diff --git a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualViewModel.kt b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualViewModel.kt index b99ee70e..ac10bc8a 100644 --- a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualViewModel.kt +++ b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualViewModel.kt @@ -1,11 +1,11 @@ package com.moneymong.moneymong.ledgermanual import androidx.compose.ui.text.input.TextFieldValue -import com.moneymong.moneymong.common.base.BaseViewModel -import com.moneymong.moneymong.common.ext.toMultipart -import com.moneymong.moneymong.common.ui.isValidPaymentDate -import com.moneymong.moneymong.common.ui.isValidPaymentTime -import com.moneymong.moneymong.common.ui.validateValue +import com.moneymong.moneymong.android.BaseViewModel +import com.moneymong.moneymong.android.util.toMultipart +import com.moneymong.moneymong.ui.isValidPaymentDate +import com.moneymong.moneymong.ui.isValidPaymentTime +import com.moneymong.moneymong.ui.validateValue import com.moneymong.moneymong.domain.usecase.agency.FetchAgencyIdUseCase import com.moneymong.moneymong.domain.usecase.ledger.PostLedgerTransactionUseCase import com.moneymong.moneymong.domain.usecase.ocr.PostFileUploadUseCase diff --git a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/view/LedgerManualTopbarView.kt b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/view/LedgerManualTopbarView.kt index 93fb19c9..b5aad548 100644 --- a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/view/LedgerManualTopbarView.kt +++ b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/view/LedgerManualTopbarView.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.material3.Icon import androidx.compose.material3.Text @@ -16,7 +15,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.theme.Gray07 import com.moneymong.moneymong.design_system.theme.Gray10 diff --git a/feature/member/build.gradle.kts b/feature/member/build.gradle.kts index 6a994f13..a1b3bbd0 100644 --- a/feature/member/build.gradle.kts +++ b/feature/member/build.gradle.kts @@ -1,15 +1,13 @@ @Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed plugins { - alias(libs.plugins.moneymong.android.library) alias(libs.plugins.moneymong.android.library.compose) - alias(libs.plugins.kotlin.android) + alias(libs.plugins.moneymong.android.feature) alias(libs.plugins.moneymong.android.hilt) } android { namespace = "com.example.member" - } dependencies { @@ -17,32 +15,15 @@ dependencies { implementation(libs.appcompat) implementation(libs.material) - implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.compose.ui) - implementation(libs.androidx.compose.ui.tooling.preview) - implementation(libs.androidx.compose.material3) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.constraintlayout) - implementation(libs.navigation.fragment.ktx) - implementation(libs.navigation.ui.ktx) - implementation(libs.lifecycle.runtime.ktx) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.ui.graphics) - testImplementation(libs.junit4) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.test.espresso.core) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(libs.ui.test.junit4) - debugImplementation(libs.androidx.compose.ui.tooling) - debugImplementation(libs.androidx.compose.ui.testManifest) + implementation(projects.core.android) implementation(projects.core.common) implementation(projects.core.designSystem) implementation(projects.core.model) + implementation(projects.core.ui) implementation(projects.domain) implementation(libs.orbit.compose) diff --git a/feature/member/src/main/java/com/example/member/MemberScreen.kt b/feature/member/src/main/java/com/example/member/MemberScreen.kt index 9dedc5fb..630641eb 100644 --- a/feature/member/src/main/java/com/example/member/MemberScreen.kt +++ b/feature/member/src/main/java/com/example/member/MemberScreen.kt @@ -2,7 +2,6 @@ package com.example.member import BottomSheetType import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -31,7 +30,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import com.example.member.component.MemberCardView import com.example.member.component.MemberDialogView import com.example.member.component.MemberListView -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.component.bottomSheet.MDSBottomSheet import com.moneymong.moneymong.design_system.component.button.MDSButton diff --git a/feature/member/src/main/java/com/example/member/MemberSideEffect.kt b/feature/member/src/main/java/com/example/member/MemberSideEffect.kt index c8116c06..70e6416e 100644 --- a/feature/member/src/main/java/com/example/member/MemberSideEffect.kt +++ b/feature/member/src/main/java/com/example/member/MemberSideEffect.kt @@ -1,6 +1,6 @@ package com.example.member -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed class MemberSideEffect : SideEffect { data class GetInvitationCode(val agencyId: Long) : MemberSideEffect() diff --git a/feature/member/src/main/java/com/example/member/MemberState.kt b/feature/member/src/main/java/com/example/member/MemberState.kt index 3a4ae76a..028e98e0 100644 --- a/feature/member/src/main/java/com/example/member/MemberState.kt +++ b/feature/member/src/main/java/com/example/member/MemberState.kt @@ -1,7 +1,7 @@ package com.example.member -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State import com.moneymong.moneymong.model.member.AgencyUser data class MemberState( diff --git a/feature/member/src/main/java/com/example/member/MemberViewModel.kt b/feature/member/src/main/java/com/example/member/MemberViewModel.kt index 49ab1ec2..15658e23 100644 --- a/feature/member/src/main/java/com/example/member/MemberViewModel.kt +++ b/feature/member/src/main/java/com/example/member/MemberViewModel.kt @@ -1,7 +1,7 @@ package com.example.member import android.util.Log -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.domain.usecase.agency.FetchAgencyIdUseCase import com.moneymong.moneymong.domain.usecase.member.DeleteAgencyUseCase import com.moneymong.moneymong.domain.usecase.member.MemberBlockUseCase diff --git a/feature/member/src/main/java/com/example/member/component/MemberCardView.kt b/feature/member/src/main/java/com/example/member/component/MemberCardView.kt index b0ca5ba8..fdcf028b 100644 --- a/feature/member/src/main/java/com/example/member/component/MemberCardView.kt +++ b/feature/member/src/main/java/com/example/member/component/MemberCardView.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.example.member.util.MemberRoundRectShadow -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.component.tag.MDSTag import com.moneymong.moneymong.design_system.theme.Blue04 diff --git a/feature/member/src/main/java/com/example/member/item/MemberListItem.kt b/feature/member/src/main/java/com/example/member/item/MemberListItem.kt index 3d1d4c54..355f8868 100644 --- a/feature/member/src/main/java/com/example/member/item/MemberListItem.kt +++ b/feature/member/src/main/java/com/example/member/item/MemberListItem.kt @@ -14,7 +14,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.component.tag.MDSTag import com.moneymong.moneymong.design_system.theme.Blue04 diff --git a/feature/mymong/build.gradle.kts b/feature/mymong/build.gradle.kts index 59e4acdf..8636ee93 100644 --- a/feature/mymong/build.gradle.kts +++ b/feature/mymong/build.gradle.kts @@ -10,6 +10,7 @@ android { } dependencies { + implementation(projects.core.android) implementation(projects.core.model) implementation(projects.domain) diff --git a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/component/MyMongInnerTopBar.kt b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/component/MyMongInnerTopBar.kt index 774f6ce5..4d4ac126 100644 --- a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/component/MyMongInnerTopBar.kt +++ b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/component/MyMongInnerTopBar.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.theme.Gray07 import com.moneymong.moneymong.design_system.theme.Gray10 diff --git a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongSideEffect.kt b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongSideEffect.kt index 6b53802e..6a2e8e95 100644 --- a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongSideEffect.kt +++ b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.mymong.main -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed interface MyMongSideEffect : SideEffect { data object NavigateToWithdrawal : MyMongSideEffect diff --git a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongState.kt b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongState.kt index 6b49e415..0cfda01a 100644 --- a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongState.kt +++ b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongState.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.mymong.main -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State data class MyMongState( val name: String = "", diff --git a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongViewModel.kt b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongViewModel.kt index e3beeab0..052a3cc1 100644 --- a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongViewModel.kt +++ b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/MyMongViewModel.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.mymong.main -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.common.error.MoneyMongError import com.moneymong.moneymong.domain.usecase.agency.SaveAgencyIdUseCase import com.moneymong.moneymong.domain.usecase.user.FetchMyInfoUseCase diff --git a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/view/MyMongSettingView.kt b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/view/MyMongSettingView.kt index 6e2f6865..63d87e3e 100644 --- a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/view/MyMongSettingView.kt +++ b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/main/view/MyMongSettingView.kt @@ -22,14 +22,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.theme.Blue04 import com.moneymong.moneymong.design_system.theme.Body4 import com.moneymong.moneymong.design_system.theme.Gray02 import com.moneymong.moneymong.design_system.theme.Gray06 import com.moneymong.moneymong.design_system.theme.Gray07 -import com.moneymong.moneymong.design_system.theme.Gray10 import com.moneymong.moneymong.design_system.theme.White import com.moneymong.moneymong.feature.mymong.main.util.myMongRoundRectShadow @@ -48,7 +47,7 @@ internal fun MyMongSettingView( } else { packageManager.getPackageInfo(packageName, 0) } - }.versionName + }.versionName.orEmpty() Column(modifier = modifier.fillMaxWidth()) { Column( diff --git a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalScreen.kt b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalScreen.kt index f5b56795..e9bcd2f8 100644 --- a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalScreen.kt +++ b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalScreen.kt @@ -19,7 +19,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.component.button.MDSButton import com.moneymong.moneymong.design_system.component.modal.MDSModal diff --git a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalSideEffect.kt b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalSideEffect.kt index b0aef6c4..91886d83 100644 --- a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalSideEffect.kt +++ b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.mymong.withdrawal -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed interface WithdrawalSideEffect : SideEffect { data object NavigateToLogin : WithdrawalSideEffect diff --git a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalState.kt b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalState.kt index 6dcbd5d7..f13d0b5b 100644 --- a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalState.kt +++ b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalState.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.mymong.withdrawal -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State data class WithdrawalState( val isAgreed: Boolean = false, diff --git a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalViewModel.kt b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalViewModel.kt index 4d1da1d7..e0265620 100644 --- a/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalViewModel.kt +++ b/feature/mymong/src/main/java/com/moneymong/moneymong/feature/mymong/withdrawal/WithdrawalViewModel.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.mymong.withdrawal -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.common.error.MoneyMongError import com.moneymong.moneymong.domain.usecase.agency.SaveAgencyIdUseCase import com.moneymong.moneymong.domain.usecase.user.SaveDeniedCameraPermissionUseCase diff --git a/feature/ocr-detail/build.gradle.kts b/feature/ocr-detail/build.gradle.kts index 34c1bdc2..cfbee5a9 100644 --- a/feature/ocr-detail/build.gradle.kts +++ b/feature/ocr-detail/build.gradle.kts @@ -10,6 +10,7 @@ android { } dependencies { + implementation(projects.core.android) implementation(projects.core.common) implementation(projects.core.designSystem) implementation(projects.core.model) diff --git a/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailScreen.kt b/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailScreen.kt index 5bf60961..6b6664ff 100644 --- a/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailScreen.kt +++ b/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailScreen.kt @@ -52,10 +52,10 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage -import com.moneymong.moneymong.common.ext.base64ToFile -import com.moneymong.moneymong.common.ext.encodingBase64 -import com.moneymong.moneymong.common.ui.DottedShape -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.android.util.base64ToFile +import com.moneymong.moneymong.android.util.encodingBase64 +import com.moneymong.moneymong.ui.DottedShape +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.component.button.MDSButton import com.moneymong.moneymong.design_system.component.selection.MDSSelection diff --git a/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailSideEffect.kt b/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailSideEffect.kt index 231c3992..9e6c6d0b 100644 --- a/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailSideEffect.kt +++ b/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.ocr_detail -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect sealed class OCRDetailSideEffect : SideEffect { data object OCRDetailOpenImagePicker : OCRDetailSideEffect() diff --git a/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailState.kt b/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailState.kt index e9fcd6a0..0b23a107 100644 --- a/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailState.kt +++ b/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailState.kt @@ -1,7 +1,7 @@ package com.moneymong.moneymong.ocr_detail import androidx.compose.ui.text.input.TextFieldValue -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State import com.moneymong.moneymong.design_system.component.textfield.util.PriceType import com.moneymong.moneymong.model.ledger.FundType import com.moneymong.moneymong.model.ocr.DocumentResponse diff --git a/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailViewModel.kt b/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailViewModel.kt index a5ed714e..14800b9b 100644 --- a/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailViewModel.kt +++ b/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/OCRDetailViewModel.kt @@ -2,13 +2,11 @@ package com.moneymong.moneymong.ocr_detail import android.content.SharedPreferences import androidx.compose.ui.text.input.TextFieldValue -import com.moneymong.moneymong.common.base.BaseViewModel -import com.moneymong.moneymong.common.event.Event -import com.moneymong.moneymong.common.event.EventTracker -import com.moneymong.moneymong.common.ext.toMultipart -import com.moneymong.moneymong.common.ui.isValidPaymentDate -import com.moneymong.moneymong.common.ui.isValidPaymentTime -import com.moneymong.moneymong.common.ui.validateValue +import com.moneymong.moneymong.android.BaseViewModel +import com.moneymong.moneymong.android.util.toMultipart +import com.moneymong.moneymong.ui.isValidPaymentDate +import com.moneymong.moneymong.ui.isValidPaymentTime +import com.moneymong.moneymong.ui.validateValue import com.moneymong.moneymong.domain.usecase.agency.FetchAgencyIdUseCase import com.moneymong.moneymong.domain.usecase.ledger.PostLedgerTransactionUseCase import com.moneymong.moneymong.domain.usecase.ocr.PostFileUploadUseCase @@ -31,7 +29,6 @@ import javax.inject.Inject @HiltViewModel class OCRDetailViewModel @Inject constructor( - private val eventTracker: EventTracker, private val prefs: SharedPreferences, private val postLedgerTransactionUseCase: PostLedgerTransactionUseCase, private val postFileUploadUseCase: PostFileUploadUseCase, @@ -136,7 +133,6 @@ class OCRDetailViewModel @Inject constructor( } fun onClickPostLedger() = intent { - eventTracker.logEvent(Event.OCR_MODIFY_TO_REGISTER_CLICK) postDocumentImage(imageFile = state.receiptFile, isReceipt = true) } @@ -145,7 +141,7 @@ class OCRDetailViewModel @Inject constructor( fun addDocumentImage(file: File?) = intent { val newDocumentUris = state.documentImageUrls.toMutableList() if (newDocumentUris.size == 12) { - newDocumentUris.removeFirst() + newDocumentUris.removeAt(index = 0) reduce { state.copy(documentImageUrls = newDocumentUris) } } postDocumentImage(file) diff --git a/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/view/OCRDetailTopbarView.kt b/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/view/OCRDetailTopbarView.kt index 324a2a83..86db074f 100644 --- a/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/view/OCRDetailTopbarView.kt +++ b/feature/ocr-detail/src/main/java/com/moneymong/moneymong/ocr_detail/view/OCRDetailTopbarView.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R.* import com.moneymong.moneymong.design_system.theme.Blue04 import com.moneymong.moneymong.design_system.theme.Body2 diff --git a/feature/ocr-result/build.gradle.kts b/feature/ocr-result/build.gradle.kts index 10ea4386..d1e338b4 100644 --- a/feature/ocr-result/build.gradle.kts +++ b/feature/ocr-result/build.gradle.kts @@ -10,6 +10,7 @@ android { } dependencies { + implementation(projects.core.android) implementation(projects.core.common) implementation(projects.core.designSystem) implementation(projects.core.model) diff --git a/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultScreen.kt b/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultScreen.kt index e1fe8b70..2272dbb4 100644 --- a/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultScreen.kt +++ b/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultScreen.kt @@ -34,7 +34,7 @@ import androidx.navigation.NavOptions import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage import com.google.gson.Gson -import com.moneymong.moneymong.common.ext.base64ToFile +import com.moneymong.moneymong.android.util.base64ToFile import com.moneymong.moneymong.design_system.component.snackbar.MDSSnackbarHost import com.moneymong.moneymong.design_system.theme.Black import com.moneymong.moneymong.design_system.theme.Blue01 diff --git a/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultSideEffect.kt b/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultSideEffect.kt index 45690e88..aec5b0c9 100644 --- a/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultSideEffect.kt +++ b/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.ocr_result -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect import com.moneymong.moneymong.model.ocr.DocumentResponse sealed class OCRResultSideEffect : SideEffect { diff --git a/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultState.kt b/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultState.kt index 14b0e59a..b6e4d87c 100644 --- a/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultState.kt +++ b/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultState.kt @@ -1,11 +1,11 @@ package com.moneymong.moneymong.ocr_result -import com.moneymong.moneymong.common.base.State -import com.moneymong.moneymong.common.ext.toZonedDateTime -import com.moneymong.moneymong.common.ui.isValidPaymentDate -import com.moneymong.moneymong.common.ui.isValidPaymentTime -import com.moneymong.moneymong.common.ui.toWonFormat -import com.moneymong.moneymong.common.ui.validateValue +import com.moneymong.moneymong.android.State +import com.moneymong.moneymong.common.util.toZonedDateTime +import com.moneymong.moneymong.ui.isValidPaymentDate +import com.moneymong.moneymong.ui.isValidPaymentTime +import com.moneymong.moneymong.ui.toWonFormat +import com.moneymong.moneymong.ui.validateValue import com.moneymong.moneymong.model.ocr.DocumentResponse import com.moneymong.moneymong.model.ocr.DocumentResult import java.io.File diff --git a/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultViewModel.kt b/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultViewModel.kt index c1f7d5da..b4370385 100644 --- a/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultViewModel.kt +++ b/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/OCRResultViewModel.kt @@ -1,10 +1,8 @@ package com.moneymong.moneymong.ocr_result import android.content.SharedPreferences -import com.moneymong.moneymong.common.base.BaseViewModel -import com.moneymong.moneymong.common.event.Event -import com.moneymong.moneymong.common.event.EventTracker -import com.moneymong.moneymong.common.ext.toMultipart +import com.moneymong.moneymong.android.BaseViewModel +import com.moneymong.moneymong.android.util.toMultipart import com.moneymong.moneymong.domain.usecase.agency.FetchAgencyIdUseCase import com.moneymong.moneymong.domain.usecase.ledger.PostLedgerTransactionUseCase import com.moneymong.moneymong.domain.usecase.ocr.PostFileUploadUseCase @@ -23,7 +21,6 @@ import javax.inject.Inject @HiltViewModel class OCRResultViewModel @Inject constructor( - private val eventTracker: EventTracker, private val prefs: SharedPreferences, private val postLedgerTransactionUseCase: PostLedgerTransactionUseCase, private val postFileUploadUseCase: PostFileUploadUseCase, @@ -62,8 +59,6 @@ class OCRResultViewModel @Inject constructor( } fun postReceiptImage() = intent { - eventTracker.logEvent(Event.OCR_REGISTER_CLICK) - state.receiptFile?.let { if (!state.isLoading) { reduce { state.copy(isLoading = true) } @@ -98,7 +93,6 @@ class OCRResultViewModel @Inject constructor( // onClick fun onClickOCREdit() = intent { - eventTracker.logEvent(Event.OCR_MODIFY_CLICK) postSideEffect(OCRResultSideEffect.OCRResultNavigateToOCRDetail(state.document)) } } \ No newline at end of file diff --git a/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/view/OCRResultTopbarView.kt b/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/view/OCRResultTopbarView.kt index 1746421a..075226ee 100644 --- a/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/view/OCRResultTopbarView.kt +++ b/feature/ocr-result/src/main/java/com/moneymong/moneymong/ocr_result/view/OCRResultTopbarView.kt @@ -1,6 +1,5 @@ package com.moneymong.moneymong.ocr_result.view -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -14,7 +13,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.theme.Heading1 import com.moneymong.moneymong.design_system.theme.MMHorizontalSpacing diff --git a/feature/ocr/build.gradle.kts b/feature/ocr/build.gradle.kts index 59da8302..82ff31d3 100644 --- a/feature/ocr/build.gradle.kts +++ b/feature/ocr/build.gradle.kts @@ -10,6 +10,7 @@ android { } dependencies { + implementation(projects.core.android) implementation(projects.core.common) implementation(projects.core.model) implementation(projects.domain) diff --git a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRScreen.kt b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRScreen.kt index 8496cdbf..3f624d26 100644 --- a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRScreen.kt +++ b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRScreen.kt @@ -33,9 +33,9 @@ import com.moneymong.moneymong.design_system.component.modal.MDSModal import com.moneymong.moneymong.design_system.theme.Heading1 import com.moneymong.moneymong.design_system.theme.Mint03 import com.moneymong.moneymong.design_system.theme.White -import com.moneymong.moneymong.common.ext.hasPermission -import com.moneymong.moneymong.common.ui.noRippleClickable -import com.moneymong.moneymong.common.util.DisposableEffectWithLifeCycle +import com.moneymong.moneymong.android.util.hasPermission +import com.moneymong.moneymong.ui.noRippleClickable +import com.moneymong.moneymong.ui.util.DisposableEffectWithLifeCycle import com.moneymong.moneymong.design_system.error.ErrorDialog import com.moneymong.moneymong.design_system.theme.Black import com.moneymong.moneymong.ocr.view.OCRCameraPermissionDeniedView diff --git a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRSideEffect.kt b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRSideEffect.kt index ab353235..dd252e25 100644 --- a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRSideEffect.kt +++ b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.ocr -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect import com.moneymong.moneymong.model.ocr.DocumentResponse sealed class OCRSideEffect : SideEffect { diff --git a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRState.kt b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRState.kt index 4b709896..8466152e 100644 --- a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRState.kt +++ b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRState.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.ocr -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State import com.moneymong.moneymong.model.ocr.DocumentResponse import com.moneymong.moneymong.ocr.util.ModalType diff --git a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRViewModel.kt b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRViewModel.kt index 012d9194..2015fd79 100644 --- a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRViewModel.kt +++ b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/OCRViewModel.kt @@ -2,7 +2,7 @@ package com.moneymong.moneymong.ocr import android.content.SharedPreferences import androidx.core.content.edit -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.domain.usecase.ocr.DocumentOCRUseCase import com.moneymong.moneymong.domain.usecase.user.FetchDeniedCameraPermissionUseCase import com.moneymong.moneymong.domain.usecase.user.SaveDeniedCameraPermissionUseCase diff --git a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRCameraPermissionDeniedView.kt b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRCameraPermissionDeniedView.kt index b3a42767..ff20f820 100644 --- a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRCameraPermissionDeniedView.kt +++ b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRCameraPermissionDeniedView.kt @@ -5,7 +5,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.size import androidx.compose.material3.Text @@ -17,7 +16,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R.* import com.moneymong.moneymong.design_system.theme.Body3 import com.moneymong.moneymong.design_system.theme.Gray03 diff --git a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRCaptureView.kt b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRCaptureView.kt index 23144364..89f35dfb 100644 --- a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRCaptureView.kt +++ b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRCaptureView.kt @@ -8,19 +8,15 @@ import androidx.camera.core.ImageCapture import androidx.camera.core.ImageCaptureException import androidx.camera.view.LifecycleCameraController import androidx.camera.view.PreviewView -import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box 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.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold @@ -40,11 +36,9 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.core.content.ContextCompat -import com.moneymong.moneymong.common.ext.encodingBase64 +import com.moneymong.moneymong.android.util.encodingBase64 import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.theme.Black -import com.moneymong.moneymong.design_system.theme.Gray02 -import com.moneymong.moneymong.design_system.theme.Gray05 import com.moneymong.moneymong.design_system.theme.Gray10 import com.moneymong.moneymong.design_system.theme.Mint03 import com.moneymong.moneymong.ocr.util.bounceClick diff --git a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRHelperView.kt b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRHelperView.kt index 6f197315..d035971d 100644 --- a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRHelperView.kt +++ b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRHelperView.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.theme.Body4 import com.moneymong.moneymong.design_system.theme.Heading2 diff --git a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRTopbarView.kt b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRTopbarView.kt index 23a813aa..acb78977 100644 --- a/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRTopbarView.kt +++ b/feature/ocr/src/main/java/com/moneymong/moneymong/ocr/view/OCRTopbarView.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R.* import com.moneymong.moneymong.design_system.theme.Mint03 diff --git a/feature/sign/build.gradle.kts b/feature/sign/build.gradle.kts index 71c46f46..df23e10a 100644 --- a/feature/sign/build.gradle.kts +++ b/feature/sign/build.gradle.kts @@ -13,10 +13,12 @@ android { } dependencies { + implementation(projects.core.android) implementation(projects.core.designSystem) implementation(projects.core.common) implementation(projects.core.model) implementation(projects.core.network) + implementation(projects.core.ui) implementation(projects.domain) implementation(libs.androidx.core.ktx) diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/SignUpScreen.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/SignUpScreen.kt index c6b97c11..b9ee6a49 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/SignUpScreen.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/SignUpScreen.kt @@ -32,7 +32,7 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.component.selection.MDSSelection import com.moneymong.moneymong.design_system.component.textfield.MDSTextField diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/item/UnivItem.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/item/UnivItem.kt index 2a59d3b6..104c41ec 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/item/UnivItem.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/item/UnivItem.kt @@ -13,7 +13,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.theme.Black import com.moneymong.moneymong.design_system.theme.Blue04 diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/LoginSideEffect.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/LoginSideEffect.kt index cb69e27f..c674ca3c 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/LoginSideEffect.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/LoginSideEffect.kt @@ -1,7 +1,7 @@ package com.moneymong.moneymong.feature.sign.sideeffect -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect -sealed interface LoginSideEffect : SideEffect { +sealed interface LoginSideEffect : com.moneymong.moneymong.android.SideEffect { } \ No newline at end of file diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignCompleteSideEffect.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignCompleteSideEffect.kt index accbcb0e..85740349 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignCompleteSideEffect.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignCompleteSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.sign.sideeffect -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect -sealed interface SignCompleteSideEffect : SideEffect { +sealed interface SignCompleteSideEffect : com.moneymong.moneymong.android.SideEffect { } \ No newline at end of file diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignUpSideEffect.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignUpSideEffect.kt index 30ef0232..d6d93709 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignUpSideEffect.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignUpSideEffect.kt @@ -1,8 +1,8 @@ package com.moneymong.moneymong.feature.sign.sideeffect -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect -sealed class SignUpSideEffect : SideEffect { +sealed class SignUpSideEffect : com.moneymong.moneymong.android.SideEffect { data class CreateUniversityApi( val universityName : String, val grade: Int diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignUpUniversitySideEffect.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignUpUniversitySideEffect.kt index 4de12bf2..a4a3fc55 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignUpUniversitySideEffect.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SignUpUniversitySideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.sign.sideeffect -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect -sealed class SignUpUniversitySideEffect : SideEffect { +sealed class SignUpUniversitySideEffect : com.moneymong.moneymong.android.SideEffect { } \ No newline at end of file diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SplashSideEffect.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SplashSideEffect.kt index 3cb8b37c..a2adf97d 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SplashSideEffect.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/sideeffect/SplashSideEffect.kt @@ -1,6 +1,6 @@ package com.moneymong.moneymong.feature.sign.sideeffect -import com.moneymong.moneymong.common.base.SideEffect +import com.moneymong.moneymong.android.SideEffect -sealed interface SplashSideEffect : SideEffect { +sealed interface SplashSideEffect : com.moneymong.moneymong.android.SideEffect { } \ No newline at end of file diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/LoginState.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/LoginState.kt index 1af47a83..eeb43807 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/LoginState.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/LoginState.kt @@ -1,10 +1,10 @@ package com.moneymong.moneymong.feature.sign.state -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State data class LoginState( val isClickable: Boolean = false, val hasAnyAgency: Boolean? = null, val visibleError : Boolean = false, val errorMessage : String = "" -) : State \ No newline at end of file +) : com.moneymong.moneymong.android.State \ No newline at end of file diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignCompleteState.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignCompleteState.kt index 55725d40..1fef7073 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignCompleteState.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignCompleteState.kt @@ -1,7 +1,7 @@ package com.moneymong.moneymong.feature.sign.state -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State data class SignCompleteState ( val isCompleteBtnClicked : Boolean = false -) : State \ No newline at end of file +) : com.moneymong.moneymong.android.State \ No newline at end of file diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignUpState.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignUpState.kt index 1145e682..82d6b65f 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignUpState.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignUpState.kt @@ -3,7 +3,7 @@ package com.moneymong.moneymong.feature.sign.state import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State import com.moneymong.moneymong.feature.sign.util.AgencyType import com.moneymong.moneymong.feature.sign.util.Grade import com.moneymong.moneymong.model.sign.UniversitiesResponse @@ -39,4 +39,4 @@ data class SignUpState( val isButtonVisible : Boolean = false, - ) : State \ No newline at end of file + ) : com.moneymong.moneymong.android.State \ No newline at end of file diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignUpUniversityState.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignUpUniversityState.kt index d5f2053c..7f48784a 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignUpUniversityState.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SignUpUniversityState.kt @@ -3,7 +3,7 @@ package com.moneymong.moneymong.feature.sign.state import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State import com.moneymong.moneymong.feature.sign.util.AgencyType import com.moneymong.moneymong.model.sign.UniversitiesResponse @@ -32,4 +32,4 @@ data class SignUpUniversityState ( val isUnivCreated : Boolean = false, val isAgencyCreated : Boolean = false, -): State \ No newline at end of file +): com.moneymong.moneymong.android.State \ No newline at end of file diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SplashState.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SplashState.kt index 25290d82..93989097 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SplashState.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/state/SplashState.kt @@ -1,8 +1,8 @@ package com.moneymong.moneymong.feature.sign.state -import com.moneymong.moneymong.common.base.State +import com.moneymong.moneymong.android.State data class SplashState( val startAnimation: Boolean = false, val isTokenValid: Boolean? = null -) : State \ No newline at end of file +) : com.moneymong.moneymong.android.State \ No newline at end of file diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/view/SignUpUniversity.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/view/SignUpUniversity.kt index 3e6ea7c9..0403e004 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/view/SignUpUniversity.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/view/SignUpUniversity.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel -import com.moneymong.moneymong.common.ui.noRippleClickable +import com.moneymong.moneymong.ui.noRippleClickable import com.moneymong.moneymong.design_system.R import com.moneymong.moneymong.design_system.error.ErrorDialog import com.moneymong.moneymong.design_system.error.ErrorScreen diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/LoginViewModel.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/LoginViewModel.kt index 8d0a57d0..88fa0ac2 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/LoginViewModel.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/LoginViewModel.kt @@ -1,7 +1,7 @@ package com.moneymong.moneymong.feature.sign.viewmodel import androidx.lifecycle.viewModelScope -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.domain.usecase.agency.FetchMyAgencyListUseCase import com.moneymong.moneymong.domain.usecase.token.PostAccessTokenUseCase import com.moneymong.moneymong.feature.sign.sideeffect.LoginSideEffect diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignCompleteViewModel.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignCompleteViewModel.kt index 8f93c8d3..aa8ca0e8 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignCompleteViewModel.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignCompleteViewModel.kt @@ -1,15 +1,13 @@ package com.moneymong.moneymong.feature.sign.viewmodel -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.feature.sign.sideeffect.SignCompleteSideEffect import com.moneymong.moneymong.feature.sign.state.SignCompleteState import dagger.hilt.android.lifecycle.HiltViewModel -import org.orbitmvi.orbit.syntax.simple.intent -import org.orbitmvi.orbit.syntax.simple.reduce import javax.inject.Inject @HiltViewModel class SignCompleteViewModel @Inject constructor() : - BaseViewModel(SignCompleteState()) { + com.moneymong.moneymong.android.BaseViewModel(SignCompleteState()) { } \ No newline at end of file diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignUpUniversityViewModel.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignUpUniversityViewModel.kt index fe034780..d0b5396a 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignUpUniversityViewModel.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignUpUniversityViewModel.kt @@ -1,11 +1,9 @@ package com.moneymong.moneymong.feature.sign.viewmodel -import android.view.View import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.Dp -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.domain.usecase.agency.RegisterAgencyUseCase import com.moneymong.moneymong.domain.usecase.signup.SchoolInfoUseCase import com.moneymong.moneymong.domain.usecase.university.CreateUniversityUseCase @@ -29,7 +27,7 @@ class SignUpUniversityViewModel @Inject constructor( private val registerAgencyUseCase : RegisterAgencyUseCase, private val schoolInfoUseCase : SchoolInfoUseCase, private val searchUniversityUseCase: SearchUniversityUseCase -) : BaseViewModel(SignUpUniversityState()){ +) : com.moneymong.moneymong.android.BaseViewModel(SignUpUniversityState()){ fun searchUniv(searchQuery: String) = intent { searchUniversityUseCase(searchQuery) diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignUpViewModel.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignUpViewModel.kt index 45f4a460..cdb383cb 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignUpViewModel.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SignUpViewModel.kt @@ -3,7 +3,7 @@ package com.moneymong.moneymong.feature.sign.viewmodel import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.Dp import androidx.lifecycle.viewModelScope -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.domain.usecase.agency.RegisterAgencyUseCase import com.moneymong.moneymong.domain.usecase.signup.SchoolInfoUseCase import com.moneymong.moneymong.domain.usecase.university.CreateUniversityUseCase @@ -23,7 +23,7 @@ class SignUpViewModel @Inject constructor( private val createUniversityUseCase: CreateUniversityUseCase, private val registerAgencyUseCase: RegisterAgencyUseCase, private val schoolInfoUseCase: SchoolInfoUseCase, -) : BaseViewModel(SignUpState()) { +) : com.moneymong.moneymong.android.BaseViewModel(SignUpState()) { fun createUniv(universityName: String, grade: Int) = intent { val body = UnivRequest(universityName, grade) createUniversityUseCase(body) diff --git a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SplashViewModel.kt b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SplashViewModel.kt index 3ce6349c..347dd04c 100644 --- a/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SplashViewModel.kt +++ b/feature/sign/src/main/java/com/moneymong/moneymong/feature/sign/viewmodel/SplashViewModel.kt @@ -1,7 +1,7 @@ package com.moneymong.moneymong.feature.sign.viewmodel import android.util.Log -import com.moneymong.moneymong.common.base.BaseViewModel +import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.domain.usecase.token.TokenUseCase import com.moneymong.moneymong.feature.sign.sideeffect.SplashSideEffect import com.moneymong.moneymong.feature.sign.state.SplashState @@ -13,7 +13,7 @@ import javax.inject.Inject @HiltViewModel class SplashViewModel @Inject constructor( private val tokenUseCase: TokenUseCase -) : BaseViewModel( +) : com.moneymong.moneymong.android.BaseViewModel( SplashState() ) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0843f6f5..514e7592 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] accompanist = "0.32.0" -androidGradlePlugin = "8.1.3" +androidGradlePlugin = "8.6.1" androidTools = "31.1.3" androidxActivity = "1.8.0" androidxFragment = "1.5.5" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 676594e3..74068659 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Nov 22 20:57:53 KST 2023 +#Thu Aug 21 14:12:07 KST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index 1295ff85..f064f25c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,6 +22,8 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") include(":app") include(":data") include(":domain") +include(":core:analytics") +include(":core:android") include(":core:design-system") include(":core:ui") include(":core:common")