저번에는 gradle을 건드렸으니 이번엔 본격적으로 화면이다!
@HiltAndroidApp
class MyApplication :Application(){
}
@AndroidEntryPoint
class GardenActivity : AppCompatActivity() {...}
@Composable
fun SunflowerApp(
onPageChange: (SunflowerPage) -> Unit = {},
onAttached: (Toolbar) -> Unit = {},
plantListViewModel: PlantListViewModel = hiltViewModel(),
) {
val navController = rememberNavController()
SunFlowerNavHost(
plantListViewModel = plantListViewModel,
navController = navController,
onPageChange = onPageChange,
onAttached = onAttached
)
}
enum class SunflowerPage(
@StringRes val titleResId : Int,
@DrawableRes val drawableResId : Int
){
MY_GARDEN(R.string.my_garden_title, R.drawable.ic_my_garden_active),
PLANT_LIST(R.string.plant_list_title, R.drawable.ic_plant_list_active)
}
@HiltViewModel
class PlantListViewModel @Inject internal constructor(
plantRepository: PlantRepository,
private val savedStateHandle:SavedStateHandle
):ViewModel(){
}
@Singleton
class PlantRepository @Inject constructor(private val plantDao : PlantDao){...}
@Dao
interface PlantDao {
@Query("SELECT * FROM plants ORDER BY name")
fun getPlants(): Flow<List<Plant>>
@Query("SELECT * FROM plants WHERE growZoneNumber = :growZoneNumber ORDER BY name")
fun getPlantsWithGrowZoneNumber(growZoneNumber:Int): Flow<List<Plant>>
@Query("SELECT * FROM plants WHERE id = :plantId")
fun getPlant(plantId: String): Flow<Plant>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll(plants: List<Plant>)
}
@Entity(tableName = "plants")
data class Plant(
@PrimaryKey @ColumnInfo(name = "id") val plantId: String,
val name: String,
val description:String,
val growZoneNumber : Int,
val wateringInterval : Int = 7,
val imageUrl : String = ""
){
fun shouldBeWatered(since : Calendar, lastWateringDate : Calendar) = since > lastWateringDate.apply { add(DAY_OF_YEAR, wateringInterval) }
override fun toString() = name
}
fun getPlants() = plantDao.getPlants()
fun getPlant(plantId: String) = plantDao.getPlant(plantId)
fun getPlantsWithGrowZoneNumber(growZoneNumber: Int) =
plantDao.getPlantsWithGrowZoneNumber(growZoneNumber)
companion object {
@Volatile private var instance: PlantRepository? = null
fun getInstance(plantDao: PlantDao) =
instance ?: synchronized(this) {
instance ?: PlantRepository(plantDao).also { instance = it }
}
}
@Composable
fun SunFlowerNavHost(
navController: NavHostController,
onPageChange: (SunflowerPage) -> Unit = {},
onAttached: (Toolbar) -> Unit = {},
plantListViewModel: PlantListViewModel = hiltViewModel(),
) {
val activity = (LocalContext.current as Activity)
NavHost(navController = navController, startDestination = "home") {
composable("home") {}
}
}
setContent {
MdcTheme {
SunflowerApp(
onAttached = { toolbar ->
setSupportActionBar(toolbar)
},
onPageChange = { page ->
when (page) {
SunflowerPage.MY_GARDEN -> removeMenuProvider(menuProvider)
SunflowerPage.PLANT_LIST -> addMenuProvider(menuProvider, this)
}
},
plantListViewModel = viewModel,
)
}
}
private val menuProvider = object :MenuProvider{
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_plant_list,menu)
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
return when(menuItem.itemId){
R.id.filter_zone -> {
viewModel.updateData()
true
}
else -> false
}
}
}
private val growZone: MutableStateFlow<Int> = MutableStateFlow(
savedStateHandle[GROW_ZONE_SAVED_STATE_KEY] ?: NO_GROW_ZONE
)
companion object {
private const val NO_GROW_ZONE = -1
private const val GROW_ZONE_SAVED_STATE_KEY = "GROW_ZONE_SAVED_STATE_KEY"
}
fun updateData() {
if (isFiltered()) {
clearGrowZoneNumber()
} else {
setGrowZoneNumber(9)
}
}
private fun isFiltered() = growZone.value != NO_GROW_ZONE
private fun setGrowZoneNumber(num: Int) {
growZone.value = num
}
private fun clearGrowZoneNumber() {
growZone.value = NO_GROW_ZONE
}
이로써 GardenActivity 코드는 모두 작성하였고, 이와 연결된 코드들을 일부 구현하였다
Build시 현재 PlantDao쪽에서 inject와 관련된 에러가 발생하고 있다.
다음 작업시에는 이부분을 수정해보도록 하자