From 143d7da7bc6726cd9eebcb76777802838a17b29a Mon Sep 17 00:00:00 2001 From: oungsi2000 Date: Mon, 8 Dec 2025 16:56:49 +0900 Subject: [PATCH 1/5] =?UTF-8?q?chore:=20Ktlint=20Format=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/daedan/festabook/.gitkeep | 0 .../festabook/ExampleInstrumentedTest.kt | 24 ---- .../festabook/domain/model/PlaceCategory.kt | 2 +- .../presentation/common/AnimationUtil.kt | 2 +- .../presentation/common/FragmentUtil.kt | 3 +- .../presentation/common/ImageUtil.kt | 12 +- .../presentation/common/PermissionUtil.kt | 1 - .../presentation/error/ErrorActivity.kt | 8 +- .../presentation/explore/ExploreActivity.kt | 5 - .../presentation/explore/ExploreViewModel.kt | 1 - .../presentation/home/HomeViewModel.kt | 1 - .../home/adapter/PosterItemViewHolder.kt | 24 ++-- .../news/faq/component/FAQScreen.kt | 3 - .../news/lost/component/LostItemScreen.kt | 3 - .../news/notice/adapter/NewsClickListener.kt | 1 - .../news/notice/component/NoticeScreen.kt | 3 - .../placeDetail/PlaceDetailActivity.kt | 1 - .../placeDetail/PlaceDetailViewModel.kt | 9 +- .../adapter/PlaceImageViewPagerAdapter.kt | 2 - .../adapter/PlaceImageViewPagerViewHolder.kt | 20 +-- .../logging/PlaceDetailImageClick.kt | 4 +- .../logging/PlaceDetailImageSwipe.kt | 2 +- .../presentation/schedule/ScheduleFragment.kt | 9 +- .../schedule/ScheduleViewModel.kt | 5 +- .../schedule/adapter/ScheduleAdapter.kt | 1 - .../presentation/setting/SettingFragment.kt | 3 +- .../presentation/setting/SettingViewModel.kt | 1 - .../presentation/splash/SplashViewModel.kt | 1 - .../util/FestabookGlobalExceptionHandler.kt | 10 +- .../com/daedan/festabook/ExampleUnitTest.kt | 17 --- .../festabook/home/HomeViewModelTest.kt | 6 +- .../placeDetail/PlaceDetailTestFixture.kt | 13 +- .../placeList/PlaceLIstTestFixture.kt | 78 +++++------ .../placeList/PlaceListViewModelTest.kt | 40 +++--- .../placeList/PlaceMapViewModelTest.kt | 70 +++++----- .../schedule/ScheduleViewModelTest.kt | 72 ++++++----- .../festabook/setting/SettingViewModelTest.kt | 122 +++++++++--------- .../festabook/splash/SplashViewModelTest.kt | 15 +-- 38 files changed, 272 insertions(+), 322 deletions(-) create mode 100644 app/src/androidTest/java/com/daedan/festabook/.gitkeep delete mode 100644 app/src/androidTest/java/com/daedan/festabook/ExampleInstrumentedTest.kt delete mode 100644 app/src/test/java/com/daedan/festabook/ExampleUnitTest.kt diff --git a/app/src/androidTest/java/com/daedan/festabook/.gitkeep b/app/src/androidTest/java/com/daedan/festabook/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/src/androidTest/java/com/daedan/festabook/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/daedan/festabook/ExampleInstrumentedTest.kt deleted file mode 100644 index f3f80a9..0000000 --- a/app/src/androidTest/java/com/daedan/festabook/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.daedan.festabook - -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.daedan.festabook", appContext.packageName) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/daedan/festabook/domain/model/PlaceCategory.kt b/app/src/main/java/com/daedan/festabook/domain/model/PlaceCategory.kt index 6dbc68a..19a83f4 100644 --- a/app/src/main/java/com/daedan/festabook/domain/model/PlaceCategory.kt +++ b/app/src/main/java/com/daedan/festabook/domain/model/PlaceCategory.kt @@ -11,7 +11,7 @@ enum class PlaceCategory { PRIMARY, STAGE, PHOTO_BOOTH, - EXTRA + EXTRA, ; companion object { diff --git a/app/src/main/java/com/daedan/festabook/presentation/common/AnimationUtil.kt b/app/src/main/java/com/daedan/festabook/presentation/common/AnimationUtil.kt index eac13b8..9dcf867 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/common/AnimationUtil.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/common/AnimationUtil.kt @@ -26,4 +26,4 @@ fun ViewGroup.showBottomAnimation() { .setDuration(300) // 0.5초 동안 .setInterpolator(DecelerateInterpolator()) // 점점 느려지게 .start() -} \ No newline at end of file +} diff --git a/app/src/main/java/com/daedan/festabook/presentation/common/FragmentUtil.kt b/app/src/main/java/com/daedan/festabook/presentation/common/FragmentUtil.kt index 8d7c3f9..eb8df95 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/common/FragmentUtil.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/common/FragmentUtil.kt @@ -10,7 +10,6 @@ import android.util.TypedValue import android.view.View import android.view.ViewGroup import androidx.coordinatorlayout.widget.CoordinatorLayout -import androidx.core.os.BundleCompat.getSerializable import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment import com.daedan.festabook.R @@ -27,7 +26,7 @@ inline fun Bundle.getObject(key: String): T? = getParcelable(key) as? T } -inline fun Intent.getSerializableCompat(key: String):T? = +inline fun Intent.getSerializableCompat(key: String): T? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { getSerializableExtra(key, T::class.java) } else { diff --git a/app/src/main/java/com/daedan/festabook/presentation/common/ImageUtil.kt b/app/src/main/java/com/daedan/festabook/presentation/common/ImageUtil.kt index 9f5efba..34e6128 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/common/ImageUtil.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/common/ImageUtil.kt @@ -30,12 +30,12 @@ fun ImageView.loadImage( } } -fun String?.convertImageUrl() = if (this != null && this.startsWith("/images/")) { - BuildConfig.FESTABOOK_URL.removeSuffix("/api/") + this -} else { - this -} - +fun String?.convertImageUrl() = + if (this != null && this.startsWith("/images/")) { + BuildConfig.FESTABOOK_URL.removeSuffix("/api/") + this + } else { + this + } fun vectorToBitmap( context: Context, diff --git a/app/src/main/java/com/daedan/festabook/presentation/common/PermissionUtil.kt b/app/src/main/java/com/daedan/festabook/presentation/common/PermissionUtil.kt index bf71e75..7403fff 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/common/PermissionUtil.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/common/PermissionUtil.kt @@ -1,6 +1,5 @@ package com.daedan.festabook.presentation.common -import android.Manifest import android.content.Context import android.content.Intent import android.net.Uri diff --git a/app/src/main/java/com/daedan/festabook/presentation/error/ErrorActivity.kt b/app/src/main/java/com/daedan/festabook/presentation/error/ErrorActivity.kt index b27f064..11013a0 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/error/ErrorActivity.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/error/ErrorActivity.kt @@ -42,10 +42,14 @@ class ErrorActivity : AppCompatActivity() { companion object { private const val KEY_ERROR = "error" - fun newIntent(context: Context, error: Throwable): Intent = + + fun newIntent( + context: Context, + error: Throwable, + ): Intent = Intent(context, ErrorActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) putExtra(KEY_ERROR, error) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreActivity.kt b/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreActivity.kt index 52658ce..6734ed2 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreActivity.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreActivity.kt @@ -13,7 +13,6 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.widget.doOnTextChanged import androidx.lifecycle.ViewModelProvider -import com.daedan.festabook.FestaBookApp import com.daedan.festabook.R import com.daedan.festabook.databinding.ActivityExploreBinding import com.daedan.festabook.di.appGraph @@ -26,14 +25,10 @@ import com.daedan.festabook.presentation.explore.adapter.SearchResultAdapter import com.daedan.festabook.presentation.explore.model.SearchResultUiModel import com.daedan.festabook.presentation.main.MainActivity import com.google.android.material.textfield.TextInputLayout -import dev.zacsweers.metro.ContributesBinding -import dev.zacsweers.metro.ContributesTo -import dev.zacsweers.metro.Inject class ExploreActivity : AppCompatActivity(), OnUniversityClickListener { - override val defaultViewModelProviderFactory: ViewModelProvider.Factory get() = appGraph.metroViewModelFactory private val binding by lazy { ActivityExploreBinding.inflate(layoutInflater) } diff --git a/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt index 3b0df11..72f3f19 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.daedan.festabook.di.viewmodel.ViewModelKey -import com.daedan.festabook.di.viewmodel.ViewModelScope import com.daedan.festabook.domain.repository.ExploreRepository import com.daedan.festabook.presentation.common.SingleLiveData import com.daedan.festabook.presentation.explore.model.SearchResultUiModel diff --git a/app/src/main/java/com/daedan/festabook/presentation/home/HomeViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/home/HomeViewModel.kt index 85fb947..03f93a6 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/home/HomeViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.daedan.festabook.di.viewmodel.ViewModelKey -import com.daedan.festabook.di.viewmodel.ViewModelScope import com.daedan.festabook.domain.repository.FestivalRepository import com.daedan.festabook.presentation.common.SingleLiveData import com.daedan.festabook.presentation.home.adapter.FestivalUiState diff --git a/app/src/main/java/com/daedan/festabook/presentation/home/adapter/PosterItemViewHolder.kt b/app/src/main/java/com/daedan/festabook/presentation/home/adapter/PosterItemViewHolder.kt index a4118b6..6d78fae 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/home/adapter/PosterItemViewHolder.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/home/adapter/PosterItemViewHolder.kt @@ -19,19 +19,19 @@ import io.getstream.photoview.dialog.PhotoViewDialog class PosterItemViewHolder( private val binding: ItemHomePosterBinding, ) : RecyclerView.ViewHolder(binding.root) { - fun bind(url: String) { - val imageDialog = PhotoViewDialog.Builder( - context = binding.root.context, - images = listOf(url), - ) { imageView, url -> - imageView.load(url.convertImageUrl()) { - crossfade(true) - } - } - .withHiddenStatusBar(false) - .withTransitionFrom(binding.ivHomePoster) - .build() + val imageDialog = + PhotoViewDialog + .Builder( + context = binding.root.context, + images = listOf(url), + ) { imageView, url -> + imageView.load(url.convertImageUrl()) { + crossfade(true) + } + }.withHiddenStatusBar(false) + .withTransitionFrom(binding.ivHomePoster) + .build() binding.ivHomePoster.loadImage(url) { transformations(RoundedCornersTransformation(20f)) diff --git a/app/src/main/java/com/daedan/festabook/presentation/news/faq/component/FAQScreen.kt b/app/src/main/java/com/daedan/festabook/presentation/news/faq/component/FAQScreen.kt index 5738544..3f9908d 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/news/faq/component/FAQScreen.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/news/faq/component/FAQScreen.kt @@ -10,12 +10,9 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.daedan.festabook.R import com.daedan.festabook.presentation.common.component.EmptyStateScreen import com.daedan.festabook.presentation.common.component.LoadingStateScreen -import com.daedan.festabook.presentation.news.NewsViewModel import com.daedan.festabook.presentation.news.component.NewsItem import com.daedan.festabook.presentation.news.faq.FAQUiState import com.daedan.festabook.presentation.news.faq.model.FAQItemUiModel diff --git a/app/src/main/java/com/daedan/festabook/presentation/news/lost/component/LostItemScreen.kt b/app/src/main/java/com/daedan/festabook/presentation/news/lost/component/LostItemScreen.kt index 6272bd0..b97e7fc 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/news/lost/component/LostItemScreen.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/news/lost/component/LostItemScreen.kt @@ -20,14 +20,11 @@ import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.daedan.festabook.R import com.daedan.festabook.presentation.common.component.EmptyStateScreen import com.daedan.festabook.presentation.common.component.LoadingStateScreen import com.daedan.festabook.presentation.common.component.PULL_OFFSET_LIMIT import com.daedan.festabook.presentation.common.component.PullToRefreshContainer -import com.daedan.festabook.presentation.news.NewsViewModel import com.daedan.festabook.presentation.news.component.NewsItem import com.daedan.festabook.presentation.news.lost.LostUiState import com.daedan.festabook.presentation.news.lost.model.LostItemUiStatus diff --git a/app/src/main/java/com/daedan/festabook/presentation/news/notice/adapter/NewsClickListener.kt b/app/src/main/java/com/daedan/festabook/presentation/news/notice/adapter/NewsClickListener.kt index 3605888..975dca7 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/news/notice/adapter/NewsClickListener.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/news/notice/adapter/NewsClickListener.kt @@ -1,7 +1,6 @@ package com.daedan.festabook.presentation.news.notice.adapter import com.daedan.festabook.presentation.news.faq.model.FAQItemUiModel -import com.daedan.festabook.presentation.news.lost.model.LostUiModel import com.daedan.festabook.presentation.news.notice.model.NoticeUiModel interface NewsClickListener { diff --git a/app/src/main/java/com/daedan/festabook/presentation/news/notice/component/NoticeScreen.kt b/app/src/main/java/com/daedan/festabook/presentation/news/notice/component/NoticeScreen.kt index fbc2815..7de3160 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/news/notice/component/NoticeScreen.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/news/notice/component/NoticeScreen.kt @@ -15,14 +15,11 @@ import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.daedan.festabook.R import com.daedan.festabook.presentation.common.component.EmptyStateScreen import com.daedan.festabook.presentation.common.component.LoadingStateScreen import com.daedan.festabook.presentation.common.component.PULL_OFFSET_LIMIT import com.daedan.festabook.presentation.common.component.PullToRefreshContainer -import com.daedan.festabook.presentation.news.NewsViewModel import com.daedan.festabook.presentation.news.component.NewsItem import com.daedan.festabook.presentation.news.notice.NoticeUiState import com.daedan.festabook.presentation.news.notice.NoticeUiState.Companion.DEFAULT_POSITION diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/PlaceDetailActivity.kt b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/PlaceDetailActivity.kt index 0012b00..f61d63c 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/PlaceDetailActivity.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/PlaceDetailActivity.kt @@ -19,7 +19,6 @@ import com.daedan.festabook.logging.logger import com.daedan.festabook.presentation.common.getObject import com.daedan.festabook.presentation.common.showErrorSnackBar import com.daedan.festabook.presentation.news.faq.model.FAQItemUiModel -import com.daedan.festabook.presentation.news.lost.model.LostUiModel import com.daedan.festabook.presentation.news.notice.adapter.NewsClickListener import com.daedan.festabook.presentation.news.notice.adapter.NoticeAdapter import com.daedan.festabook.presentation.news.notice.model.NoticeUiModel diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/PlaceDetailViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/PlaceDetailViewModel.kt index 9453bf4..e03f4d8 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/PlaceDetailViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/PlaceDetailViewModel.kt @@ -83,11 +83,10 @@ class PlaceDetailViewModel @AssistedInject constructor( factory: Factory, place: PlaceUiModel?, receivedPlaceDetail: PlaceDetailUiModel?, - ) = - viewModelFactory { - initializer { - factory.create(place, receivedPlaceDetail) - } + ) = viewModelFactory { + initializer { + factory.create(place, receivedPlaceDetail) } + } } } diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/adapter/PlaceImageViewPagerAdapter.kt b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/adapter/PlaceImageViewPagerAdapter.kt index 06c804f..623e965 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/adapter/PlaceImageViewPagerAdapter.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/adapter/PlaceImageViewPagerAdapter.kt @@ -3,9 +3,7 @@ package com.daedan.festabook.presentation.placeDetail.adapter import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter -import com.daedan.festabook.presentation.common.loadImage import com.daedan.festabook.presentation.placeDetail.model.ImageUiModel -import io.getstream.photoview.dialog.PhotoViewDialog class PlaceImageViewPagerAdapter : ListAdapter(DIFF_UTIL_CALLBACK) { override fun onCreateViewHolder( diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/adapter/PlaceImageViewPagerViewHolder.kt b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/adapter/PlaceImageViewPagerViewHolder.kt index 580e826..8c509da 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/adapter/PlaceImageViewPagerViewHolder.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/adapter/PlaceImageViewPagerViewHolder.kt @@ -10,14 +10,15 @@ import io.getstream.photoview.dialog.PhotoViewDialog class PlaceImageViewPagerViewHolder( private val binding: ItemPlaceImageBinding, - private val images: List + private val images: List, ) : RecyclerView.ViewHolder(binding.root) { - private val imageDialogBuilder = PhotoViewDialog.Builder( - context = binding.root.context, - images = images.map { it.url } - ) { imageView, url -> - imageView.loadImage(url) - } + private val imageDialogBuilder = + PhotoViewDialog.Builder( + context = binding.root.context, + images = images.map { it.url }, + ) { imageView, url -> + imageView.loadImage(url) + } init { binding.ivPlaceImage.setOnClickListener { @@ -34,7 +35,10 @@ class PlaceImageViewPagerViewHolder( } companion object { - fun from(parent: ViewGroup, images: List): PlaceImageViewPagerViewHolder { + fun from( + parent: ViewGroup, + images: List, + ): PlaceImageViewPagerViewHolder { val layoutInflater = LayoutInflater.from(parent.context) val binding = ItemPlaceImageBinding.inflate(layoutInflater, parent, false) return PlaceImageViewPagerViewHolder(binding, images) diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/logging/PlaceDetailImageClick.kt b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/logging/PlaceDetailImageClick.kt index 999a2bd..55399b3 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/logging/PlaceDetailImageClick.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/logging/PlaceDetailImageClick.kt @@ -6,5 +6,5 @@ import kotlinx.parcelize.Parcelize @Parcelize data class PlaceDetailImageClick( override val baseLogData: BaseLogData.CommonLogData, - val index: Int -) : BaseLogData \ No newline at end of file + val index: Int, +) : BaseLogData diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/logging/PlaceDetailImageSwipe.kt b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/logging/PlaceDetailImageSwipe.kt index ac40e5b..15529d3 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeDetail/logging/PlaceDetailImageSwipe.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeDetail/logging/PlaceDetailImageSwipe.kt @@ -7,4 +7,4 @@ import kotlinx.parcelize.Parcelize data class PlaceDetailImageSwipe( override val baseLogData: BaseLogData.CommonLogData, val startIndex: Int, -) : BaseLogData \ No newline at end of file +) : BaseLogData diff --git a/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleFragment.kt index 5acec93..a19f181 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleFragment.kt @@ -15,7 +15,6 @@ import com.daedan.festabook.logging.model.schedule.ScheduleMenuItemReClickLogDat import com.daedan.festabook.presentation.common.BaseFragment import com.daedan.festabook.presentation.common.OnMenuItemReClickListener import com.daedan.festabook.presentation.common.showErrorSnackBar -import com.daedan.festabook.presentation.placeDetail.PlaceDetailViewModel import com.daedan.festabook.presentation.schedule.adapter.SchedulePagerAdapter import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator @@ -42,9 +41,11 @@ class ScheduleFragment : SchedulePagerAdapter(this) } - private val viewModel: ScheduleViewModel by viewModels { ScheduleViewModel.factory( - viewModelFactory - ) } + private val viewModel: ScheduleViewModel by viewModels { + ScheduleViewModel.factory( + viewModelFactory, + ) + } override fun onViewCreated( view: View, diff --git a/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleViewModel.kt index 2495957..3f969af 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleViewModel.kt @@ -4,18 +4,15 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory -import com.daedan.festabook.FestaBookApp import com.daedan.festabook.domain.repository.ScheduleRepository import com.daedan.festabook.presentation.schedule.model.ScheduleEventUiStatus import com.daedan.festabook.presentation.schedule.model.toUiModel import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedFactory import dev.zacsweers.metro.AssistedInject -import dev.zacsweers.metro.Inject import kotlinx.coroutines.launch import java.time.LocalDate @@ -96,7 +93,7 @@ class ScheduleViewModel @AssistedInject constructor( fun factory( factory: Factory, - dateId: Long = INVALID_ID + dateId: Long = INVALID_ID, ): ViewModelProvider.Factory = viewModelFactory { initializer { diff --git a/app/src/main/java/com/daedan/festabook/presentation/schedule/adapter/ScheduleAdapter.kt b/app/src/main/java/com/daedan/festabook/presentation/schedule/adapter/ScheduleAdapter.kt index c1e3720..50d6dd3 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/schedule/adapter/ScheduleAdapter.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/schedule/adapter/ScheduleAdapter.kt @@ -3,7 +3,6 @@ package com.daedan.festabook.presentation.schedule.adapter import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter -import com.daedan.festabook.presentation.schedule.OnBookmarkCheckedListener import com.daedan.festabook.presentation.schedule.model.ScheduleEventUiModel class ScheduleAdapter : ListAdapter(DIFF_UTIL) { diff --git a/app/src/main/java/com/daedan/festabook/presentation/setting/SettingFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/setting/SettingFragment.kt index 0547731..662cf8c 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/setting/SettingFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/setting/SettingFragment.kt @@ -90,8 +90,7 @@ class SettingFragment( binding.tvSettingAppVersionName.text = versionName } - override fun shouldShowPermissionRationale(permission: String): Boolean = - shouldShowRequestPermissionRationale(permission) + override fun shouldShowPermissionRationale(permission: String): Boolean = shouldShowRequestPermissionRationale(permission) private fun setupObservers() { settingViewModel.permissionCheckEvent.observe(viewLifecycleOwner) { diff --git a/app/src/main/java/com/daedan/festabook/presentation/setting/SettingViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/setting/SettingViewModel.kt index e73dbeb..7d0be09 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/setting/SettingViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/setting/SettingViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.daedan.festabook.di.viewmodel.ViewModelKey -import com.daedan.festabook.di.viewmodel.ViewModelScope import com.daedan.festabook.domain.repository.FestivalNotificationRepository import com.daedan.festabook.presentation.common.SingleLiveData import dev.zacsweers.metro.AppScope diff --git a/app/src/main/java/com/daedan/festabook/presentation/splash/SplashViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/splash/SplashViewModel.kt index 8f14947..98bf342 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/splash/SplashViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/splash/SplashViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.daedan.festabook.data.datasource.local.FestivalLocalDataSource import com.daedan.festabook.di.viewmodel.ViewModelKey -import com.daedan.festabook.di.viewmodel.ViewModelScope import com.daedan.festabook.presentation.common.SingleLiveData import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.ContributesIntoMap diff --git a/app/src/main/java/com/daedan/festabook/util/FestabookGlobalExceptionHandler.kt b/app/src/main/java/com/daedan/festabook/util/FestabookGlobalExceptionHandler.kt index 37469d2..b3cd2a4 100644 --- a/app/src/main/java/com/daedan/festabook/util/FestabookGlobalExceptionHandler.kt +++ b/app/src/main/java/com/daedan/festabook/util/FestabookGlobalExceptionHandler.kt @@ -2,18 +2,20 @@ package com.daedan.festabook.util import android.app.Application import android.os.Process -import com.daedan.festabook.logging.DefaultFirebaseLogger import com.daedan.festabook.presentation.error.ErrorActivity import kotlin.system.exitProcess class FestabookGlobalExceptionHandler( private val application: Application, ) : Thread.UncaughtExceptionHandler { - override fun uncaughtException(t: Thread, e: Throwable) { + override fun uncaughtException( + t: Thread, + e: Throwable, + ) { application.startActivity( - ErrorActivity.newIntent(application, e) + ErrorActivity.newIntent(application, e), ) Process.killProcess(Process.myPid()) exitProcess(-1) } -} \ No newline at end of file +} diff --git a/app/src/test/java/com/daedan/festabook/ExampleUnitTest.kt b/app/src/test/java/com/daedan/festabook/ExampleUnitTest.kt deleted file mode 100644 index e6ee186..0000000 --- a/app/src/test/java/com/daedan/festabook/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.daedan.festabook - -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/app/src/test/java/com/daedan/festabook/home/HomeViewModelTest.kt b/app/src/test/java/com/daedan/festabook/home/HomeViewModelTest.kt index 1c7ddf0..d44b7c3 100644 --- a/app/src/test/java/com/daedan/festabook/home/HomeViewModelTest.kt +++ b/app/src/test/java/com/daedan/festabook/home/HomeViewModelTest.kt @@ -129,14 +129,14 @@ class HomeViewModelTest { @Test fun `스케줄 이동 이벤트를 발생시킬 수 있다`() = runTest { - //given + // given val expect = Unit - //when + // when homeViewModel.navigateToScheduleClick() advanceUntilIdle() - //then + // then val actual = homeViewModel.navigateToScheduleEvent.value assertThat(actual).isEqualTo(expect) } diff --git a/app/src/test/java/com/daedan/festabook/placeDetail/PlaceDetailTestFixture.kt b/app/src/test/java/com/daedan/festabook/placeDetail/PlaceDetailTestFixture.kt index 7c6e0e7..6ef17fc 100644 --- a/app/src/test/java/com/daedan/festabook/placeDetail/PlaceDetailTestFixture.kt +++ b/app/src/test/java/com/daedan/festabook/placeDetail/PlaceDetailTestFixture.kt @@ -38,12 +38,13 @@ val FAKE_ETC_PLACE_DETAIL = imageUrl = null, description = null, location = null, - timeTags = listOf( - TimeTag( - timeTagId = 1, - name = "테스트1" - ) - ) + timeTags = + listOf( + TimeTag( + timeTagId = 1, + name = "테스트1", + ), + ), ), notices = emptyList(), host = null, diff --git a/app/src/test/java/com/daedan/festabook/placeList/PlaceLIstTestFixture.kt b/app/src/test/java/com/daedan/festabook/placeList/PlaceLIstTestFixture.kt index c24a1c8..c29339a 100644 --- a/app/src/test/java/com/daedan/festabook/placeList/PlaceLIstTestFixture.kt +++ b/app/src/test/java/com/daedan/festabook/placeList/PlaceLIstTestFixture.kt @@ -16,16 +16,17 @@ val FAKE_PLACES = title = "테스트 1", description = "설명 1", location = "위치 1", - timeTags = listOf( - TimeTag( - timeTagId = 1, - name = "테스트1" + timeTags = + listOf( + TimeTag( + timeTagId = 1, + name = "테스트1", + ), + TimeTag( + timeTagId = 2, + name = "테스트2", + ), ), - TimeTag( - timeTagId = 2, - name = "테스트2" - ) - ) ), Place( id = 2, @@ -34,12 +35,13 @@ val FAKE_PLACES = title = "테스트 2", description = "설명 2", location = "위치 2", - timeTags = listOf( - TimeTag( - timeTagId = 2, - name = "테스트2" + timeTags = + listOf( + TimeTag( + timeTagId = 2, + name = "테스트2", + ), ), - ) ), ) @@ -53,12 +55,13 @@ val FAKE_PLACE_GEOGRAPHIES = longitude = 1.0, ), "푸드트럭", - timeTags = listOf( - TimeTag( - timeTagId = 1, - name = "테스트1" - ) - ) + timeTags = + listOf( + TimeTag( + timeTagId = 1, + name = "테스트1", + ), + ), ), PlaceGeography( id = 1, @@ -68,12 +71,13 @@ val FAKE_PLACE_GEOGRAPHIES = longitude = 1.0, ), "부스", - timeTags = listOf( - TimeTag( - timeTagId = 1, - name = "테스트1" - ) - ) + timeTags = + listOf( + TimeTag( + timeTagId = 1, + name = "테스트1", + ), + ), ), PlaceGeography( id = 1, @@ -83,12 +87,13 @@ val FAKE_PLACE_GEOGRAPHIES = longitude = 1.0, ), "주점", - timeTags = listOf( - TimeTag( - timeTagId = 1, - name = "테스트1" - ) - ) + timeTags = + listOf( + TimeTag( + timeTagId = 1, + name = "테스트1", + ), + ), ), ) @@ -109,7 +114,8 @@ val FAKE_ORGANIZATION_GEOGRAPHY = ), ) -val FAKE_TIME_TAG = TimeTag( - timeTagId = 1, - name = "테스트1" -) +val FAKE_TIME_TAG = + TimeTag( + timeTagId = 1, + name = "테스트1", + ) diff --git a/app/src/test/java/com/daedan/festabook/placeList/PlaceListViewModelTest.kt b/app/src/test/java/com/daedan/festabook/placeList/PlaceListViewModelTest.kt index d2fa253..a2b098a 100644 --- a/app/src/test/java/com/daedan/festabook/placeList/PlaceListViewModelTest.kt +++ b/app/src/test/java/com/daedan/festabook/placeList/PlaceListViewModelTest.kt @@ -31,7 +31,7 @@ class PlaceListViewModelTest { val instantTaskExecutorRule = InstantTaskExecutorRule() private val testDispatcher = StandardTestDispatcher() private lateinit var placeListRepository: PlaceListRepository - private lateinit var PlaceListViewModel: PlaceListViewModel + private lateinit var placeListViewModel: PlaceListViewModel @Before fun setup() { @@ -46,7 +46,7 @@ class PlaceListViewModelTest { Result.success( FAKE_ORGANIZATION_GEOGRAPHY, ) - PlaceListViewModel = + placeListViewModel = PlaceListViewModel( placeListRepository, ) @@ -64,12 +64,12 @@ class PlaceListViewModelTest { coEvery { placeListRepository.getPlaces() } returns Result.success(FAKE_PLACES) // when - PlaceListViewModel = PlaceListViewModel(placeListRepository) + placeListViewModel = PlaceListViewModel(placeListRepository) advanceUntilIdle() // then val expected = FAKE_PLACES.map { it.toUiModel() } - val actual = PlaceListViewModel.places.getOrAwaitValue() + val actual = placeListViewModel.places.getOrAwaitValue() coVerify { placeListRepository.getPlaces() } assertThat(actual).isEqualTo(PlaceListUiState.PlaceLoaded(expected)) } @@ -80,17 +80,17 @@ class PlaceListViewModelTest { // given val targetCategories = listOf(PlaceCategoryUiModel.FOOD_TRUCK, PlaceCategoryUiModel.BOOTH) - PlaceListViewModel.updatePlacesByTimeTag(TimeTag.EMPTY.timeTagId) + placeListViewModel.updatePlacesByTimeTag(TimeTag.EMPTY.timeTagId) // when - PlaceListViewModel.updatePlacesByCategories(targetCategories) + placeListViewModel.updatePlacesByCategories(targetCategories) // then val expected = FAKE_PLACES .filter { it.category.toUiModel() in targetCategories } .map { it.toUiModel() } - val actual = PlaceListViewModel.places.getOrAwaitValue() + val actual = placeListViewModel.places.getOrAwaitValue() assertThat(actual).isEqualTo(PlaceListUiState.Success(expected)) } @@ -100,14 +100,14 @@ class PlaceListViewModelTest { // given val targetCategories = listOf(PlaceCategoryUiModel.SMOKING_AREA, PlaceCategoryUiModel.TOILET) - PlaceListViewModel.updatePlacesByTimeTag(TimeTag.EMPTY.timeTagId) + placeListViewModel.updatePlacesByTimeTag(TimeTag.EMPTY.timeTagId) // when - PlaceListViewModel.updatePlacesByCategories(targetCategories) + placeListViewModel.updatePlacesByCategories(targetCategories) // then val expected = FAKE_PLACES.map { it.toUiModel() } - val actual = PlaceListViewModel.places.getOrAwaitValue() + val actual = placeListViewModel.places.getOrAwaitValue() assertThat(actual).isEqualTo(PlaceListUiState.Success(expected)) } @@ -117,15 +117,15 @@ class PlaceListViewModelTest { // given val targetCategories = listOf(PlaceCategoryUiModel.FOOD_TRUCK, PlaceCategoryUiModel.BOOTH) - PlaceListViewModel.updatePlacesByTimeTag(TimeTag.EMPTY.timeTagId) - PlaceListViewModel.updatePlacesByCategories(targetCategories) + placeListViewModel.updatePlacesByTimeTag(TimeTag.EMPTY.timeTagId) + placeListViewModel.updatePlacesByCategories(targetCategories) // when - PlaceListViewModel.clearPlacesFilter() + placeListViewModel.clearPlacesFilter() // then val expected = FAKE_PLACES.map { it.toUiModel() } - val actual = PlaceListViewModel.places.getOrAwaitValue() + val actual = placeListViewModel.places.getOrAwaitValue() assertThat(actual).isEqualTo(PlaceListUiState.Success(expected)) } @@ -139,10 +139,10 @@ class PlaceListViewModelTest { ) // when - PlaceListViewModel.updatePlacesByTimeTag(1) + placeListViewModel.updatePlacesByTimeTag(1) // then - val actual = PlaceListViewModel.places.getOrAwaitValue() + val actual = placeListViewModel.places.getOrAwaitValue() assertThat(actual).isEqualTo(PlaceListUiState.Success(expected)) } @@ -154,10 +154,10 @@ class PlaceListViewModelTest { val emptyTimeTag = TimeTag.EMPTY // when - PlaceListViewModel.updatePlacesByTimeTag(emptyTimeTag.timeTagId) + placeListViewModel.updatePlacesByTimeTag(emptyTimeTag.timeTagId) // then - val actual = PlaceListViewModel.places.getOrAwaitValue() + val actual = placeListViewModel.places.getOrAwaitValue() assertThat(actual).isEqualTo(PlaceListUiState.Success(expected)) } @@ -168,10 +168,10 @@ class PlaceListViewModelTest { val expected = PlaceListUiState.Complete>() // when - PlaceListViewModel.setPlacesStateComplete() + placeListViewModel.setPlacesStateComplete() // then - val actual = PlaceListViewModel.places.getOrAwaitValue() + val actual = placeListViewModel.places.getOrAwaitValue() assertThat(actual).isInstanceOf(expected::class.java) } } diff --git a/app/src/test/java/com/daedan/festabook/placeList/PlaceMapViewModelTest.kt b/app/src/test/java/com/daedan/festabook/placeList/PlaceMapViewModelTest.kt index 903a073..2f8ba67 100644 --- a/app/src/test/java/com/daedan/festabook/placeList/PlaceMapViewModelTest.kt +++ b/app/src/test/java/com/daedan/festabook/placeList/PlaceMapViewModelTest.kt @@ -39,7 +39,7 @@ class PlaceMapViewModelTest { private val testDispatcher = StandardTestDispatcher() private lateinit var placeListRepository: PlaceListRepository private lateinit var placeDetailRepository: PlaceDetailRepository - private lateinit var PlaceMapViewModel: PlaceMapViewModel + private lateinit var placeMapViewModel: PlaceMapViewModel @Before fun setup() { @@ -61,7 +61,7 @@ class PlaceMapViewModelTest { FAKE_TIME_TAG, ), ) - PlaceMapViewModel = + placeMapViewModel = PlaceMapViewModel( placeListRepository, placeDetailRepository, @@ -77,13 +77,13 @@ class PlaceMapViewModelTest { fun `뷰모델을 생성했을 때 전체 타임 태그와 선택된 타임 태그를 불러올 수 있다`() = runTest { // given - when - PlaceMapViewModel = + placeMapViewModel = PlaceMapViewModel(placeListRepository, placeDetailRepository) advanceUntilIdle() // then - val actualAllTimeTag = PlaceMapViewModel.timeTags.getOrAwaitValue() - val actualSelectedTimeTag = PlaceMapViewModel.selectedTimeTag.getOrAwaitValue() + val actualAllTimeTag = placeMapViewModel.timeTags.value + val actualSelectedTimeTag = placeMapViewModel.selectedTimeTag.getOrAwaitValue() assertThat(actualAllTimeTag).isEqualTo(listOf(FAKE_TIME_TAG)) assertThat(actualSelectedTimeTag).isEqualTo(FAKE_TIME_TAG) } @@ -97,12 +97,12 @@ class PlaceMapViewModelTest { } returns Result.success(emptyList()) // when - PlaceMapViewModel = PlaceMapViewModel(placeListRepository, placeDetailRepository) + placeMapViewModel = PlaceMapViewModel(placeListRepository, placeDetailRepository) advanceUntilIdle() // then - val actualAllTimeTag = PlaceMapViewModel.timeTags.getOrAwaitValue() - val actualSelectedTimeTag = PlaceMapViewModel.selectedTimeTag.getOrAwaitValue() + val actualAllTimeTag = placeMapViewModel.timeTags.value + val actualSelectedTimeTag = placeMapViewModel.selectedTimeTag.getOrAwaitValue() assertThat(actualAllTimeTag).isEqualTo(emptyList()) assertThat(actualSelectedTimeTag).isEqualTo(TimeTag.EMPTY) } @@ -117,12 +117,12 @@ class PlaceMapViewModelTest { ) // when - PlaceMapViewModel = PlaceMapViewModel(placeListRepository, placeDetailRepository) + placeMapViewModel = PlaceMapViewModel(placeListRepository, placeDetailRepository) advanceUntilIdle() // then val expected = FAKE_PLACE_GEOGRAPHIES.map { it.toUiModel() } - val actual = PlaceMapViewModel.placeGeographies.getOrAwaitValue() + val actual = placeMapViewModel.placeGeographies.getOrAwaitValue() coVerify { placeListRepository.getPlaceGeographies() } assertThat(actual).isEqualTo(PlaceListUiState.Success(expected)) } @@ -137,12 +137,12 @@ class PlaceMapViewModelTest { ) // when - PlaceMapViewModel = PlaceMapViewModel(placeListRepository, placeDetailRepository) + placeMapViewModel = PlaceMapViewModel(placeListRepository, placeDetailRepository) advanceUntilIdle() // then val expected = FAKE_ORGANIZATION_GEOGRAPHY.toUiModel() - val actual = PlaceMapViewModel.initialMapSetting.getOrAwaitValue() + val actual = placeMapViewModel.initialMapSetting.getOrAwaitValue() assertThat(actual).isEqualTo(PlaceListUiState.Success(expected)) } @@ -159,16 +159,16 @@ class PlaceMapViewModelTest { coEvery { placeListRepository.getPlaceGeographies() } returns Result.failure(exception) // when - PlaceMapViewModel = PlaceMapViewModel(placeListRepository, placeDetailRepository) + placeMapViewModel = PlaceMapViewModel(placeListRepository, placeDetailRepository) advanceUntilIdle() // then val expected2 = PlaceListUiState.Success(FAKE_ORGANIZATION_GEOGRAPHY.toUiModel()) - val actual2 = PlaceMapViewModel.initialMapSetting.getOrAwaitValue() + val actual2 = placeMapViewModel.initialMapSetting.getOrAwaitValue() val expected3 = PlaceListUiState.Error(exception) - val actual3 = PlaceMapViewModel.placeGeographies.getOrAwaitValue() + val actual3 = placeMapViewModel.placeGeographies.getOrAwaitValue() assertThat(actual2).isEqualTo(expected2) assertThat(actual3).isEqualTo(expected3) @@ -184,14 +184,14 @@ class PlaceMapViewModelTest { ) // when - PlaceMapViewModel.selectPlace(1) + placeMapViewModel.selectPlace(1) advanceUntilIdle() // then coVerify { placeDetailRepository.getPlaceDetail(1) } val expected = SelectedPlaceUiState.Success(FAKE_PLACE_DETAIL.toUiModel()) - val actual = PlaceMapViewModel.selectedPlace.getOrAwaitValue() + val actual = placeMapViewModel.selectedPlace.getOrAwaitValue() assertThat(actual).isEqualTo(expected) } @@ -205,12 +205,12 @@ class PlaceMapViewModelTest { ) // when - PlaceMapViewModel.selectPlace(1) + placeMapViewModel.selectPlace(1) advanceUntilIdle() // then val expected = SelectedPlaceUiState.Success(FAKE_ETC_PLACE_DETAIL.toUiModel()) - val actual = PlaceMapViewModel.selectedPlace.getOrAwaitValue() + val actual = placeMapViewModel.selectedPlace.getOrAwaitValue() assertThat(actual).isEqualTo(expected) } @@ -222,16 +222,16 @@ class PlaceMapViewModelTest { Result.success( FAKE_PLACE_DETAIL, ) - PlaceMapViewModel.selectPlace(1) + placeMapViewModel.selectPlace(1) advanceUntilIdle() // when - PlaceMapViewModel.unselectPlace() + placeMapViewModel.unselectPlace() advanceUntilIdle() // then val expected = SelectedPlaceUiState.Empty - val actual = PlaceMapViewModel.selectedPlace.getOrAwaitValue() + val actual = placeMapViewModel.selectedPlace.getOrAwaitValue() assertThat(actual).isEqualTo(expected) } @@ -241,11 +241,11 @@ class PlaceMapViewModelTest { // given // when - PlaceMapViewModel.onBackToInitialPositionClicked() + placeMapViewModel.onBackToInitialPositionClicked() advanceUntilIdle() // then - val actual = PlaceMapViewModel.backToInitialPositionClicked.getOrAwaitValue() + val actual = placeMapViewModel.backToInitialPositionClicked.getOrAwaitValue() assertThat(actual).isInstanceOf(Event::class.java) } @@ -256,10 +256,10 @@ class PlaceMapViewModelTest { val isExceededMaxLength = true // when - PlaceMapViewModel.setIsExceededMaxLength(isExceededMaxLength) + placeMapViewModel.setIsExceededMaxLength(isExceededMaxLength) // then - val actual = PlaceMapViewModel.isExceededMaxLength.getOrAwaitValue() + val actual = placeMapViewModel.isExceededMaxLength.getOrAwaitValue() assertThat(actual).isEqualTo(isExceededMaxLength) } @@ -270,10 +270,10 @@ class PlaceMapViewModelTest { val categories = listOf(PlaceCategoryUiModel.FOOD_TRUCK, PlaceCategoryUiModel.BOOTH) // when - PlaceMapViewModel.setSelectedCategories(categories) + placeMapViewModel.setSelectedCategories(categories) // then - val actual = PlaceMapViewModel.selectedCategories.getOrAwaitValue() + val actual = placeMapViewModel.selectedCategories.getOrAwaitValue() assertThat(actual).isEqualTo(categories) } @@ -284,11 +284,11 @@ class PlaceMapViewModelTest { val expected = Unit // when - PlaceMapViewModel.onMapViewClick() + placeMapViewModel.onMapViewClick() advanceUntilIdle() // then - val actual = PlaceMapViewModel.onMapViewClick.getOrAwaitValue() + val actual = placeMapViewModel.onMapViewClick.getOrAwaitValue() assertThat(actual.peekContent()).isEqualTo(expected) } @@ -300,15 +300,15 @@ class PlaceMapViewModelTest { placeDetailRepository.getPlaceDetail(FAKE_PLACE_DETAIL.id) } returns Result.success(FAKE_PLACE_DETAIL) val expected = FAKE_PLACE_DETAIL.toUiModel() - PlaceMapViewModel.selectPlace(FAKE_PLACE_DETAIL.id) + placeMapViewModel.selectPlace(FAKE_PLACE_DETAIL.id) advanceUntilIdle() // when - PlaceMapViewModel.onExpandedStateReached() + placeMapViewModel.onExpandedStateReached() advanceUntilIdle() // then - val actual = PlaceMapViewModel.navigateToDetail.value + val actual = placeMapViewModel.navigateToDetail.value assertThat(actual).isEqualTo(expected) } @@ -319,11 +319,11 @@ class PlaceMapViewModelTest { val expected = TimeTag(1, "테스트1") // when - PlaceMapViewModel.onDaySelected(expected) + placeMapViewModel.onDaySelected(expected) advanceUntilIdle() // then - val actual = PlaceMapViewModel.selectedTimeTag.getOrAwaitValue() + val actual = placeMapViewModel.selectedTimeTag.getOrAwaitValue() assertThat(actual).isEqualTo(expected) } } diff --git a/app/src/test/java/com/daedan/festabook/schedule/ScheduleViewModelTest.kt b/app/src/test/java/com/daedan/festabook/schedule/ScheduleViewModelTest.kt index 4f9b09d..f663132 100644 --- a/app/src/test/java/com/daedan/festabook/schedule/ScheduleViewModelTest.kt +++ b/app/src/test/java/com/daedan/festabook/schedule/ScheduleViewModelTest.kt @@ -45,13 +45,13 @@ class ScheduleViewModelTest { scheduleRepository = mockk() coEvery { scheduleRepository.fetchAllScheduleDates() } returns - Result.success( - FAKE_SCHEDULE_DATES, - ) + Result.success( + FAKE_SCHEDULE_DATES, + ) coEvery { scheduleRepository.fetchScheduleEventsById(dateId) } returns - Result.success( - FAKE_SCHEDULE_EVENTS, - ) + Result.success( + FAKE_SCHEDULE_EVENTS, + ) scheduleViewModel = ScheduleViewModel(scheduleRepository, dateId) } @@ -87,9 +87,9 @@ class ScheduleViewModelTest { runTest { // given coEvery { scheduleRepository.fetchScheduleEventsById(dateId) } returns - Result.success( - FAKE_SCHEDULE_EVENTS, - ) + Result.success( + FAKE_SCHEDULE_EVENTS, + ) // when scheduleViewModel.loadScheduleByDate() @@ -109,18 +109,18 @@ class ScheduleViewModelTest { runTest { // given coEvery { scheduleRepository.fetchScheduleEventsById(dateId) } returns - Result.success( - listOf( - ScheduleEvent( - id = 1L, - status = ScheduleEventStatus.UPCOMING, - startTime = "2025-07-26T10:00:00", - endTime = "2025-07-26T11:00:00", - title = "안드로이드 스터디", - location = "서울 강남구 어딘가", - ), + Result.success( + listOf( + ScheduleEvent( + id = 1L, + status = ScheduleEventStatus.UPCOMING, + startTime = "2025-07-26T10:00:00", + endTime = "2025-07-26T11:00:00", + title = "안드로이드 스터디", + location = "서울 강남구 어딘가", ), - ) + ), + ) // when scheduleViewModel.loadScheduleByDate() @@ -150,25 +150,27 @@ class ScheduleViewModelTest { } @Test - fun `모든 날짜의 축제 정보를 불러올 수 있다`() = runTest { - //given - coEvery { scheduleRepository.fetchAllScheduleDates() } returns + fun `모든 날짜의 축제 정보를 불러올 수 있다`() = + runTest { + // given + coEvery { scheduleRepository.fetchAllScheduleDates() } returns Result.success( FAKE_SCHEDULE_DATES, ) - val expected = ScheduleDatesUiState.Success( - FAKE_SCHEDULE_DATES.map { it.toUiModel() }, - 0 - ) + val expected = + ScheduleDatesUiState.Success( + FAKE_SCHEDULE_DATES.map { it.toUiModel() }, + 0, + ) - //when - scheduleViewModel.loadAllDates() - advanceUntilIdle() + // when + scheduleViewModel.loadAllDates() + advanceUntilIdle() - //then - coVerify { scheduleRepository.fetchAllScheduleDates() } - val actual = scheduleViewModel.scheduleDatesUiState.getOrAwaitValue() - assertThat(actual).isEqualTo(expected) - } + // then + coVerify { scheduleRepository.fetchAllScheduleDates() } + val actual = scheduleViewModel.scheduleDatesUiState.getOrAwaitValue() + assertThat(actual).isEqualTo(expected) + } } diff --git a/app/src/test/java/com/daedan/festabook/setting/SettingViewModelTest.kt b/app/src/test/java/com/daedan/festabook/setting/SettingViewModelTest.kt index 72253a8..f8d2889 100644 --- a/app/src/test/java/com/daedan/festabook/setting/SettingViewModelTest.kt +++ b/app/src/test/java/com/daedan/festabook/setting/SettingViewModelTest.kt @@ -20,7 +20,6 @@ import org.junit.Before import org.junit.Rule import org.junit.Test - @OptIn(ExperimentalCoroutinesApi::class) class SettingViewModelTest { @get:Rule @@ -32,7 +31,6 @@ class SettingViewModelTest { private lateinit var festivalNotificationRepository: FestivalNotificationRepository - @Before fun setUp() { Dispatchers.setMain(testDispatcher) @@ -46,67 +44,71 @@ class SettingViewModelTest { } @Test - fun `알림 허용을 클릭했을 때 알림이 허용이 안되있다면 권한 요청 이벤트를 발생시킨다`() = runTest { - //given - coEvery { festivalNotificationRepository.getFestivalNotificationIsAllow() } returns false - val expected = Unit - - //when - settingViewModel = SettingViewModel(festivalNotificationRepository) - settingViewModel.notificationAllowClick() - advanceUntilIdle() - - //then - val actual = settingViewModel.permissionCheckEvent.value - assertThat(actual).isEqualTo(expected) - } + fun `알림 허용을 클릭했을 때 알림이 허용이 안되있다면 권한 요청 이벤트를 발생시킨다`() = + runTest { + // given + coEvery { festivalNotificationRepository.getFestivalNotificationIsAllow() } returns false + val expected = Unit + + // when + settingViewModel = SettingViewModel(festivalNotificationRepository) + settingViewModel.notificationAllowClick() + advanceUntilIdle() + + // then + val actual = settingViewModel.permissionCheckEvent.value + assertThat(actual).isEqualTo(expected) + } @Test - fun `알림 허용을 클릭했을 때 알림이 허용이 되있다면 알림id를 삭제한다`() = runTest { - //given - coEvery { festivalNotificationRepository.getFestivalNotificationIsAllow() } returns true - - //when - settingViewModel = SettingViewModel(festivalNotificationRepository) - settingViewModel.notificationAllowClick() - advanceUntilIdle() - - //then - val result = settingViewModel.isAllowed.getOrAwaitValue() - coVerify { festivalNotificationRepository.setFestivalNotificationIsAllow(false) } - coVerify { festivalNotificationRepository.deleteFestivalNotification() } - assertThat(result).isFalse() - } + fun `알림 허용을 클릭했을 때 알림이 허용이 되있다면 알림id를 삭제한다`() = + runTest { + // given + coEvery { festivalNotificationRepository.getFestivalNotificationIsAllow() } returns true + + // when + settingViewModel = SettingViewModel(festivalNotificationRepository) + settingViewModel.notificationAllowClick() + advanceUntilIdle() + + // then + val result = settingViewModel.isAllowed.getOrAwaitValue() + coVerify { festivalNotificationRepository.setFestivalNotificationIsAllow(false) } + coVerify { festivalNotificationRepository.deleteFestivalNotification() } + assertThat(result).isFalse() + } @Test - fun `알림 허용을 클릭했을 때 서버에 알림 정보 저장에 실패하면 이전 상태로 원복한다`() = runTest { - //given - coEvery { festivalNotificationRepository.getFestivalNotificationIsAllow() } returns true - coEvery { festivalNotificationRepository.deleteFestivalNotification() } returns Result.failure(Throwable()) - - //when - settingViewModel = SettingViewModel(festivalNotificationRepository) - settingViewModel.notificationAllowClick() - advanceUntilIdle() - - //then - val result = settingViewModel.isAllowed.getOrAwaitValue() - coVerify { festivalNotificationRepository.setFestivalNotificationIsAllow(true) } - assertThat(result).isTrue() - } + fun `알림 허용을 클릭했을 때 서버에 알림 정보 저장에 실패하면 이전 상태로 원복한다`() = + runTest { + // given + coEvery { festivalNotificationRepository.getFestivalNotificationIsAllow() } returns true + coEvery { festivalNotificationRepository.deleteFestivalNotification() } returns Result.failure(Throwable()) + + // when + settingViewModel = SettingViewModel(festivalNotificationRepository) + settingViewModel.notificationAllowClick() + advanceUntilIdle() + + // then + val result = settingViewModel.isAllowed.getOrAwaitValue() + coVerify { festivalNotificationRepository.setFestivalNotificationIsAllow(true) } + assertThat(result).isTrue() + } @Test - fun `알림을 허용했을 때 서버에 알림 정보 삭제에 실패하면 이전 상태로 원복한다`() = runTest { - //given - coEvery { festivalNotificationRepository.saveFestivalNotification() } returns Result.failure(Throwable()) - - //when - settingViewModel.saveNotificationId() - advanceUntilIdle() - - //then - val result = settingViewModel.isAllowed.getOrAwaitValue() - coVerify { festivalNotificationRepository.setFestivalNotificationIsAllow(false) } - assertThat(result).isFalse() - } -} \ No newline at end of file + fun `알림을 허용했을 때 서버에 알림 정보 삭제에 실패하면 이전 상태로 원복한다`() = + runTest { + // given + coEvery { festivalNotificationRepository.saveFestivalNotification() } returns Result.failure(Throwable()) + + // when + settingViewModel.saveNotificationId() + advanceUntilIdle() + + // then + val result = settingViewModel.isAllowed.getOrAwaitValue() + coVerify { festivalNotificationRepository.setFestivalNotificationIsAllow(false) } + assertThat(result).isFalse() + } +} diff --git a/app/src/test/java/com/daedan/festabook/splash/SplashViewModelTest.kt b/app/src/test/java/com/daedan/festabook/splash/SplashViewModelTest.kt index ebab4bf..a60dc18 100644 --- a/app/src/test/java/com/daedan/festabook/splash/SplashViewModelTest.kt +++ b/app/src/test/java/com/daedan/festabook/splash/SplashViewModelTest.kt @@ -19,7 +19,6 @@ import org.junit.Before import org.junit.Rule import org.junit.Test - @OptIn(ExperimentalCoroutinesApi::class) class SplashViewModelTest { @get:Rule @@ -44,15 +43,15 @@ class SplashViewModelTest { @Test fun `뷰모델을 생성할 때 현재 접속한 대학교가 있다면 MainActivity로 이동한다`() = runTest { - //given + // given coEvery { festivalLocalDataSource.getFestivalId() } returns 1 val expected = NavigationState.NavigateToMain(1) - //when + // when splashViewModel = SplashViewModel(festivalLocalDataSource) advanceUntilIdle() - //then + // then val actual = splashViewModel.navigationState.value assertThat(actual).isEqualTo(expected) } @@ -60,16 +59,16 @@ class SplashViewModelTest { @Test fun `뷰모델을 생성할 때 현재 접속한 대학교가 없다면 ExploreActivity로 이동한다`() = runTest { - //given + // given coEvery { festivalLocalDataSource.getFestivalId() } returns null val expected = NavigationState.NavigateToExplore - //when + // when splashViewModel = SplashViewModel(festivalLocalDataSource) advanceUntilIdle() - //then + // then val actual = splashViewModel.navigationState.value assertThat(actual).isEqualTo(expected) } -} \ No newline at end of file +} From 26c2f1896a9399d54be6965da77d98e72883a28a Mon Sep 17 00:00:00 2001 From: oungsi2000 Date: Mon, 8 Dec 2025 17:12:10 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor(DI):=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=20=EC=A3=BC=EC=9E=85=20=EC=8B=9C=20@Inject=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=A1=B0=EC=A0=95=20=EB=B0=8F=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 전반적인 코드 베이스에서 Metro DI와 관련된 생성자 주입 스타일을 통일하고 일부 코드를 정리했습니다. - **생성자 주입 스타일 통일:** - `@Inject constructor(...)` 형식으로 작성된 모든 클래스의 생성자 주입 코드를 `@Inject class ... (...)` 형식으로 변경하여 어노테이션 위치를 클래스 선언부로 통일했습니다. 이는 코드 가독성을 높이고 일관된 스타일을 유지하기 위함입니다. - 대상 파일: `DataSource`, `Repository`, `ViewModel`, `Fragment`, `Interceptor`, `Factory` 등 다수의 클래스 - **`FragmentUtil.kt` 코드 정리:** - 더 이상 사용되지 않는 `getObject(key: String)` 확장 함수를 삭제했습니다. - API 33(Android 13, UPSIDE_DOWN_CAKE) 미만 버전에서 `getSerializableExtra`, `getParcelableExtra` 등을 호출할 때 발생하는 `DEPRECATION` 경고를 억제하기 위해 `@Suppress("DEPRECATION")` 어노테이션을 추가했습니다. --- .../datasource/local/DeviceLocalDataSourceImpl.kt | 3 ++- .../data/datasource/local/FcmDataSourceImpl.kt | 3 ++- .../datasource/local/FestivalLocalDataSourceImpl.kt | 3 ++- .../local/FestivalNotificationLocalDataSourceImpl.kt | 3 ++- .../datasource/remote/device/DeviceDataSourceImpl.kt | 3 ++- .../data/datasource/remote/faq/FAQDataSourceImpl.kt | 3 ++- .../remote/festival/FestivalDataSourceImpl.kt | 3 ++- .../festival/FestivalNotificationDataSourceImpl.kt | 3 ++- .../datasource/remote/lineup/LineupDataSourceImpl.kt | 3 ++- .../remote/lostitem/LostItemDataSourceImpl.kt | 3 ++- .../datasource/remote/notice/NoticeDataSourceImpl.kt | 3 ++- .../datasource/remote/place/PlaceDataSourceImpl.kt | 3 ++- .../remote/schedule/ScheduleDataSourceImpl.kt | 3 ++- .../festabook/data/repository/DeviceRepositoryImpl.kt | 3 ++- .../data/repository/ExploreRepositoryImpl.kt | 3 ++- .../festabook/data/repository/FAQRepositoryImpl.kt | 3 ++- .../repository/FestivalNotificationRepositoryImpl.kt | 3 ++- .../data/repository/FestivalRepositoryImpl.kt | 3 ++- .../data/repository/LostItemRepositoryImpl.kt | 3 ++- .../festabook/data/repository/NoticeRepositoryImpl.kt | 3 ++- .../data/repository/PlaceDetailRepositoryImpl.kt | 3 ++- .../data/repository/PlaceListRepositoryImpl.kt | 3 ++- .../data/repository/ScheduleRepositoryImpl.kt | 3 ++- .../data/service/api/FestaBookAuthInterceptor.kt | 3 ++- .../festabook/di/fragment/MetroFragmentFactory.kt | 3 ++- .../festabook/di/viewmodel/MetroViewModelFactory.kt | 3 ++- .../daedan/festabook/logging/DefaultFirebaseLogger.kt | 3 ++- .../daedan/festabook/logging/FirebaseAnalyticsTree.kt | 3 ++- .../festabook/presentation/common/FragmentUtil.kt | 11 +++-------- .../presentation/explore/ExploreViewModel.kt | 3 ++- .../festabook/presentation/home/HomeFragment.kt | 3 ++- .../festabook/presentation/home/HomeViewModel.kt | 3 ++- .../festabook/presentation/main/MainViewModel.kt | 3 ++- .../presentation/placeMap/PlaceMapViewModel.kt | 3 ++- .../placeMap/placeList/PlaceListViewModel.kt | 3 ++- .../presentation/setting/SettingViewModel.kt | 3 ++- .../festabook/presentation/splash/SplashViewModel.kt | 3 ++- 37 files changed, 75 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/local/DeviceLocalDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/local/DeviceLocalDataSourceImpl.kt index bfa7e40..bd01077 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/local/DeviceLocalDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/local/DeviceLocalDataSourceImpl.kt @@ -7,7 +7,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class DeviceLocalDataSourceImpl @Inject constructor( +@Inject +class DeviceLocalDataSourceImpl( private val prefs: SharedPreferences, ) : DeviceLocalDataSource { override fun saveUuid(uuid: String) { diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/local/FcmDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/local/FcmDataSourceImpl.kt index f552787..90bd7ff 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/local/FcmDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/local/FcmDataSourceImpl.kt @@ -7,7 +7,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class FcmDataSourceImpl @Inject constructor( +@Inject +class FcmDataSourceImpl constructor( private val prefs: SharedPreferences, ) : FcmDataSource { override fun saveFcmToken(token: String) { diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/local/FestivalLocalDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/local/FestivalLocalDataSourceImpl.kt index ddeca35..3718ba6 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/local/FestivalLocalDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/local/FestivalLocalDataSourceImpl.kt @@ -7,7 +7,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class FestivalLocalDataSourceImpl @Inject constructor( +@Inject +class FestivalLocalDataSourceImpl( private val prefs: SharedPreferences, ) : FestivalLocalDataSource { override fun saveFestivalId(festivalId: Long) { diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/local/FestivalNotificationLocalDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/local/FestivalNotificationLocalDataSourceImpl.kt index 0b63778..5264242 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/local/FestivalNotificationLocalDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/local/FestivalNotificationLocalDataSourceImpl.kt @@ -7,7 +7,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class FestivalNotificationLocalDataSourceImpl @Inject constructor( +@Inject +class FestivalNotificationLocalDataSourceImpl( private val prefs: SharedPreferences, ) : FestivalNotificationLocalDataSource { override fun saveFestivalNotificationId( diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/remote/device/DeviceDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/remote/device/DeviceDataSourceImpl.kt index b6d6e18..9a29146 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/remote/device/DeviceDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/remote/device/DeviceDataSourceImpl.kt @@ -9,7 +9,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class DeviceDataSourceImpl @Inject constructor( +@Inject +class DeviceDataSourceImpl( private val deviceService: DeviceService, ) : DeviceDataSource { override suspend fun registerDevice( diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/remote/faq/FAQDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/remote/faq/FAQDataSourceImpl.kt index 0f49402..7d1152f 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/remote/faq/FAQDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/remote/faq/FAQDataSourceImpl.kt @@ -8,7 +8,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class FAQDataSourceImpl @Inject constructor( +@Inject +class FAQDataSourceImpl( private val faqService: FAQService, ) : FAQDataSource { override suspend fun fetchAllFAQs(): ApiResult> = ApiResult.toApiResult { faqService.fetchAllFAQs() } diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/remote/festival/FestivalDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/remote/festival/FestivalDataSourceImpl.kt index fba1fd2..921da7e 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/remote/festival/FestivalDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/remote/festival/FestivalDataSourceImpl.kt @@ -9,7 +9,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class FestivalDataSourceImpl @Inject constructor( +@Inject +class FestivalDataSourceImpl( private val festivalService: FestivalService, ) : FestivalDataSource { override suspend fun fetchFestival(): ApiResult = diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/remote/festival/FestivalNotificationDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/remote/festival/FestivalNotificationDataSourceImpl.kt index cc85a09..64bfcb7 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/remote/festival/FestivalNotificationDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/remote/festival/FestivalNotificationDataSourceImpl.kt @@ -9,7 +9,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class FestivalNotificationDataSourceImpl @Inject constructor( +@Inject +class FestivalNotificationDataSourceImpl( private val festivalNotificationService: FestivalNotificationService, ) : FestivalNotificationDataSource { override suspend fun saveFestivalNotification( diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/remote/lineup/LineupDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/remote/lineup/LineupDataSourceImpl.kt index 6491d8b..e06b5fe 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/remote/lineup/LineupDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/remote/lineup/LineupDataSourceImpl.kt @@ -8,7 +8,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class LineupDataSourceImpl @Inject constructor( +@Inject +class LineupDataSourceImpl( private val festivalLineupService: FestivalLineupService, ) : LineupDataSource { override suspend fun fetchLineup(): ApiResult> = diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/remote/lostitem/LostItemDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/remote/lostitem/LostItemDataSourceImpl.kt index 3cebfbe..0d7c149 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/remote/lostitem/LostItemDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/remote/lostitem/LostItemDataSourceImpl.kt @@ -10,7 +10,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class LostItemDataSourceImpl @Inject constructor( +@Inject +class LostItemDataSourceImpl( private val lostItemService: LostItemService, private val festivalService: FestivalService, ) : LostItemDataSource { diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/remote/notice/NoticeDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/remote/notice/NoticeDataSourceImpl.kt index 185443a..f6ec0e6 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/remote/notice/NoticeDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/remote/notice/NoticeDataSourceImpl.kt @@ -8,7 +8,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class NoticeDataSourceImpl @Inject constructor( +@Inject +class NoticeDataSourceImpl( private val noticeService: NoticeService, ) : NoticeDataSource { override suspend fun fetchNotices(): ApiResult = ApiResult.toApiResult { noticeService.getNotices() } diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/remote/place/PlaceDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/remote/place/PlaceDataSourceImpl.kt index 8096e96..a181beb 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/remote/place/PlaceDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/remote/place/PlaceDataSourceImpl.kt @@ -13,7 +13,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class PlaceDataSourceImpl @Inject constructor( +@Inject +class PlaceDataSourceImpl( private val placeService: PlaceService, private val festivalService: FestivalService, ) : PlaceDataSource { diff --git a/app/src/main/java/com/daedan/festabook/data/datasource/remote/schedule/ScheduleDataSourceImpl.kt b/app/src/main/java/com/daedan/festabook/data/datasource/remote/schedule/ScheduleDataSourceImpl.kt index d720139..65cdb0f 100644 --- a/app/src/main/java/com/daedan/festabook/data/datasource/remote/schedule/ScheduleDataSourceImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/datasource/remote/schedule/ScheduleDataSourceImpl.kt @@ -9,7 +9,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class ScheduleDataSourceImpl @Inject constructor( +@Inject +class ScheduleDataSourceImpl( private val scheduleService: ScheduleService, ) : ScheduleDataSource { override suspend fun fetchScheduleEventsById(eventDateId: Long): ApiResult> = diff --git a/app/src/main/java/com/daedan/festabook/data/repository/DeviceRepositoryImpl.kt b/app/src/main/java/com/daedan/festabook/data/repository/DeviceRepositoryImpl.kt index 015fd97..603e913 100644 --- a/app/src/main/java/com/daedan/festabook/data/repository/DeviceRepositoryImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/repository/DeviceRepositoryImpl.kt @@ -10,7 +10,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class DeviceRepositoryImpl @Inject constructor( +@Inject +class DeviceRepositoryImpl( private val deviceDataSource: DeviceDataSource, private val deviceLocalDataSource: DeviceLocalDataSource, private val fcmDataSource: FcmDataSource, diff --git a/app/src/main/java/com/daedan/festabook/data/repository/ExploreRepositoryImpl.kt b/app/src/main/java/com/daedan/festabook/data/repository/ExploreRepositoryImpl.kt index 5a503bb..322e86d 100644 --- a/app/src/main/java/com/daedan/festabook/data/repository/ExploreRepositoryImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/repository/ExploreRepositoryImpl.kt @@ -12,7 +12,8 @@ import dev.zacsweers.metro.Inject import timber.log.Timber @ContributesBinding(AppScope::class) -class ExploreRepositoryImpl @Inject constructor( +@Inject +class ExploreRepositoryImpl( private val festivalDataSource: FestivalDataSource, private val festivalLocalDataSource: FestivalLocalDataSource, ) : ExploreRepository { diff --git a/app/src/main/java/com/daedan/festabook/data/repository/FAQRepositoryImpl.kt b/app/src/main/java/com/daedan/festabook/data/repository/FAQRepositoryImpl.kt index 907afea..070aff6 100644 --- a/app/src/main/java/com/daedan/festabook/data/repository/FAQRepositoryImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/repository/FAQRepositoryImpl.kt @@ -10,7 +10,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class FAQRepositoryImpl @Inject constructor( +@Inject +class FAQRepositoryImpl( private val faqDataSource: FAQDataSource, ) : FAQRepository { override suspend fun getAllFAQ(): Result> { diff --git a/app/src/main/java/com/daedan/festabook/data/repository/FestivalNotificationRepositoryImpl.kt b/app/src/main/java/com/daedan/festabook/data/repository/FestivalNotificationRepositoryImpl.kt index 5dc1c36..4f842fa 100644 --- a/app/src/main/java/com/daedan/festabook/data/repository/FestivalNotificationRepositoryImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/repository/FestivalNotificationRepositoryImpl.kt @@ -12,7 +12,8 @@ import dev.zacsweers.metro.Inject import timber.log.Timber @ContributesBinding(AppScope::class) -class FestivalNotificationRepositoryImpl @Inject constructor( +@Inject +class FestivalNotificationRepositoryImpl( private val festivalNotificationDataSource: FestivalNotificationDataSource, private val deviceLocalDataSource: DeviceLocalDataSource, private val festivalNotificationLocalDataSource: FestivalNotificationLocalDataSource, diff --git a/app/src/main/java/com/daedan/festabook/data/repository/FestivalRepositoryImpl.kt b/app/src/main/java/com/daedan/festabook/data/repository/FestivalRepositoryImpl.kt index b087578..b1cc30f 100644 --- a/app/src/main/java/com/daedan/festabook/data/repository/FestivalRepositoryImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/repository/FestivalRepositoryImpl.kt @@ -15,7 +15,8 @@ import dev.zacsweers.metro.Inject import java.time.LocalDate @ContributesBinding(AppScope::class) -class FestivalRepositoryImpl @Inject constructor( +@Inject +class FestivalRepositoryImpl( private val festivalDataSource: FestivalDataSource, private val festivalLocalDataSource: FestivalLocalDataSource, private val lineupDataSource: LineupDataSource, diff --git a/app/src/main/java/com/daedan/festabook/data/repository/LostItemRepositoryImpl.kt b/app/src/main/java/com/daedan/festabook/data/repository/LostItemRepositoryImpl.kt index c080a51..10a3356 100644 --- a/app/src/main/java/com/daedan/festabook/data/repository/LostItemRepositoryImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/repository/LostItemRepositoryImpl.kt @@ -13,7 +13,8 @@ import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope @ContributesBinding(AppScope::class) -class LostItemRepositoryImpl @Inject constructor( +@Inject +class LostItemRepositoryImpl( private val lostItemDataSource: LostItemDataSource, ) : LostItemRepository { override suspend fun getPendingLostItems(): Result> = diff --git a/app/src/main/java/com/daedan/festabook/data/repository/NoticeRepositoryImpl.kt b/app/src/main/java/com/daedan/festabook/data/repository/NoticeRepositoryImpl.kt index c673e91..c2ef585 100644 --- a/app/src/main/java/com/daedan/festabook/data/repository/NoticeRepositoryImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/repository/NoticeRepositoryImpl.kt @@ -10,7 +10,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class NoticeRepositoryImpl @Inject constructor( +@Inject +class NoticeRepositoryImpl( private val noticeDataSource: NoticeDataSource, ) : NoticeRepository { override suspend fun fetchNotices(): Result> { diff --git a/app/src/main/java/com/daedan/festabook/data/repository/PlaceDetailRepositoryImpl.kt b/app/src/main/java/com/daedan/festabook/data/repository/PlaceDetailRepositoryImpl.kt index cac14b3..eb0fda1 100644 --- a/app/src/main/java/com/daedan/festabook/data/repository/PlaceDetailRepositoryImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/repository/PlaceDetailRepositoryImpl.kt @@ -10,7 +10,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class PlaceDetailRepositoryImpl @Inject constructor( +@Inject +class PlaceDetailRepositoryImpl( private val placeDataSource: PlaceDataSource, ) : PlaceDetailRepository { override suspend fun getPlaceDetail(placeId: Long): Result { diff --git a/app/src/main/java/com/daedan/festabook/data/repository/PlaceListRepositoryImpl.kt b/app/src/main/java/com/daedan/festabook/data/repository/PlaceListRepositoryImpl.kt index eedca07..ac2631f 100644 --- a/app/src/main/java/com/daedan/festabook/data/repository/PlaceListRepositoryImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/repository/PlaceListRepositoryImpl.kt @@ -14,7 +14,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class PlaceListRepositoryImpl @Inject constructor( +@Inject +class PlaceListRepositoryImpl( private val placeDataSource: PlaceDataSource, ) : PlaceListRepository { override suspend fun getTimeTags(): Result> { diff --git a/app/src/main/java/com/daedan/festabook/data/repository/ScheduleRepositoryImpl.kt b/app/src/main/java/com/daedan/festabook/data/repository/ScheduleRepositoryImpl.kt index 4bb9c24..eb8a2ca 100644 --- a/app/src/main/java/com/daedan/festabook/data/repository/ScheduleRepositoryImpl.kt +++ b/app/src/main/java/com/daedan/festabook/data/repository/ScheduleRepositoryImpl.kt @@ -11,7 +11,8 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject @ContributesBinding(AppScope::class) -class ScheduleRepositoryImpl @Inject constructor( +@Inject +class ScheduleRepositoryImpl( private val scheduleDataSource: ScheduleDataSource, ) : ScheduleRepository { override suspend fun fetchAllScheduleDates(): Result> { diff --git a/app/src/main/java/com/daedan/festabook/data/service/api/FestaBookAuthInterceptor.kt b/app/src/main/java/com/daedan/festabook/data/service/api/FestaBookAuthInterceptor.kt index acbbe8a..1bbbdc9 100644 --- a/app/src/main/java/com/daedan/festabook/data/service/api/FestaBookAuthInterceptor.kt +++ b/app/src/main/java/com/daedan/festabook/data/service/api/FestaBookAuthInterceptor.kt @@ -9,7 +9,8 @@ import okhttp3.Response import timber.log.Timber @ContributesBinding(AppScope::class) -class FestaBookAuthInterceptor @Inject constructor( +@Inject +class FestaBookAuthInterceptor( private val festivalLocalDataSource: FestivalLocalDataSource, ) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { diff --git a/app/src/main/java/com/daedan/festabook/di/fragment/MetroFragmentFactory.kt b/app/src/main/java/com/daedan/festabook/di/fragment/MetroFragmentFactory.kt index d0a3bed..8e6d51b 100644 --- a/app/src/main/java/com/daedan/festabook/di/fragment/MetroFragmentFactory.kt +++ b/app/src/main/java/com/daedan/festabook/di/fragment/MetroFragmentFactory.kt @@ -9,7 +9,8 @@ import dev.zacsweers.metro.Provider import kotlin.reflect.KClass @ContributesBinding(AppScope::class) -class MetroFragmentFactory @Inject constructor( +@Inject +class MetroFragmentFactory( private val creators: Map, Provider>, ) : FragmentFactory() { override fun instantiate( diff --git a/app/src/main/java/com/daedan/festabook/di/viewmodel/MetroViewModelFactory.kt b/app/src/main/java/com/daedan/festabook/di/viewmodel/MetroViewModelFactory.kt index 8f380ea..a353511 100644 --- a/app/src/main/java/com/daedan/festabook/di/viewmodel/MetroViewModelFactory.kt +++ b/app/src/main/java/com/daedan/festabook/di/viewmodel/MetroViewModelFactory.kt @@ -10,7 +10,8 @@ import dev.zacsweers.metro.Provider import kotlin.reflect.KClass @ContributesBinding(AppScope::class) -class MetroViewModelFactory @Inject constructor( +@Inject +class MetroViewModelFactory( private val creators: Map, Provider>, ) : ViewModelProvider.Factory { @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") diff --git a/app/src/main/java/com/daedan/festabook/logging/DefaultFirebaseLogger.kt b/app/src/main/java/com/daedan/festabook/logging/DefaultFirebaseLogger.kt index 1319e6c..a80e840 100644 --- a/app/src/main/java/com/daedan/festabook/logging/DefaultFirebaseLogger.kt +++ b/app/src/main/java/com/daedan/festabook/logging/DefaultFirebaseLogger.kt @@ -16,7 +16,8 @@ import kotlinx.coroutines.tasks.await import java.time.LocalDateTime @SingleIn(AppScope::class) -class DefaultFirebaseLogger @Inject constructor( +@Inject +class DefaultFirebaseLogger( private val firebaseAnalytics: FirebaseAnalytics, private val festivalLocalDataSource: FestivalLocalDataSource, private val festivalNotificationLocalDataSource: FestivalNotificationLocalDataSource, diff --git a/app/src/main/java/com/daedan/festabook/logging/FirebaseAnalyticsTree.kt b/app/src/main/java/com/daedan/festabook/logging/FirebaseAnalyticsTree.kt index 0c8b578..58370b8 100644 --- a/app/src/main/java/com/daedan/festabook/logging/FirebaseAnalyticsTree.kt +++ b/app/src/main/java/com/daedan/festabook/logging/FirebaseAnalyticsTree.kt @@ -10,7 +10,8 @@ import timber.log.Timber import java.util.Locale @ContributesBinding(AppScope::class) -class FirebaseAnalyticsTree @Inject constructor( +@Inject +class FirebaseAnalyticsTree( private val analytics: FirebaseAnalytics, ) : Timber.Tree() { override fun log( diff --git a/app/src/main/java/com/daedan/festabook/presentation/common/FragmentUtil.kt b/app/src/main/java/com/daedan/festabook/presentation/common/FragmentUtil.kt index eb8df95..cee1165 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/common/FragmentUtil.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/common/FragmentUtil.kt @@ -4,7 +4,6 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.os.Build -import android.os.Bundle import android.os.Parcelable import android.util.TypedValue import android.view.View @@ -19,17 +18,11 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.snackbar.Snackbar import java.io.Serializable -inline fun Bundle.getObject(key: String): T? = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - getParcelable(key, T::class.java) - } else { - getParcelable(key) as? T - } - inline fun Intent.getSerializableCompat(key: String): T? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { getSerializableExtra(key, T::class.java) } else { + @Suppress("DEPRECATION") getSerializableExtra(key) as? T } @@ -37,6 +30,7 @@ inline fun Intent.getObject(key: String): T? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { getParcelableExtra(key, T::class.java) } else { + @Suppress("DEPRECATION") getParcelableExtra(key) as? T } @@ -55,6 +49,7 @@ fun View.getSystemBarHeightCompat() = WindowInsetsCompat.Type.systemBars(), ).bottom } else { + @Suppress("DEPRECATION") rootWindowInsets.systemWindowInsetBottom } diff --git a/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt index 72f3f19..c9f1f74 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt @@ -21,7 +21,8 @@ import timber.log.Timber @ContributesIntoMap(AppScope::class) @ViewModelKey(ExploreViewModel::class) -class ExploreViewModel @Inject constructor( +@Inject +class ExploreViewModel( private val exploreRepository: ExploreRepository, ) : ViewModel() { private val searchQuery = MutableStateFlow("") diff --git a/app/src/main/java/com/daedan/festabook/presentation/home/HomeFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/home/HomeFragment.kt index 2b0b834..0416e81 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/home/HomeFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/home/HomeFragment.kt @@ -31,7 +31,8 @@ import timber.log.Timber @ContributesIntoMap(scope = AppScope::class, binding = binding()) @FragmentKey(HomeFragment::class) -class HomeFragment @Inject constructor( +@Inject +class HomeFragment( private val centerItemMotionEnlarger: RecyclerView.OnScrollListener, ) : BaseFragment() { override val layoutId: Int = R.layout.fragment_home diff --git a/app/src/main/java/com/daedan/festabook/presentation/home/HomeViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/home/HomeViewModel.kt index 03f93a6..5f0e991 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/home/HomeViewModel.kt @@ -15,7 +15,8 @@ import kotlinx.coroutines.launch @ContributesIntoMap(AppScope::class) @ViewModelKey(HomeViewModel::class) -class HomeViewModel @Inject constructor( +@Inject +class HomeViewModel( private val festivalRepository: FestivalRepository, ) : ViewModel() { private val _festivalUiState = MutableLiveData() diff --git a/app/src/main/java/com/daedan/festabook/presentation/main/MainViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/main/MainViewModel.kt index a97d8f0..32c0fb4 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/main/MainViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/main/MainViewModel.kt @@ -17,7 +17,8 @@ import timber.log.Timber @ContributesIntoMap(AppScope::class) @ViewModelKey(MainViewModel::class) -class MainViewModel @Inject constructor( +@Inject +class MainViewModel( private val deviceRepository: DeviceRepository, festivalRepository: FestivalRepository, ) : ViewModel() { diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeMap/PlaceMapViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/placeMap/PlaceMapViewModel.kt index 0cf4241..c20e13f 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeMap/PlaceMapViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeMap/PlaceMapViewModel.kt @@ -31,7 +31,8 @@ import kotlinx.coroutines.launch @ContributesIntoMap(AppScope::class) @ViewModelKey(PlaceMapViewModel::class) -class PlaceMapViewModel @Inject constructor( +@Inject +class PlaceMapViewModel( private val placeListRepository: PlaceListRepository, private val placeDetailRepository: PlaceDetailRepository, ) : ViewModel() { diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeList/PlaceListViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeList/PlaceListViewModel.kt index 7704b83..95fd917 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeList/PlaceListViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeList/PlaceListViewModel.kt @@ -19,7 +19,8 @@ import kotlinx.coroutines.launch @ContributesIntoMap(AppScope::class) @ViewModelKey(PlaceListViewModel::class) -class PlaceListViewModel @Inject constructor( +@Inject +class PlaceListViewModel( private val placeListRepository: PlaceListRepository, ) : ViewModel() { private var cachedPlaces = listOf() diff --git a/app/src/main/java/com/daedan/festabook/presentation/setting/SettingViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/setting/SettingViewModel.kt index 7d0be09..917ad46 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/setting/SettingViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/setting/SettingViewModel.kt @@ -15,7 +15,8 @@ import timber.log.Timber @ContributesIntoMap(AppScope::class) @ViewModelKey(SettingViewModel::class) -class SettingViewModel @Inject constructor( +@Inject +class SettingViewModel( private val festivalNotificationRepository: FestivalNotificationRepository, ) : ViewModel() { private val _permissionCheckEvent: SingleLiveData = SingleLiveData() diff --git a/app/src/main/java/com/daedan/festabook/presentation/splash/SplashViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/splash/SplashViewModel.kt index 98bf342..e307c8a 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/splash/SplashViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/splash/SplashViewModel.kt @@ -13,7 +13,8 @@ import timber.log.Timber @ContributesIntoMap(AppScope::class) @ViewModelKey(SplashViewModel::class) -class SplashViewModel @Inject constructor( +@Inject +class SplashViewModel( private val festivalLocalDataSource: FestivalLocalDataSource, ) : ViewModel() { private val _navigationState = SingleLiveData() From 3cc1f0feb35f1fb4755768a3714efc3f4531a8aa Mon Sep 17 00:00:00 2001 From: oungsi2000 Date: Mon, 8 Dec 2025 17:45:28 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor(DI):=20=ED=94=84=EB=9E=98=EA=B7=B8?= =?UTF-8?q?=EB=A8=BC=ED=8A=B8=EC=9D=98=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=20=EB=B0=A9=EC=8B=9D=EC=9D=84=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=EC=A3=BC=EC=9E=85=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존에 `@Inject` 어노테이션을 사용하여 필드로 주입받던 `ViewModelProvider.Factory` 및 기타 의존성들을 프래그먼트의 생성자를 통해 주입하도록 리팩토링했습니다. 이를 통해 의존성 주입 시점을 명확히 하고, 불변성(immutability)을 확보하여 코드의 안정성을 높였습니다. - **대상 프래그먼트:** - `HomeFragment` - `PlaceCategoryFragment` - `PlaceDetailPreviewFragment` - `PlaceDetailPreviewSecondaryFragment` - `PlaceListFragment` - `PlaceMapFragment` - `ScheduleFragment` - `SettingFragment` - **`ExploreViewModel.kt` 수정:** - `debounce` 사용을 위해 필요한 `@FlowPreview` 어노테이션을 클래스 레벨에 추가했습니다. --- .../festabook/presentation/explore/ExploreViewModel.kt | 2 ++ .../daedan/festabook/presentation/home/HomeFragment.kt | 3 +-- .../festabook/presentation/placeMap/PlaceMapFragment.kt | 4 +--- .../placeMap/placeCategory/PlaceCategoryFragment.kt | 6 +++--- .../placeDetailPreview/PlaceDetailPreviewFragment.kt | 8 +++----- .../PlaceDetailPreviewSecondaryFragment.kt | 7 +++---- .../presentation/placeMap/placeList/PlaceListFragment.kt | 8 +++----- .../festabook/presentation/schedule/ScheduleFragment.kt | 7 +++---- .../festabook/presentation/setting/SettingFragment.kt | 4 +--- 9 files changed, 20 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt b/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt index c9f1f74..c3f92b7 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/explore/ExploreViewModel.kt @@ -12,6 +12,7 @@ import com.daedan.festabook.presentation.explore.model.toUiModel import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.ContributesIntoMap import dev.zacsweers.metro.Inject +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.debounce @@ -19,6 +20,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import timber.log.Timber +@OptIn(FlowPreview::class) @ContributesIntoMap(AppScope::class) @ViewModelKey(ExploreViewModel::class) @Inject diff --git a/app/src/main/java/com/daedan/festabook/presentation/home/HomeFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/home/HomeFragment.kt index 0416e81..26ac90a 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/home/HomeFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/home/HomeFragment.kt @@ -34,11 +34,10 @@ import timber.log.Timber @Inject class HomeFragment( private val centerItemMotionEnlarger: RecyclerView.OnScrollListener, + override val defaultViewModelProviderFactory: ViewModelProvider.Factory, ) : BaseFragment() { override val layoutId: Int = R.layout.fragment_home - @Inject - override lateinit var defaultViewModelProviderFactory: ViewModelProvider.Factory private val viewModel: HomeViewModel by viewModels({ requireActivity() }) private val posterAdapter: PosterAdapter by lazy { diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeMap/PlaceMapFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/placeMap/PlaceMapFragment.kt index 773b642..53b5778 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeMap/PlaceMapFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeMap/PlaceMapFragment.kt @@ -63,13 +63,11 @@ class PlaceMapFragment( placeCategoryFragment: PlaceCategoryFragment, placeDetailPreviewSecondaryFragment: PlaceDetailPreviewSecondaryFragment, mapFragment: MapFragment, + override val defaultViewModelProviderFactory: ViewModelProvider.Factory, ) : BaseFragment(), OnMenuItemReClickListener { override val layoutId: Int = R.layout.fragment_place_map - @Inject - override lateinit var defaultViewModelProviderFactory: ViewModelProvider.Factory - private lateinit var naverMap: NaverMap private val placeListFragment by lazy { getIfExists(placeListFragment) } diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeCategory/PlaceCategoryFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeCategory/PlaceCategoryFragment.kt index 44db4b8..91e932c 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeCategory/PlaceCategoryFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeCategory/PlaceCategoryFragment.kt @@ -23,11 +23,11 @@ import dev.zacsweers.metro.binding @ContributesIntoMap(scope = AppScope::class, binding = binding()) @FragmentKey(PlaceCategoryFragment::class) @Inject -class PlaceCategoryFragment : BaseFragment() { +class PlaceCategoryFragment( + override val defaultViewModelProviderFactory: ViewModelProvider.Factory, +) : BaseFragment() { override val layoutId: Int = R.layout.fragment_place_category - @Inject - override lateinit var defaultViewModelProviderFactory: ViewModelProvider.Factory private val viewModel: PlaceMapViewModel by viewModels({ requireParentFragment() }) override fun onViewCreated( diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeDetailPreview/PlaceDetailPreviewFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeDetailPreview/PlaceDetailPreviewFragment.kt index 474ca06..6e7e29d 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeDetailPreview/PlaceDetailPreviewFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeDetailPreview/PlaceDetailPreviewFragment.kt @@ -29,13 +29,11 @@ import dev.zacsweers.metro.binding @ContributesIntoMap(scope = AppScope::class, binding = binding()) @FragmentKey(PlaceDetailPreviewFragment::class) @Inject -class PlaceDetailPreviewFragment : - BaseFragment(), +class PlaceDetailPreviewFragment( + override val defaultViewModelProviderFactory: ViewModelProvider.Factory, +) : BaseFragment(), OnMenuItemReClickListener { override val layoutId: Int = R.layout.fragment_place_detail_preview - - @Inject - override lateinit var defaultViewModelProviderFactory: ViewModelProvider.Factory private val viewModel: PlaceMapViewModel by viewModels({ requireParentFragment() }) private val backPressedCallback = object : OnBackPressedCallback(false) { diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeDetailPreview/PlaceDetailPreviewSecondaryFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeDetailPreview/PlaceDetailPreviewSecondaryFragment.kt index 58fb7cc..684f6bd 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeDetailPreview/PlaceDetailPreviewSecondaryFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeDetailPreview/PlaceDetailPreviewSecondaryFragment.kt @@ -29,13 +29,12 @@ import dev.zacsweers.metro.binding @ContributesIntoMap(scope = AppScope::class, binding = binding()) @FragmentKey(PlaceDetailPreviewSecondaryFragment::class) @Inject -class PlaceDetailPreviewSecondaryFragment : - BaseFragment(), +class PlaceDetailPreviewSecondaryFragment( + override val defaultViewModelProviderFactory: ViewModelProvider.Factory, +) : BaseFragment(), OnMenuItemReClickListener { override val layoutId: Int = R.layout.fragment_place_detail_preview_secondary - @Inject - override lateinit var defaultViewModelProviderFactory: ViewModelProvider.Factory private val viewModel: PlaceMapViewModel by viewModels({ requireParentFragment() }) private val backPressedCallback = object : OnBackPressedCallback(true) { diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeList/PlaceListFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeList/PlaceListFragment.kt index 8c17bcf..650fb19 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeList/PlaceListFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeMap/placeList/PlaceListFragment.kt @@ -54,15 +54,13 @@ import timber.log.Timber @ContributesIntoMap(scope = AppScope::class, binding = binding()) @FragmentKey(PlaceListFragment::class) @Inject -class PlaceListFragment : - BaseFragment(), +class PlaceListFragment( + override val defaultViewModelProviderFactory: ViewModelProvider.Factory, +) : BaseFragment(), OnPlaceClickListener, OnMenuItemReClickListener, OnMapReadyCallback { override val layoutId: Int = R.layout.fragment_place_list - - @Inject - override lateinit var defaultViewModelProviderFactory: ViewModelProvider.Factory private val viewModel: PlaceMapViewModel by viewModels({ requireParentFragment() }) private val childViewModel: PlaceListViewModel by viewModels() diff --git a/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleFragment.kt index a19f181..f8d256b 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/schedule/ScheduleFragment.kt @@ -30,13 +30,12 @@ import timber.log.Timber ) @FragmentKey(ScheduleFragment::class) @Inject -class ScheduleFragment : - BaseFragment(), +class ScheduleFragment( + private val viewModelFactory: ScheduleViewModel.Factory, +) : BaseFragment(), OnMenuItemReClickListener { override val layoutId: Int = R.layout.fragment_schedule - @Inject - private lateinit var viewModelFactory: ScheduleViewModel.Factory private val adapter: SchedulePagerAdapter by lazy { SchedulePagerAdapter(this) } diff --git a/app/src/main/java/com/daedan/festabook/presentation/setting/SettingFragment.kt b/app/src/main/java/com/daedan/festabook/presentation/setting/SettingFragment.kt index 662cf8c..a315674 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/setting/SettingFragment.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/setting/SettingFragment.kt @@ -35,12 +35,10 @@ import timber.log.Timber @Inject class SettingFragment( private val notificationPermissionManagerFactory: NotificationPermissionManager.Factory, + override val defaultViewModelProviderFactory: ViewModelProvider.Factory, ) : BaseFragment(), NotificationPermissionRequester { override val layoutId: Int = R.layout.fragment_setting - - @Inject - override lateinit var defaultViewModelProviderFactory: ViewModelProvider.Factory private val settingViewModel: SettingViewModel by viewModels({ requireActivity() }) private val homeViewModel: HomeViewModel by viewModels({ requireActivity() }) From fe76e140bd1210fdaaca68925f470929d0da0514 Mon Sep 17 00:00:00 2001 From: oungsi2000 Date: Mon, 8 Dec 2025 18:14:12 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor(theme):=20CompositionLocal?= =?UTF-8?q?=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=97=AC=20=ED=85=8C?= =?UTF-8?q?=EB=A7=88=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20=ED=99=95=EC=9E=A5=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Compose 환경의 테마 시스템(`FestabookTheme`)을 확장하여, 기존에 객체(`object`)로 정의되었던 `FestabookColor`와 `FestabookTypography`를 `CompositionLocalProvider`를 통해 주입하도록 구조를 변경했습니다. 이를 통해 테마 값에 대한 접근 방식을 통일하고 재사용성을 높였습니다. - **`FestabookTheme.kt` 수정:** - `CompositionLocalProvider`에 `LocalColor`와 `LocalTypography`를 추가하여, 하위 컴포저블에서 `FestabookColor`와 `FestabookTypography`를 통해 테마의 색상과 타이포그래피에 접근할 수 있도록 설정했습니다. - **`FestabookColor.kt` 리팩토링:** - 기존의 `object FestabookColor`를 `data class FestabookColorPalette`로 변경했습니다. - `staticCompositionLocalOf`를 사용하여 `LocalColor`를 정의하고, `@Composable` `get()` 프로퍼티인 `FestabookColor`를 통해 테마 색상에 접근하도록 수정했습니다. - **`FestabookTypography.kt` 리팩토링:** - 기존의 `val FestabookTypography`를 `FestabookTypographies`로 이름을 변경했습니다. - `staticCompositionLocalOf`로 `LocalTypography`를 정의하고, `@Composable` `get()` 프로퍼티인 `FestabookTypography`를 추가하여 테마 타이포그래피에 접근할 수 있도록 개선했습니다. - **`FestabookSpacing.kt` & `FestabookShapes.kt` 수정:** - `get()` 프로퍼티에 `@ReadOnlyComposable` 어노테이션을 추가하여 컴포지션 최적화를 개선했습니다. - **`themes.xml` 수정:** - `android:windowBackground` 값을 `@color/gray050`에서 하드코딩된 `#FAFAFA`로 변경하여, 새로운 테마 시스템의 색상 값(`white`)과 일치시켰습니다. --- .../presentation/theme/FestabookColor.kt | 38 +++++++++++-------- .../presentation/theme/FestabookShapes.kt | 5 ++- .../presentation/theme/FestabookSpacing.kt | 5 ++- .../presentation/theme/FestabookTheme.kt | 15 ++++++-- .../presentation/theme/FestabookTypography.kt | 12 +++++- app/src/main/res/values/themes.xml | 5 ++- 6 files changed, 57 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookColor.kt b/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookColor.kt index 4f870a9..da3ce46 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookColor.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookColor.kt @@ -1,21 +1,29 @@ package com.daedan.festabook.presentation.theme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.graphics.Color -object FestabookColor { - val black = Color(0xFF1B1B1B) - val gray800 = Color(0xFF393939) - val gray700 = Color(0xFF555555) - val gray600 = Color(0xFF717171) - val gray500 = Color(0xFF8E8E8E) - val gray400 = Color(0xFFAAAAAA) - val gray300 = Color(0xFFC6C6C6) - val gray200 = Color(0xFFE3E3E3) - val gray100 = Color(0xFFF7F7F7) - val white = Color(0xFFFAFAFA) +data class FestabookColorPalette( + val black: Color = Color(0xFF1B1B1B), + val gray800: Color = Color(0xFF393939), + val gray700: Color = Color(0xFF555555), + val gray600: Color = Color(0xFF717171), + val gray500: Color = Color(0xFF8E8E8E), + val gray400: Color = Color(0xFFAAAAAA), + val gray300: Color = Color(0xFFC6C6C6), + val gray200: Color = Color(0xFFE3E3E3), + val gray100: Color = Color(0xFFF7F7F7), + val white: Color = Color(0xFFFAFAFA), + val accentBlue: Color = Color(0xFF0094FF), + val accentGreen: Color = Color(0xFF00AB40), + val error: Color = Color(0xFFFF4B3E), +) - val accentBlue = Color(0xFF0094FF) - val accentGreen = Color(0xFF00AB40) +val LocalColor = staticCompositionLocalOf { FestabookColorPalette() } - val error = Color(0xFFFF4B3E) -} +val FestabookColor: FestabookColorPalette + @Composable + @ReadOnlyComposable + get() = LocalColor.current diff --git a/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookShapes.kt b/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookShapes.kt index 8f08a18..dda2359 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookShapes.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookShapes.kt @@ -3,6 +3,7 @@ package com.daedan.festabook.presentation.theme import androidx.compose.foundation.shape.CornerBasedShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.unit.dp @@ -18,4 +19,6 @@ data class FestabookShapes( val LocalShapes = staticCompositionLocalOf { FestabookShapes() } val festabookShapes: FestabookShapes - @Composable get() = LocalShapes.current + @Composable + @ReadOnlyComposable + get() = LocalShapes.current diff --git a/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookSpacing.kt b/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookSpacing.kt index 3d12413..c4f00cd 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookSpacing.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookSpacing.kt @@ -1,6 +1,7 @@ package com.daedan.festabook.presentation.theme import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp @@ -17,4 +18,6 @@ data class FestabookSpacing( val LocalSpacing = staticCompositionLocalOf { FestabookSpacing() } val festabookSpacing - @Composable get() = LocalSpacing.current + @Composable + @ReadOnlyComposable + get() = LocalSpacing.current diff --git a/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookTheme.kt b/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookTheme.kt index 5a7b46b..69353cf 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookTheme.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookTheme.kt @@ -5,18 +5,25 @@ import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -private val LightColorScheme = - lightColorScheme( - background = FestabookColor.white, - ) +private val LightColorScheme + @Composable + get() = + lightColorScheme( + background = FestabookColor.white, + ) @Composable fun FestabookTheme(content: @Composable () -> Unit) { val spacing = FestabookSpacing() val shapes = FestabookShapes() + val color = FestabookColorPalette() + val typography = FestabookTypographies + CompositionLocalProvider( LocalSpacing provides spacing, LocalShapes provides shapes, + LocalColor provides color, + LocalTypography provides typography, ) { MaterialTheme( colorScheme = LightColorScheme, diff --git a/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookTypography.kt b/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookTypography.kt index da30f20..1f18488 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookTypography.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/theme/FestabookTypography.kt @@ -1,6 +1,9 @@ package com.daedan.festabook.presentation.theme import androidx.compose.material3.Typography +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.FontFamily @@ -11,7 +14,7 @@ private val PretendardBold = FontFamily(Font(R.font.pretendard_bold)) private val PretendardMedium = FontFamily(Font(R.font.pretendard_medium)) private val PretendardRegular = FontFamily(Font(R.font.pretendard_regular)) -val FestabookTypography = +val FestabookTypographies = Typography( displayLarge = TextStyle( @@ -74,3 +77,10 @@ val FestabookTypography = fontSize = 10.sp, ), ) + +val LocalTypography = staticCompositionLocalOf { FestabookTypographies } + +val FestabookTypography: Typography + @Composable + @ReadOnlyComposable + get() = LocalTypography.current diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 43024fe..ce61dba 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,12 +1,15 @@ + From 653763baa675617d5041572673d96ac716c77c72 Mon Sep 17 00:00:00 2001 From: oungsi2000 Date: Mon, 8 Dec 2025 19:34:05 +0900 Subject: [PATCH 5/5] =?UTF-8?q?refactor:=20ktlint=20Compose=20=EA=B7=9C?= =?UTF-8?q?=EC=B9=99=20=EC=A0=81=EC=9A=A9=20=EB=B0=8F=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ktlint의 Compose 관련 규칙을 프로젝트에 새로 적용하고, 이에 따라 발견된 코드 스타일 및 컨벤션 문제를 수정했습니다. - **ktlint Compose 규칙 적용:** - `gradle/libs.versions.toml`과 `app/build.gradle.kts`에 `ktlint-compose` 의존성을 추가했습니다. - `.editorconfig` 파일에 `compose_allowed_composition_locals` 설정을 추가하여 `LocalColor`, `LocalTypography` 등의 사용을 허용했습니다. - **코드 스타일 및 컨벤션 수정:** - `@Composable` 함수의 네이밍 컨벤션에 맞춰 `@Preview` 함수의 이름을 `PascalCase`에서 `private` 접근자의 `camelCase`로 변경했습니다. (`CoilImage.kt`) - `TimeTagMenu.kt`에서 의미가 불분명했던 콜백 파라미터명 `onSizeDetermined`를 `onSizeDetermine`으로 더 명확하게 수정했습니다. - `PullToRefreshContainer.kt` 컴포저블의 파라미터 순서를 Modifier가 마지막에 오도록 조정했습니다. - `LostItemScreen.kt`에서 `EmptyStateScreen` 호출 시 불필요하게 전달되던 Modifier를 제거했습니다. --- .editorconfig | 3 ++- app/build.gradle.kts | 1 + .../festabook/presentation/common/component/CoilImage.kt | 2 +- .../presentation/common/component/PullToRefreshContainer.kt | 2 +- .../presentation/news/lost/component/LostItemScreen.kt | 2 +- .../placeMap/timeTagSpinner/component/TimeTagMenu.kt | 6 +++--- gradle/libs.versions.toml | 2 ++ 7 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.editorconfig b/.editorconfig index 35fccf7..79ae79e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,3 +1,4 @@ [*.{kt,kts}] ktlint_standard_annotation = disabled -ktlint_function_naming_ignore_when_annotated_with = Composable \ No newline at end of file +ktlint_function_naming_ignore_when_annotated_with = Composable +compose_allowed_composition_locals = LocalColor, LocalShapes, LocalSpacing, LocalTypography \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 51201f5..589e1d9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -148,6 +148,7 @@ android { } dependencies { + ktlintRuleset(libs.ktlint) implementation(libs.map.sdk) implementation(libs.play.services.location) implementation(libs.androidx.core.ktx) diff --git a/app/src/main/java/com/daedan/festabook/presentation/common/component/CoilImage.kt b/app/src/main/java/com/daedan/festabook/presentation/common/component/CoilImage.kt index 880ba91..734af70 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/common/component/CoilImage.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/common/component/CoilImage.kt @@ -40,7 +40,7 @@ fun CoilImage( @Composable @Preview -fun CoilImagePreview() { +private fun CoilImagePreview() { CoilImage( url = "", contentDescription = "", diff --git a/app/src/main/java/com/daedan/festabook/presentation/common/component/PullToRefreshContainer.kt b/app/src/main/java/com/daedan/festabook/presentation/common/component/PullToRefreshContainer.kt index 18bc0b8..754b825 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/common/component/PullToRefreshContainer.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/common/component/PullToRefreshContainer.kt @@ -63,8 +63,8 @@ private fun PullToRefreshIndicator( isRefreshing: Boolean, onRefresh: () -> Unit, pullOffsetLimit: Float, - modifier: Modifier = Modifier, threshold: Dp, + modifier: Modifier = Modifier, ) { val indicatorSize = (pullOffsetLimit / 5).dp val centerOffset = -(threshold / 2 - indicatorSize / 2) diff --git a/app/src/main/java/com/daedan/festabook/presentation/news/lost/component/LostItemScreen.kt b/app/src/main/java/com/daedan/festabook/presentation/news/lost/component/LostItemScreen.kt index b97e7fc..6ab0e0b 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/news/lost/component/LostItemScreen.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/news/lost/component/LostItemScreen.kt @@ -107,7 +107,7 @@ private fun LostItemContent( ) { val isLostItemEmpty = lostItems.none { it is LostUiModel.Item } if (isLostItemEmpty) { - EmptyStateScreen(modifier = modifier) + EmptyStateScreen() } LazyVerticalGrid( diff --git a/app/src/main/java/com/daedan/festabook/presentation/placeMap/timeTagSpinner/component/TimeTagMenu.kt b/app/src/main/java/com/daedan/festabook/presentation/placeMap/timeTagSpinner/component/TimeTagMenu.kt index 657db70..769f9a5 100644 --- a/app/src/main/java/com/daedan/festabook/presentation/placeMap/timeTagSpinner/component/TimeTagMenu.kt +++ b/app/src/main/java/com/daedan/festabook/presentation/placeMap/timeTagSpinner/component/TimeTagMenu.kt @@ -74,7 +74,7 @@ fun TimeTagMenu( ) { TimeTagButton( title = title, - onSizeDetermined = { dropdownWidth = it }, + onSizeDetermine = { dropdownWidth = it }, ) DropdownMenu( expanded = expanded, @@ -119,14 +119,14 @@ fun TimeTagMenu( @OptIn(ExperimentalMaterial3Api::class) private fun ExposedDropdownMenuBoxScope.TimeTagButton( title: String, - onSizeDetermined: (IntSize) -> Unit, + onSizeDetermine: (IntSize) -> Unit, ) { Row( modifier = Modifier .width(140.dp) .onGloballyPositioned { coordinates -> - onSizeDetermined(coordinates.size) + onSizeDetermine(coordinates.size) }.menuAnchor( type = MenuAnchorType.PrimaryNotEditable, enabled = true, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 59f07ad..d8bb01b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,6 +15,7 @@ junitVersion = "1.2.1" espressoCore = "3.6.1" appcompat = "1.7.0" kotlinxCoroutinesTest = "1.10.2" +ktlintVersion = "0.5.0" loggingInterceptor = "5.1.0" lottie = "6.6.6" mapSdk = "3.22.1" @@ -59,6 +60,7 @@ androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "j androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutinesTest" } +ktlint = { module = "io.nlopez.compose.rules:ktlint", version.ref = "ktlintVersion" } logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "loggingInterceptor" } lottie = { module = "com.airbnb.android:lottie", version.ref = "lottie" } lottie-compose = { module = "com.airbnb.android:lottie-compose", version.ref = "lottie" }