Skip to content

Commit

Permalink
#91 BaseNavArgs개선(NavArgs로 가능한 거의 대부분의 타입 호환)
Browse files Browse the repository at this point in the history
  • Loading branch information
pknujsp committed May 29, 2023
1 parent bf49823 commit d0cfa8e
Show file tree
Hide file tree
Showing 27 changed files with 232 additions and 130 deletions.
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ dependencies {
implementation(project(":core:data"))
implementation(project(":core:ui"))
implementation(project(":core:model"))
implementation(project(":core:database"))


implementation(project(":feature:interestedmedicine"))
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/navigation/main_nav.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@
<include app:graph="@navigation/interestedmedicine_nav" />
<include app:graph="@navigation/camera_nav" />
<include app:graph="@navigation/medicine_details_nav" />
<include app:graph="@navigation/search_medicines_nav" />

</navigation>
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ plugins {
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.nav.safeargs.kotlin) apply false
alias(libs.plugins.kapt) apply false
alias(libs.plugins.ksp) apply false
// alias(libs.plugins.ksp) apply false
alias(libs.plugins.kotlin.parcelize) apply false
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,16 @@ import com.android.mediproject.core.model.local.navargs.BaseNavArgs
* @param parameter Uri에 들어갈 파라미터
* @return Uri
*/
private fun toDeepUrl(deepLinkUrl: String, parameter: Map<String, String>): Uri = StringBuilder(deepLinkUrl).let { uri ->
private fun toDeepUrl(deepLinkUrl: String, parameter: Map<String, Any?>): Uri = StringBuilder(deepLinkUrl).let { uri ->
parameter.takeIf {
it.isNotEmpty()
}?.also { map ->
uri.append("?")
map.onEachIndexed { index, entry ->
uri.append("${entry.key}=${entry.value}")
if (index != map.size - 1) uri.append("&")
if (entry.value != null) {
uri.append("${entry.key}=${entry.value}")
if (index != map.size - 1) uri.append("&")
}
}
}
uri.toString().toUri()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ object RepositoryModule {
@Provides
@Singleton
fun provideMedicineApprovalRepository(
medicineApprovalDataSource: MedicineApprovalDataSource, searchHistoryDao: SearchHistoryDao
medicineApprovalDataSource: MedicineApprovalDataSource, searchHistoryRepository: SearchHistoryRepository
): MedicineApprovalRepository = MedicineApprovalRepositoryImpl(
medicineApprovalDataSource, searchHistoryDao
medicineApprovalDataSource, searchHistoryRepository
)

@Provides
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import com.android.mediproject.core.common.DATA_GO_KR_PAGE_SIZE
import com.android.mediproject.core.database.searchhistory.SearchHistoryDao
import com.android.mediproject.core.data.search.SearchHistoryRepository
import com.android.mediproject.core.model.medicine.medicineapproval.Item
import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetailInfoResponse
import com.android.mediproject.core.network.datasource.medicineapproval.MedicineApprovalDataSource
Expand All @@ -17,7 +17,7 @@ import kotlinx.coroutines.flow.map
import javax.inject.Inject

class MedicineApprovalRepositoryImpl @Inject constructor(
private val medicineApprovalDataSource: MedicineApprovalDataSource, private val searchHistoryDao: SearchHistoryDao
private val medicineApprovalDataSource: MedicineApprovalDataSource, private val searchHistoryRepository: SearchHistoryRepository
) : MedicineApprovalRepository {

/**
Expand All @@ -35,7 +35,7 @@ class MedicineApprovalRepositoryImpl @Inject constructor(
if (itemName == null && entpName == null) {
emptyFlow()
} else {

searchHistoryRepository.insertSearchHistory(itemName ?: entpName!!)
Pager(config = PagingConfig(pageSize = DATA_GO_KR_PAGE_SIZE, prefetchDistance = 5), pagingSourceFactory = {
MedicineApprovalListDataSourceImpl(
medicineApprovalDataSource, itemName, entpName, medicationType
Expand Down
3 changes: 1 addition & 2 deletions core/database/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
plugins {
id("mediproject.android.library")
id("mediproject.android.hilt")
alias(libs.plugins.ksp)
}

android {
Expand All @@ -15,7 +14,7 @@ android {
dependencies {
implementation(project(":core:common"))
implementation(project(":core:model"))

implementation(libs.bundles.rooms)
implementation(libs.kotlinx.coroutines.android)
kapt(libs.androidx.room.compileKsp)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.android.mediproject.core.database.searchhistory.SearchHistoryDao
import com.android.mediproject.core.database.searchhistory.SearchHistoryDto


@Database(entities = [SearchHistoryDto::class], version = 1)
abstract class RoomDb : RoomDatabase() {
@Database(entities = [SearchHistoryDto::class], version = 1, exportSchema = true)
abstract class RoomDB : RoomDatabase() {
abstract fun searchHistoryDao(): SearchHistoryDao
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,20 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module(includes = [DaoModule::class])
@Module
@InstallIn(SingletonComponent::class)
object RoomModule {

@Provides
@Singleton
fun provideRoomDb(@ApplicationContext context: Context): RoomDb = Room.databaseBuilder(
context, RoomDb::class.java, "medi_database"
fun provideRoomDb(@ApplicationContext context: Context): RoomDB = Room.databaseBuilder(
context, RoomDB::class.java, "medi_database"
).build()
}


@Module
@InstallIn(SingletonComponent::class)
object DaoModule {
@Provides
fun provideSearchHistoryDao(roomDb: RoomDb): SearchHistoryDao = roomDb.searchHistoryDao()
fun provideSearchHistoryDao(roomDB: RoomDB): SearchHistoryDao = roomDB.searchHistoryDao()
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.android.mediproject.core.database.searchhistory

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Query
import androidx.room.Upsert
import kotlinx.coroutines.flow.Flow
Expand All @@ -14,26 +13,25 @@ interface SearchHistoryDao {
* @param searchHistoryDto
*/
@Upsert
suspend fun insert(searchHistoryDto: SearchHistoryDto)
fun insert(searchHistoryDto: SearchHistoryDto)

/**
* id에 해당하는 검색 기록을 삭제한다.
* @param id
*/
@Delete
suspend fun delete(id: Long)
@Query("DELETE FROM search_history_table WHERE id = :id")
fun delete(id: Long)

/**
* 개수 만큼 검색 목록을 가져온다.
* @param count
*/
@Query("SELECT * FROM search_history_table ORDER BY id DESC LIMIT :count")
suspend fun select(count: Int): Flow<List<SearchHistoryDto>>
fun select(count: Int): Flow<List<SearchHistoryDto>>

/**
* 모든 검색 기록을 삭제한다.
*/
@Query("DELETE FROM search_history_table")
@Delete
suspend fun deleteAll()
fun deleteAll()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.android.mediproject.core.database.searchhistory

import java.time.LocalDateTime

fun SearchHistoryDto.toSearchHistoryItemDto(): com.android.mediproject.core.model.search.local.SearchHistoryItemDto {
return com.android.mediproject.core.model.search.local.SearchHistoryItemDto(
id = id, query = query, searchedAt = LocalDateTime.parse(this.searchDateTime)
)
}
1 change: 1 addition & 0 deletions core/domain/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ dependencies {
implementation(project(":core:model"))
implementation(project(":core:network"))
implementation(project(":core:data"))
implementation(project(":core:database"))

implementation(libs.androidx.core.ktx)
implementation(libs.kotlinx.serialization.json)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.android.mediproject.core.domain

import com.android.mediproject.core.data.search.SearchHistoryRepository
import com.android.mediproject.core.database.searchhistory.toSearchHistoryItemDto
import kotlinx.coroutines.flow.map
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class SearchHistoryUseCase @Inject constructor(
private val searchHistoryRepository: SearchHistoryRepository
) {
suspend fun insertSearchHistory(query: String) = searchHistoryRepository.insertSearchHistory(query)

suspend fun getSearchHistoryList(count: Int) = searchHistoryRepository.getSearchHistoryList(count).map {
it.map {
it.toSearchHistoryItemDto()
}
}

suspend fun deleteSearchHistory(id: Long) = searchHistoryRepository.deleteSearchHistory(id)

suspend fun deleteAllSearchHistory() = searchHistoryRepository.deleteAllSearchHistory()
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,53 @@ import androidx.navigation.NavArgs
import kotlin.reflect.KClass
import kotlin.reflect.full.memberProperties
import kotlin.reflect.full.primaryConstructor
import kotlin.reflect.javaType

abstract class BaseNavArgs(
val className: String
) : NavArgs {
@Suppress("CAST_NEVER_SUCCEEDS")
fun toBundle(): Bundle {
val result = Bundle()
toMap().forEach { (key, value) ->
result.putString(key, value)
when (value) {
null -> return@forEach
is String -> result.putString(key, value)
is Int -> result.putInt(key, value)
is Long -> result.putLong(key, value)
is Float -> result.putFloat(key, value)
is Boolean -> result.putBoolean(key, value)
}
}
return result
}

companion object {
@OptIn(ExperimentalStdlibApi::class)
@JvmStatic
fun fromBundle(bundle: Bundle): BaseNavArgs {
// kotlin reflection Class.forName(bundle.getString("className")!!)
val kClass: KClass<BaseNavArgs> = Class.forName(bundle.getString("className")!!).kotlin as KClass<BaseNavArgs>
bundle.classLoader = kClass.java.classLoader

val constructor = kClass.primaryConstructor!!
val args = constructor.parameters.map { parameter ->
bundle.getString(parameter.name, "")
val type = parameter.type.javaType
with(type) {
when (type) {
String::class.java -> bundle.getString(parameter.name)
Int::class.java -> bundle.getInt(parameter.name)
Long::class.java -> bundle.getLong(parameter.name)
Float::class.java -> bundle.getFloat(parameter.name)
Boolean::class.java -> bundle.getBoolean(parameter.name)
else -> throw IllegalArgumentException("Argument \"${parameter.name}\" is marked as non-null but was passed a null value.")
}
}
}
return constructor.call(*args.toTypedArray())
}
}


fun toMap(): Map<String, String> = this::class.memberProperties.let { properties ->
properties.associate { property ->
property.name to property.getter.call(this).toString()
}.toMap()
fun toMap(): Map<String, Any?> = this::class.memberProperties.associate { property ->
property.name to property.getter.call(this)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.android.mediproject.core.model.search.local

import java.time.LocalDateTime

data class SearchHistoryItemDto(
val id: Long,
val query: String,
val searchedAt: LocalDateTime
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.android.mediproject.core.model.searchmedicines.local

import com.android.mediproject.core.model.local.navargs.BaseNavArgs

/**
* 검색어를 전달할 인자
*
* @property query 검색어
*/
data class SearchQueryArgs(
val query: String = ""
) : BaseNavArgs(SearchQueryArgs::class.java.name)
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.text.Editable
import android.util.AttributeSet
import android.util.TypedValue
import android.view.MotionEvent
Expand Down Expand Up @@ -230,4 +231,11 @@ class MediSearchbar constructor(
super.onInterceptTouchEvent(ev)
}
}


fun getText(): Editable = searchEditView.text

fun setText(text: String) {
searchEditView.setText(text)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import android.os.Bundle
import android.view.View
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import com.android.mediproject.core.common.util.navigateByDeepLink
import com.android.mediproject.core.model.searchmedicines.local.SearchQueryArgs
import com.android.mediproject.core.ui.base.BaseFragment
import com.android.mediproject.feature.comments.recentcommentlist.RecentCommentListFragment
import com.android.mediproject.feature.home.databinding.FragmentHomeBinding
Expand Down Expand Up @@ -52,10 +54,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding, HomeViewModel>(FragmentHo
*/
private fun initSearchBar() {
binding.searchView.setOnBarClickListener {
Bundle().apply {
putString("searchQuery", null)
findNavController().navigate(R.id.action_homeFragment_to_searchMedicinesFragment, this)
}
findNavController().navigate(HomeFragmentDirections.actionHomeFragmentToSearchMedicinesFragment())
}
}

Expand All @@ -74,13 +73,10 @@ class HomeFragment : BaseFragment<FragmentHomeBinding, HomeViewModel>(FragmentHo
}
setFragmentResultListener(RecentSearchListFragment.ResultKey.RESULT_KEY.name, viewLifecycleOwner) { _, bundle ->
bundle.apply {
getString(RecentSearchListFragment.ResultKey.WORD.name).also {
Bundle().apply {
putString("searchQuery", it)
findNavController().navigate(R.id.action_homeFragment_to_searchMedicinesFragment, this)
}
}

findNavController().navigateByDeepLink(
"medilens://main/search/recentSearchListFragment",
SearchQueryArgs(getString(RecentSearchListFragment.ResultKey.WORD.name) ?: "")
)
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion feature/home/src/main/res/layout/fragment_home.xml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
android:layout_marginTop="69dp"
android:layout_marginBottom="58dp"
android:bufferType="spannable"
android:lineSpacingMultiplier="1.2"
android:lineSpacingMultiplier="1.1"
android:text="@{viewModel.headerText}"
android:textColor="@color/white"
android:textSize="23sp"
Expand Down
Loading

0 comments on commit d0cfa8e

Please sign in to comment.