Skip to content

Commit

Permalink
๐Ÿ”€:: (#42) ์ƒํƒœ ์ผ๊ธฐ Local CR ๊ธฐ๋Šฅ ๊ตฌํ˜„
Browse files Browse the repository at this point in the history
  • Loading branch information
snack655 committed Oct 6, 2022
1 parent 4fe8b3a commit 3896d99
Show file tree
Hide file tree
Showing 80 changed files with 259 additions and 37 deletions.
17 changes: 17 additions & 0 deletions .idea/deploymentTargetDropDown.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 5 additions & 7 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,16 @@ android {

dependencies {
implementation(Dependency.Moshi.moshi)
implementation("androidx.appcompat:appcompat:1.5.1")
implementation("com.google.android.material:material:1.6.1")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.legacy:legacy-support-v4:1.0.0")
kapt(Dependency.Moshi.moshiCompiler)
implementation(Dependency.Moshi.moshiKotlin)

implementation(Dependency.coreKtx)
implementation(Dependency.appcompat)
implementation(Dependency.androidKtx)
implementation(Dependency.fragmentKtx)
/* implementation(Dependency.androidKtx)
implementation(Dependency.fragmentKtx)*/

implementation(Dependency.UI.material)
implementation(Dependency.UI.constraintLayout)
//implementation(Dependency.UI.constraintLayout)

testImplementation(Dependency.Test.junit)
testImplementation(Dependency.Test.mockito)
Expand All @@ -81,4 +77,6 @@ dependencies {
annotationProcessor(Dependency.Glide.glideCompiler)

implementation(Dependency.Animation.lottie)

implementation(Dependency.UI.materialCalendar)
}
5 changes: 4 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<activity
android:name=".features.chat.view.ChatActivity"
android:exported="true" >

<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand All @@ -38,7 +39,9 @@

<activity
android:name=".features.calendar.view.CalendarActivity"
android:exported="false" />
android:exported="false" >

</activity>

<activity
android:name=".features.main.view.MainActivity"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ interface DayStateDao {
@Query("Select * From day_state_table where date = :date")
suspend fun getDayState(date: String): DayStateEntity

@Query("Select date From day_state_table")
suspend fun getAllDate(): List<String>

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertDayState(entity: DayStateEntity)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.yongjincompany.hackerthonandroid.features.calendar.utils

import android.content.Context
import androidx.core.content.ContextCompat
import com.prolificinteractive.materialcalendarview.CalendarDay
import com.prolificinteractive.materialcalendarview.DayViewDecorator
import com.prolificinteractive.materialcalendarview.DayViewFacade
import com.prolificinteractive.materialcalendarview.spans.DotSpan
import com.yongjincompany.hackerthonandroid.R


class DayStateDecorator(val context: Context, val dates: List<String>): DayViewDecorator {

override fun shouldDecorate(day: CalendarDay): Boolean {
return dates.contains("${day.year}-${String.format("%02d", day.month)}-${String.format("%02d", day.day)}")
}

override fun decorate(view: DayViewFacade) {
view.addSpan(DotSpan(5f, ContextCompat.getColor(context, R.color.main)))
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.yongjincompany.hackerthonandroid.features.calendar.utils

import android.content.Context
import android.graphics.Color
import android.text.style.ForegroundColorSpan
import com.prolificinteractive.materialcalendarview.CalendarDay
import com.prolificinteractive.materialcalendarview.DayViewDecorator
import com.prolificinteractive.materialcalendarview.DayViewFacade

class TodayDecorator:DayViewDecorator {

private var date = CalendarDay.today()

override fun shouldDecorate(day: CalendarDay?): Boolean {
return day?.equals(date)!!
}
override fun decorate(view: DayViewFacade?) {
view?.addSpan(object: ForegroundColorSpan(Color.parseColor("#D5B4FF")){})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,24 @@ package com.yongjincompany.hackerthonandroid.features.calendar.view

import android.animation.ObjectAnimator
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.prolificinteractive.materialcalendarview.CalendarDay
import com.yongjincompany.hackerthonandroid.R
import com.yongjincompany.hackerthonandroid.database.RoomDatabase
import com.yongjincompany.hackerthonandroid.databinding.ActivityCalendarBinding
import com.yongjincompany.hackerthonandroid.features.calendar.utils.DayStateDecorator
import com.yongjincompany.hackerthonandroid.features.calendar.utils.TodayDecorator
import com.yongjincompany.hackerthonandroid.features.calendar.vm.CalendarViewModel
import com.yongjincompany.hackerthonandroid.features.diary.view.StateDiaryActivity
import java.time.LocalDate

class CalendarActivity : AppCompatActivity() {

Expand All @@ -19,15 +28,25 @@ class CalendarActivity : AppCompatActivity() {

private var isFabOpen = false

@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
performDataBinding()
calendarViewModel.database = RoomDatabase.getInstance(this)
calendarViewModel.getAllStateDate()
bindingView()
observeLiveData()
}

@RequiresApi(Build.VERSION_CODES.O)
private fun bindingView() {
binding.calendarView.setOnDateChangeListener { view, year, month, dayOfMonth ->
calendarViewModel.currentDate.value = "${year}-${String.format("%02d", month + 1)}-${String.format("%02d", dayOfMonth)}"
binding.calendarView.leftArrow.setTint(ContextCompat.getColor(this, R.color.white))
binding.calendarView.rightArrow.setTint(ContextCompat.getColor(this, R.color.white))

binding.calendarView.selectedDate = CalendarDay.today()

binding.calendarView.setOnDateChangedListener { widget, date, selected ->
calendarViewModel.currentDate.value = "${date.year}-${String.format("%02d", date.month)}-${String.format("%02d", date.day)}"
}

binding.fabAdd.setOnClickListener {
Expand All @@ -43,6 +62,36 @@ class CalendarActivity : AppCompatActivity() {
}
}

private fun observeLiveData() = with(calendarViewModel) {
currentDate.observe(this@CalendarActivity) {
getStateDiaryByDate(it)
}

dayStateEntity.observe(this@CalendarActivity) {
if (it == null) {
binding.layoutDayState.visibility = View.GONE
} else {
binding.layoutDayState.visibility = View.VISIBLE
binding.tvBodyState.text = it.bodyState
if (it.mood == "์ข‹์•„์š”!") {
binding.ivMood.setImageResource(R.drawable.ic_happy)
} else {
binding.ivMood.setImageResource(R.drawable.ic_sad)
}
binding.tvBehaviorChange.text = it.behaviorChange
}
}

dateList.observe(this@CalendarActivity) {
it.forEach {
Log.d("CalendarDateList", it)
}
val dateStateDecorator = DayStateDecorator(this@CalendarActivity, it)
val todayDecorator = TodayDecorator()
binding.calendarView.addDecorators(dateStateDecorator, todayDecorator)
}
}

private fun toggleFab() {
if (isFabOpen) {
ObjectAnimator.ofFloat(binding.fabDiary, "translationY", 0f).apply { start() }
Expand Down Expand Up @@ -78,11 +127,18 @@ class CalendarActivity : AppCompatActivity() {

}

@RequiresApi(Build.VERSION_CODES.O)
private fun navigateToStateDiary() {
val intent = Intent(this, StateDiaryActivity::class.java)
intent.putExtra("date", calendarViewModel.currentDate.value ?: LocalDate.now().toString())
startActivity(intent)
}

override fun onResume() {
super.onResume()
calendarViewModel.getAllStateDate()
}

private fun performDataBinding() {
binding = DataBindingUtil.setContentView(this, R.layout.activity_calendar)
calendarViewModel = ViewModelProvider(this).get(CalendarViewModel::class.java)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,35 @@ package com.yongjincompany.hackerthonandroid.features.calendar.vm

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.yongjincompany.hackerthonandroid.database.RoomDatabase
import com.yongjincompany.hackerthonandroid.database.entity.DayStateEntity
import java.time.LocalDate
import java.util.*
import kotlinx.coroutines.launch

class CalendarViewModel : ViewModel() {

val currentDate = MutableLiveData(LocalDate.now().toString())
val info = MutableLiveData("์ž…๋ ฅ๋œ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")
val isWoman = MutableLiveData(true)

val dayStateEntity = MutableLiveData<DayStateEntity?>()
val dateList = MutableLiveData<List<String>>()

var database: RoomDatabase? = null

fun getStateDiaryByDate(date: String) {
viewModelScope.launch {
dayStateEntity.postValue(database?.dayStateDao()?.getDayState(date))
}
}


fun getAllStateDate() {
viewModelScope.launch {
dateList.value = database?.dayStateDao()?.getAllDate()
}
}

}
Original file line number Diff line number Diff line change
@@ -1,26 +1,33 @@
package com.yongjincompany.hackerthonandroid.features.diary.view

import android.os.Build
import android.os.Bundle
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.yongjincompany.hackerthonandroid.R
import com.yongjincompany.hackerthonandroid.database.RoomDatabase
import com.yongjincompany.hackerthonandroid.databinding.ActivityStateDiaryBinding
import com.yongjincompany.hackerthonandroid.features.diary.adapter.StateAdapter
import com.yongjincompany.hackerthonandroid.features.diary.item.State
import com.yongjincompany.hackerthonandroid.features.diary.vm.StateDiaryViewModel
import java.time.LocalDate

class StateDiaryActivity : AppCompatActivity() {

lateinit var binding: ActivityStateDiaryBinding
lateinit var stateDiaryViewModel: StateDiaryViewModel
lateinit var bodyStateAdapter: StateAdapter
lateinit var behaviorStateAdapter: StateAdapter
private lateinit var stateDiaryViewModel: StateDiaryViewModel
private lateinit var bodyStateAdapter: StateAdapter
private lateinit var behaviorStateAdapter: StateAdapter

var isCheckedHappy: Boolean = true
private lateinit var date: String

private var isCheckedHappy: Boolean = true

private val bodyStates: List<State> = listOf(
State("๋‘ํ†ต"), State("๋ณตํ†ต"), State("ํ—ˆ๋ฆฌํ†ต์ฆ"), State("ํ”ผ๋ถ€ ํŠธ๋Ÿฌ๋ธ”"),
Expand All @@ -34,9 +41,13 @@ class StateDiaryActivity : AppCompatActivity() {
State("๊ธฐ์–ต๋ ฅ/์ง‘์ค‘๋ ฅ ์ €ํ•˜"), State("์ˆ˜๋ฉด์žฅ์• ")
)

@RequiresApi(Build.VERSION_CODES.O) // ์Œ... ์ด๊ฒŒ ๋งž๋‚˜
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
performDataBinding()

stateDiaryViewModel.database = RoomDatabase.getInstance(this)
date = intent.getStringExtra("date") ?: LocalDate.now().toString()
initBodyStateAdapter()
initBehaviorAdapter()
bindingView()
Expand All @@ -63,6 +74,35 @@ class StateDiaryActivity : AppCompatActivity() {
binding.btnBack.setOnClickListener {
finish()
}

binding.layoutSave.setOnClickListener {

var hasBodyStateChecked: Boolean = false
bodyStateAdapter.currentList.forEach {
if (it.isChecked) {
hasBodyStateChecked = true
}
}

var hasBehaviorStateChecked: Boolean = false
behaviorStateAdapter.currentList.forEach {
if (it.isChecked) {
hasBehaviorStateChecked = true
}
}

if (hasBehaviorStateChecked && hasBodyStateChecked) {
stateDiaryViewModel.saveState(
date = date,
bodyState = bodyStateAdapter.currentList.filter { it.isChecked }[0].type,
mood = if (isCheckedHappy) "์ข‹์•„์š”!" else "๋‚˜๋น ์š”..",
behaviorChange = behaviorStateAdapter.currentList.filter { it.isChecked }[0].type
)
} else {
Toast.makeText(this, "๋ชจ๋‘ ์ฒดํฌํ•ด ์ฃผ์„ธ์š”!", Toast.LENGTH_SHORT).show()
}
finish()
}
}

private fun initBodyStateAdapter() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,26 @@
package com.yongjincompany.hackerthonandroid.features.diary.vm

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.yongjincompany.hackerthonandroid.database.RoomDatabase
import com.yongjincompany.hackerthonandroid.database.entity.DayStateEntity
import kotlinx.coroutines.launch

class StateDiaryViewModel : ViewModel() {

var database: RoomDatabase? = null


fun saveState(date: String, bodyState: String, mood: String, behaviorChange: String) {
viewModelScope.launch {
database?.dayStateDao()?.insertDayState(
DayStateEntity(
date,
bodyState = bodyState,
mood = mood,
behaviorChange = behaviorChange,
)
)
}
}

}
Loading

0 comments on commit 3896d99

Please sign in to comment.