From 2162f395414025e7be1e46c8489f50a67906aa72 Mon Sep 17 00:00:00 2001 From: bbaktaeho Date: Thu, 25 Feb 2021 00:25:43 +0900 Subject: [PATCH 1/7] =?UTF-8?q?Fix:=20=ED=83=80=EC=9E=84=EB=9D=BC=EC=9D=B8?= =?UTF-8?q?,=20=EC=B5=9C=EA=B7=BC=20=EC=8B=9D=EC=82=AC=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=84=9C=EB=B2=84=20=EC=97=B0=EB=8F=99=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 - .../example/noogabab/data/api/ApiService.kt | 3 + .../data/api/model/MealLatestModel.kt | 13 ++++ .../domain/repository/DogRepository.kt | 1 + .../noogabab/domain/usecase/DogUseCase.kt | 6 ++ .../ui/main/chart/MonthChartFragment.kt | 76 +++++++++++++------ .../ui/main/chart/WeekChartFragment.kt | 73 ++++++++++++------ .../presentation/ui/main/home/HomeFragment.kt | 29 +++++-- .../ui/main/home/HomeViewModel.kt | 30 ++++++++ .../ui/main/timeline/TimelineAdapter.kt | 20 +++-- .../example/noogabab/util/NetworkConstants.kt | 3 +- .../main/res/layout/fragment_month_chart.xml | 49 +++++++----- .../main/res/layout/fragment_my_profile.xml | 5 +- .../main/res/layout/fragment_week_chart.xml | 48 +++++++----- 14 files changed, 262 insertions(+), 95 deletions(-) create mode 100644 app/src/main/java/com/example/noogabab/data/api/model/MealLatestModel.kt create mode 100644 app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeViewModel.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 30c86f1..eab0b77 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -33,7 +33,6 @@ - diff --git a/app/src/main/java/com/example/noogabab/data/api/ApiService.kt b/app/src/main/java/com/example/noogabab/data/api/ApiService.kt index 8a2fbf9..0bc3c75 100644 --- a/app/src/main/java/com/example/noogabab/data/api/ApiService.kt +++ b/app/src/main/java/com/example/noogabab/data/api/ApiService.kt @@ -65,6 +65,9 @@ interface ApiService { ) suspend fun getDog(@Header("key") key: String): GetDogModel + @GET(NetworkConstants.URL_DOGS_MEAL_LATEST) + suspend fun getMealLatest(@Path("dogId") dogId: Int): MealLatestModel + @PUT(NetworkConstants.URL_DOGS_DOG) suspend fun modifyDog() diff --git a/app/src/main/java/com/example/noogabab/data/api/model/MealLatestModel.kt b/app/src/main/java/com/example/noogabab/data/api/model/MealLatestModel.kt new file mode 100644 index 0000000..eb1fcfa --- /dev/null +++ b/app/src/main/java/com/example/noogabab/data/api/model/MealLatestModel.kt @@ -0,0 +1,13 @@ +package com.example.noogabab.data.api.model + + +import com.google.gson.annotations.SerializedName + +data class MealLatestModel( + @SerializedName("data") + val content: String?, + @SerializedName("message") + val message: String, + @SerializedName("success") + val success: Boolean +) \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/domain/repository/DogRepository.kt b/app/src/main/java/com/example/noogabab/domain/repository/DogRepository.kt index 1ed56b3..a9ad423 100644 --- a/app/src/main/java/com/example/noogabab/domain/repository/DogRepository.kt +++ b/app/src/main/java/com/example/noogabab/domain/repository/DogRepository.kt @@ -6,4 +6,5 @@ import javax.inject.Inject class DogRepository @Inject constructor(private val apiService: ApiService) { suspend fun getDog(key: String) = apiService.getDog(key) + suspend fun getMealLatest(dogId: Int) = apiService.getMealLatest(dogId) } \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/domain/usecase/DogUseCase.kt b/app/src/main/java/com/example/noogabab/domain/usecase/DogUseCase.kt index 4017e1f..4095d63 100644 --- a/app/src/main/java/com/example/noogabab/domain/usecase/DogUseCase.kt +++ b/app/src/main/java/com/example/noogabab/domain/usecase/DogUseCase.kt @@ -1,6 +1,7 @@ package com.example.noogabab.domain.usecase import com.example.noogabab.data.api.model.GetDogModel +import com.example.noogabab.data.api.model.MealLatestModel import com.example.noogabab.data.api.model.ResultData import com.example.noogabab.domain.repository.DogRepository import javax.inject.Inject @@ -11,4 +12,9 @@ class DogUseCase @Inject constructor(private val dogRepository: DogRepository) { return if (dog.success) ResultData.Success(dog) else ResultData.Failed(dog.message) } + suspend fun getMealLatest(dogId: Int): ResultData { + val mealLatest = dogRepository.getMealLatest(dogId) + return if (mealLatest.success) ResultData.Success(mealLatest) + else ResultData.Failed(mealLatest.message) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt index 1797159..439f1f0 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.SharedPreferences import android.graphics.Color import android.os.Bundle +import android.util.Log import androidx.fragment.app.Fragment import android.view.View import android.widget.ImageView @@ -22,10 +23,14 @@ import com.github.mikephil.charting.data.BarData import com.github.mikephil.charting.data.BarDataSet import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.interfaces.datasets.IBarDataSet +import com.google.android.material.datepicker.MaterialDatePicker import kotlinx.android.synthetic.main.fragment_month_chart.* +import java.text.SimpleDateFormat +import java.util.* +import kotlin.collections.ArrayList -class MonthChartFragment : Fragment(R.layout.fragment_month_chart) { +class MonthChartFragment : Fragment(R.layout.fragment_month_chart), View.OnClickListener { private val mainViewModel: MainViewModel by activityViewModels() private var groupSize = 0 private var xGroup: ArrayList = ArrayList() @@ -42,8 +47,13 @@ class MonthChartFragment : Fragment(R.layout.fragment_month_chart) { super.onViewCreated(view, savedInstanceState) setValues() - bobRankClick() - snackRankClick() + load() + } + + private fun load() { + btn_select_month_date.setOnClickListener(this) + btn_month_rank_bob.setOnClickListener(this) + btn_month_rank_snack.setOnClickListener(this) } private fun observe(s: SharedPreferences) { @@ -68,27 +78,7 @@ class MonthChartFragment : Fragment(R.layout.fragment_month_chart) { }) } - private fun bobRankClick() { - var position = 0 - var max = -1f - for (i in yBob.indices) if (max < yBob[i]) { - max = yBob[i]; position = i - } - btn_month_rank_bob.setOnClickListener { - getFirst(groupSize, position) - } - } - private fun snackRankClick() { - var position = 0 - var max = -1f - for (i in ySnack.indices) if (max < ySnack[i]) { - max = ySnack[i]; position = i - } - btn_month_rank_snack.setOnClickListener { - getFirst(groupSize, position) - } - } private fun getFirst(size: Int, position: Int) { for (i in 0 until size) linear_month_rank[i].visibility = View.INVISIBLE @@ -181,4 +171,44 @@ class MonthChartFragment : Fragment(R.layout.fragment_month_chart) { } } + override fun onClick(view: View?) { + when (view) { + btn_month_rank_bob -> bobRankClick() + btn_month_rank_snack -> snackRankClick() + btn_select_month_date -> selectDate() + } + } + + private fun bobRankClick() { + var position = 0 + var max = -1f + for (i in yBob.indices) if (max < yBob[i]) { + max = yBob[i]; + position = i + } + getFirst(groupSize, position) + } + + private fun snackRankClick() { + var position = 0 + var max = -1f + for (i in ySnack.indices) if (max < ySnack[i]) { + max = ySnack[i]; + position = i + } + getFirst(groupSize, position) + } + + private fun selectDate() { + val datePicker = MaterialDatePicker.Builder.datePicker() + .setTitleText("날짜를 선택하세요") + .build() + datePicker.show(requireActivity().supportFragmentManager, "DATE_PICKER") + datePicker.addOnPositiveButtonClickListener { + val sdf = SimpleDateFormat("yyyy-MM-dd") + val formatTime = sdf.format(Date(it)) + Toast.makeText(requireContext(), formatTime, Toast.LENGTH_LONG).show() + } + + } } diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt index 2c2ded2..d34b85b 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt @@ -6,6 +6,7 @@ import androidx.fragment.app.Fragment import android.view.View import android.widget.ImageView import android.widget.LinearLayout +import android.widget.Toast import androidx.core.view.get import com.example.noogabab.R import com.github.mikephil.charting.components.Legend @@ -14,9 +15,14 @@ import com.github.mikephil.charting.data.BarData import com.github.mikephil.charting.data.BarDataSet import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.interfaces.datasets.IBarDataSet +import com.google.android.material.datepicker.MaterialDatePicker +import kotlinx.android.synthetic.main.fragment_month_chart.* import kotlinx.android.synthetic.main.fragment_week_chart.* +import java.text.SimpleDateFormat +import java.util.* +import kotlin.collections.ArrayList -class WeekChartFragment : Fragment(R.layout.fragment_week_chart) { +class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickListener { private var groupSize = 0 private var xGroup: ArrayList = ArrayList() private lateinit var yBob: FloatArray @@ -26,31 +32,16 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart) { super.onViewCreated(view, savedInstanceState) setValues() - bobRankClick() - snackRankClick() + load() } - private fun bobRankClick() { - var position = 0 - var max = -1f - for (i in yBob.indices) if (max < yBob[i]) { - max = yBob[i]; position = i - } - btn_week_rank_bob.setOnClickListener { - getFirst(groupSize, position) - } + private fun load() { + btn_week_rank_snack.setOnClickListener(this) + btn_week_rank_bob.setOnClickListener(this) + btn_select_week_date.setOnClickListener(this) } - private fun snackRankClick() { - var position = 0 - var max = -1f - for (i in ySnack.indices) if (max < ySnack[i]) { - max = ySnack[i]; position = i - } - btn_week_rank_snack.setOnClickListener { - getFirst(groupSize, position) - } - } + private fun getFirst(size: Int, position: Int) { for (i in 0 until size) linear_week_rank[i].visibility = View.INVISIBLE @@ -144,4 +135,42 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart) { } } } + + override fun onClick(view: View?) { + when(view) { + btn_select_week_date -> snackRankClick() + btn_week_rank_bob -> bobRankClick() + btn_week_rank_snack -> selectDate() + } + } + + private fun bobRankClick() { + var position = 0 + var max = -1f + for (i in yBob.indices) if (max < yBob[i]) { + max = yBob[i]; position = i + } + getFirst(groupSize, position) + } + + private fun snackRankClick() { + var position = 0 + var max = -1f + for (i in ySnack.indices) if (max < ySnack[i]) { + max = ySnack[i]; position = i + } + getFirst(groupSize, position) + } + + private fun selectDate() { + val datePicker = MaterialDatePicker.Builder.datePicker() + .setTitleText("날짜를 선택하세요") + .build() + datePicker.show(requireActivity().supportFragmentManager, "DATE_PICKER") + datePicker.addOnPositiveButtonClickListener { + val sdf = SimpleDateFormat("yyyy-MM-dd") + val formatTime = sdf.format(Date(it)) + Toast.makeText(requireContext(), formatTime, Toast.LENGTH_LONG).show() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeFragment.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeFragment.kt index 5142573..73e7f37 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeFragment.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeFragment.kt @@ -6,10 +6,13 @@ import android.content.SharedPreferences import android.graphics.Color import android.os.Bundle import android.view.View +import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Observer import com.bumptech.glide.Glide import com.example.noogabab.R +import com.example.noogabab.data.api.model.ResultData import com.example.noogabab.presentation.dialog.AlertDialog import com.example.noogabab.presentation.ui.main.MainActivity import com.example.noogabab.presentation.ui.main.MainViewModel @@ -19,7 +22,7 @@ import com.example.noogabab.util.SharedProfile import kotlinx.android.synthetic.main.fragment_home.* class HomeFragment : Fragment(R.layout.fragment_home), View.OnClickListener { - private val mainViewModel: MainViewModel by activityViewModels() + private val homeViewModel: HomeViewModel by activityViewModels() private lateinit var sharedDog: SharedPreferences private lateinit var sharedProfile: SharedPreferences @@ -33,10 +36,7 @@ class HomeFragment : Fragment(R.layout.fragment_home), View.OnClickListener { super.onViewCreated(view, savedInstanceState) load() - btn_eat.setOnClickListener(this) - btn_snack.setOnClickListener(this) - txt_time_line.setOnClickListener(this) - iv_select.setOnClickListener(this) + observe() } private fun load() { @@ -47,6 +47,10 @@ class HomeFragment : Fragment(R.layout.fragment_home), View.OnClickListener { .centerCrop().into(iv_main) else Glide.with(requireActivity()).load(image).error(R.drawable.ic_default_profile) .centerCrop().into(iv_main) + btn_eat.setOnClickListener(this) + btn_snack.setOnClickListener(this) + txt_time_line.setOnClickListener(this) + iv_select.setOnClickListener(this) } override fun onClick(view: View?) { @@ -58,6 +62,21 @@ class HomeFragment : Fragment(R.layout.fragment_home), View.OnClickListener { } } + private fun observe() { + val dogId = sharedDog.getInt(SharedDog.DOG_ID_KEY, -1) + if (dogId == -1) return + homeViewModel.getMealLatest(dogId).observe(requireActivity(), Observer { resultData -> + when(resultData) { + is ResultData.Loading -> homeViewModel.updateMealLatest("로딩 중") + is ResultData.Success -> homeViewModel.updateMealLatest(resultData.data!!.content!!) + else -> homeViewModel.updateMealLatest("로딩 중") + } + }) + homeViewModel.currentMealLatest.observe(requireActivity(), Observer { + txt_status_time.text = it + }) + } + private fun clickTimeline() { startActivity(Intent(requireContext(), TimelineActivity::class.java)) activity?.overridePendingTransition(R.anim.animation_slide_down, R.anim.animation_slide_up) diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeViewModel.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeViewModel.kt new file mode 100644 index 0000000..2c0bdc7 --- /dev/null +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeViewModel.kt @@ -0,0 +1,30 @@ +package com.example.noogabab.presentation.ui.main.home + +import androidx.hilt.lifecycle.ViewModelInject +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.liveData +import com.example.noogabab.data.api.model.ResultData +import com.example.noogabab.domain.usecase.DogUseCase + +class HomeViewModel @ViewModelInject constructor(private val useCase: DogUseCase): ViewModel() { + private val _currentMealLatest = MutableLiveData() + + init { + _currentMealLatest.value = "불러오는 중" + } + + val currentMealLatest: LiveData + get() = _currentMealLatest + + fun getMealLatest(dogId: Int) = + liveData { + emit(ResultData.Loading()) + emit(useCase.getMealLatest(dogId)) + } + + fun updateMealLatest(input: String) { + _currentMealLatest.value = "최근 식사 $input" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt index 59f69e0..6928f0f 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt @@ -2,6 +2,7 @@ package com.example.noogabab.presentation.ui.main.timeline import android.icu.text.SimpleDateFormat import android.text.Html +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -37,7 +38,7 @@ class TimelineViewHolder(private val view: View): RecyclerView.ViewHolder(view) fun bind(prev: PresenterTimeLine?, item: PresenterTimeLine, next: PresenterTimeLine?) { with(view) { val subContentArr = item.subContent.split(" ") - txt_timeline_time.text = formatDate(item.time, "hh:mm") + txt_timeline_time.text = formatDate(item.time, "HH:mm") img_timeline.setImageDrawable(item.icon) txt_timeline_content.text = item.content txt_timeline_sub_content.text = Html.fromHtml("" + subContentArr[0] +" " + subContentArr[1]) @@ -70,13 +71,22 @@ class TimelineViewHolder(private val view: View): RecyclerView.ViewHolder(view) val prevDate = Date(prev.time) val itemDate = Date(item.time) - - return itemDate.before(prevDate) + return (prevDate.day != itemDate.day) } private fun getDateString(timestamp: Long): String { - val nowDate = Date().time / 1000 / 60 / 60 / 24 - val thenDate = timestamp / 1000 / 60 / 60 / 24 + val nowDate = System.currentTimeMillis() / 1000 / 60 / 60 + val thenDate = timestamp / 1000 / 60 / 60 + + /* test code + val testNow = System.currentTimeMillis() + val sdf = SimpleDateFormat("yyyy-MM-dd") + val currentDate = sdf.format(Date(testNow)) + val latestDate = sdf.format(Date(timestamp)) + Log.d("zzzz", "getDateString: $currentDate") + Log.d("zzzz", "getDateString: $latestDate") + Log.d("zzzz", "getDateString: $nowDate") + Log.d("zzzz", "getDateString: $thenDate") */ return when { thenDate > nowDate -> view.context.getString(R.string.app_name) diff --git a/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt b/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt index 9024291..739bfb4 100644 --- a/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt +++ b/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt @@ -1,7 +1,7 @@ package com.example.noogabab.util object NetworkConstants { - const val BASE_URL = "http://13.125.103.179:9000/api/" + const val BASE_URL = "http://10.0.2.2:8080/api/" // groups const val URL_GROUPS = "groups" @@ -18,5 +18,6 @@ object NetworkConstants { const val URL_DOGS = "dogs" const val URL_DOGS_DOG = "dogs/{dogId}" const val URL_DOGS_MEAL = "dogs/{dogId}/meal" + const val URL_DOGS_MEAL_LATEST = "dogs/{dogId}/meal/latest" const val URL_DOGS_SNACK = "dogs/{dogId}/snack" } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_month_chart.xml b/app/src/main/res/layout/fragment_month_chart.xml index 97a82dd..29983a4 100644 --- a/app/src/main/res/layout/fragment_month_chart.xml +++ b/app/src/main/res/layout/fragment_month_chart.xml @@ -7,12 +7,12 @@ tools:context=".presentation.ui.main.chart.MonthChartFragment"> + + + android:textSize="14sp" + android:textStyle="normal" /> + android:fontFamily="@font/noto_sans_cjkkr_regular" + android:gravity="center" + android:lineSpacingExtra="10sp" + android:text="⬤ 간식" + android:textColor="@color/color_ffb254" + android:textSize="14sp" + android:textStyle="normal" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_week_chart.xml b/app/src/main/res/layout/fragment_week_chart.xml index daa2485..c2c62df 100644 --- a/app/src/main/res/layout/fragment_week_chart.xml +++ b/app/src/main/res/layout/fragment_week_chart.xml @@ -7,12 +7,12 @@ tools:context=".presentation.ui.main.chart.WeekChartFragment"> + + + android:textSize="14sp" + android:textStyle="normal" /> + android:fontFamily="@font/noto_sans_cjkkr_regular" + android:gravity="center" + android:lineSpacingExtra="10sp" + android:text="⬤ 간식" + android:textColor="@color/color_ffb254" + android:textSize="14sp" + android:textStyle="normal" /> Date: Thu, 25 Feb 2021 16:55:31 +0900 Subject: [PATCH 2/7] Add: Chart View Model --- .../presentation/ui/main/MainViewModel.kt | 6 - .../ui/main/chart/ChartViewModel.kt | 56 +++++++++ .../ui/main/chart/MonthChartFragment.kt | 29 ----- .../ui/main/chart/WeekChartFragment.kt | 114 +++++++++++------- .../ui/main/timeline/TimelineAdapter.kt | 4 +- .../start/createGroup/CreateGroupViewModel.kt | 7 +- .../example/noogabab/util/NetworkConstants.kt | 2 +- 7 files changed, 135 insertions(+), 83 deletions(-) create mode 100644 app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/MainViewModel.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/MainViewModel.kt index 92f21a2..b55cbe0 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/MainViewModel.kt @@ -18,12 +18,6 @@ class MainViewModel @ViewModelInject constructor(private val groupUseCase: Group _currentLatestTimeline.value= "로딩 중" _currentDogProfile.value = null } - - fun getChart(key: String, groupId: Int, type: String, date: String) = - liveData { - emit(ResultData.Loading()) - emit(groupUseCase.getGroupStatistics(key, groupId, type, date)) - } } diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt new file mode 100644 index 0000000..692c0a9 --- /dev/null +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt @@ -0,0 +1,56 @@ +package com.example.noogabab.presentation.ui.main.chart + +import android.annotation.SuppressLint +import androidx.hilt.lifecycle.ViewModelInject +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.liveData +import com.example.noogabab.data.api.model.ResultData +import com.example.noogabab.domain.usecase.GroupUseCase +import java.text.SimpleDateFormat +import java.util.* +import kotlin.collections.ArrayList + +@SuppressLint("SimpleDateFormat") +class ChartViewModel @ViewModelInject constructor(private val groupUseCase: GroupUseCase): ViewModel() { + private val _currentXGroups = MutableLiveData>() + private val _currentYBobs = MutableLiveData() + private val _currentYSnacks = MutableLiveData() + private val _currentDate = MutableLiveData() + + init { + val sdf = SimpleDateFormat("yyyy-MM-dd") + _currentXGroups.value = ArrayList() + _currentYBobs.value = floatArrayOf() + _currentYSnacks.value = floatArrayOf() + _currentDate.value = sdf.format(Date(System.currentTimeMillis())) + } + + fun getStatistics(key: String, groupId: Int, type: String, date: String) = liveData { + emit(ResultData.Loading()) + emit(groupUseCase.getGroupStatistics(key, groupId, type, date)) + } + + val currentXGroups: LiveData> + get() = _currentXGroups + + val currentDate: LiveData + get() = _currentDate + + val currentYBobs: FloatArray? + get() = _currentYBobs.value + + val currentYSnacks: FloatArray? + get() = _currentYSnacks.value + + fun updateChart(xGroups: ArrayList, yBobs: FloatArray, ySnacks: FloatArray) { + _currentXGroups.value = xGroups + _currentYBobs.value = yBobs + _currentYSnacks.value = ySnacks + } + + fun updateDate(input: String) { + _currentDate.value = input + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt index 439f1f0..e8866e3 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt @@ -4,18 +4,14 @@ import android.content.Context import android.content.SharedPreferences import android.graphics.Color import android.os.Bundle -import android.util.Log import androidx.fragment.app.Fragment import android.view.View import android.widget.ImageView import android.widget.LinearLayout import android.widget.Toast import androidx.core.view.get -import androidx.fragment.app.activityViewModels import androidx.lifecycle.Observer import com.example.noogabab.R -import com.example.noogabab.data.api.model.ResultData -import com.example.noogabab.presentation.ui.main.MainViewModel import com.example.noogabab.util.SharedGroup import com.github.mikephil.charting.components.Legend import com.github.mikephil.charting.components.XAxis @@ -31,7 +27,6 @@ import kotlin.collections.ArrayList class MonthChartFragment : Fragment(R.layout.fragment_month_chart), View.OnClickListener { - private val mainViewModel: MainViewModel by activityViewModels() private var groupSize = 0 private var xGroup: ArrayList = ArrayList() private lateinit var yBob: FloatArray @@ -56,30 +51,6 @@ class MonthChartFragment : Fragment(R.layout.fragment_month_chart), View.OnClick btn_month_rank_snack.setOnClickListener(this) } - private fun observe(s: SharedPreferences) { - mainViewModel.getChart( - s.getString(SharedGroup.GROUP_UUID_KEY, "")!!, - s.getInt(SharedGroup.GROUP_ID_KEY, -1), - "week", - "2021-02-04" - ).observe(requireActivity(), Observer { resultData -> - when(resultData) { - is ResultData.Loading -> {} - is ResultData.Success -> { - - } - is ResultData.Failed -> { - Toast.makeText(requireContext(), getString(R.string.toast_server_failed), Toast.LENGTH_SHORT).show() - } - else -> { - Toast.makeText(requireContext(), getString(R.string.toast_server_failed), Toast.LENGTH_SHORT).show() - } - } - }) - } - - - private fun getFirst(size: Int, position: Int) { for (i in 0 until size) linear_month_rank[i].visibility = View.INVISIBLE linear_month_rank[position].visibility = View.VISIBLE diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt index d34b85b..6addfe3 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt @@ -1,5 +1,7 @@ package com.example.noogabab.presentation.ui.main.chart +import android.content.Context +import android.content.SharedPreferences import android.graphics.Color import android.os.Bundle import androidx.fragment.app.Fragment @@ -8,7 +10,10 @@ import android.widget.ImageView import android.widget.LinearLayout import android.widget.Toast import androidx.core.view.get +import androidx.fragment.app.activityViewModels import com.example.noogabab.R +import com.example.noogabab.data.api.model.ResultData +import com.example.noogabab.util.SharedGroup import com.github.mikephil.charting.components.Legend import com.github.mikephil.charting.components.XAxis import com.github.mikephil.charting.data.BarData @@ -16,23 +21,25 @@ import com.github.mikephil.charting.data.BarDataSet import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.interfaces.datasets.IBarDataSet import com.google.android.material.datepicker.MaterialDatePicker -import kotlinx.android.synthetic.main.fragment_month_chart.* import kotlinx.android.synthetic.main.fragment_week_chart.* import java.text.SimpleDateFormat import java.util.* import kotlin.collections.ArrayList class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickListener { - private var groupSize = 0 - private var xGroup: ArrayList = ArrayList() - private lateinit var yBob: FloatArray - private lateinit var ySnack: FloatArray + private val chartViewModel: ChartViewModel by activityViewModels() + private lateinit var sharedGroup: SharedPreferences + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + sharedGroup = requireActivity().getSharedPreferences(SharedGroup.NAME, Context.MODE_PRIVATE); + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setValues() load() + observe() } private fun load() { @@ -41,29 +48,47 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi btn_select_week_date.setOnClickListener(this) } + private fun observe() { + chartViewModel.currentDate.observe(requireActivity(), androidx.lifecycle.Observer { + getStatistics(it) + }) + chartViewModel.currentXGroups.observe(requireActivity(), androidx.lifecycle.Observer { + setBarChartValues(it, chartViewModel.currentYBobs!!, chartViewModel.currentYSnacks!!) + for (i in 0 until it.size) linear_week_rank.addView(createRankImage()) + }) + } + private fun getStatistics(date: String) { + val key = sharedGroup.getString(SharedGroup.GROUP_UUID_KEY, "") + val groupId = sharedGroup.getInt(SharedGroup.GROUP_ID_KEY, -1) + + chartViewModel.getStatistics(key!!, groupId, "week", date).observe(requireActivity(), androidx.lifecycle.Observer { resultData -> + when(resultData) { + is ResultData.Loading -> {} + is ResultData.Success -> { + val mealsData = resultData.data!!.statisticsData!!.mealRankData!! + val snacksData = resultData.data!!.statisticsData!!.snackRankData!! + val users = mealsData.map { it.name!! } + val mealsCount = mealsData.map { it.cnt!!.toFloat() } + val snacksCount = snacksData.map { it.cnt!!.toFloat() } + chartViewModel.updateChart( + users as ArrayList, + mealsCount.toFloatArray(), + snacksCount.toFloatArray() + ) + } + else -> { + Toast.makeText(requireContext(), "err", Toast.LENGTH_LONG).show() + } + } + }) + } private fun getFirst(size: Int, position: Int) { for (i in 0 until size) linear_week_rank[i].visibility = View.INVISIBLE linear_week_rank[position].visibility = View.VISIBLE } - // 서버에서 가져온 데이터를 셋팅 - private fun setValues() { - xGroup.add("나") - xGroup.add("엄마") - xGroup.add("아빠") - xGroup.add("누나") - groupSize = xGroup.size - yBob = floatArrayOf(5.0f, 6f, 7.8f, 1.4f) - ySnack = floatArrayOf(5.0f, 2f, 9.6f, 2.4f) - - setBarChartValues(xGroup, yBob, ySnack) - - // 가족 구성원에 맞춰서 INVISIBLE 뷰 셋팅 - for (i in 0 until groupSize) linear_week_rank.addView(createRankImage()) - } - private fun createRankImage(): ImageView { val rankImage = ImageView(context) rankImage.visibility = View.INVISIBLE @@ -77,7 +102,6 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi return rankImage } - private fun setBarChartValues( xValues: ArrayList, yAxis1: FloatArray, @@ -138,29 +162,31 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi override fun onClick(view: View?) { when(view) { - btn_select_week_date -> snackRankClick() - btn_week_rank_bob -> bobRankClick() - btn_week_rank_snack -> selectDate() + btn_select_week_date -> selectDate() + btn_week_rank_bob -> {} + btn_week_rank_snack -> {} } } - private fun bobRankClick() { - var position = 0 - var max = -1f - for (i in yBob.indices) if (max < yBob[i]) { - max = yBob[i]; position = i - } - getFirst(groupSize, position) - } - - private fun snackRankClick() { - var position = 0 - var max = -1f - for (i in ySnack.indices) if (max < ySnack[i]) { - max = ySnack[i]; position = i - } - getFirst(groupSize, position) - } +// private fun bobRankClick() { +// var position = 0 +// var max = -1f +// val yBobs = chartViewModel.currentYBobs!! +// for (i in yBobs.indices) if (max < yBobs[i]) { +// max = yBobs[i]; position = i +// } +// getFirst(yBobs.size, position) +// } + +// private fun snackRankClick() { +// var position = 0 +// var max = -1f +// val ySnacks = chartViewModel.currentYSnacks!! +// for (i in ySnacks.indices) if (max < ySnacks[i]) { +// max = ySnacks[i]; position = i +// } +// getFirst(ySnacks.size, position) +// } private fun selectDate() { val datePicker = MaterialDatePicker.Builder.datePicker() @@ -170,7 +196,7 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi datePicker.addOnPositiveButtonClickListener { val sdf = SimpleDateFormat("yyyy-MM-dd") val formatTime = sdf.format(Date(it)) - Toast.makeText(requireContext(), formatTime, Toast.LENGTH_LONG).show() + chartViewModel.updateDate(formatTime) } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt index 6928f0f..7346534 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt @@ -75,8 +75,8 @@ class TimelineViewHolder(private val view: View): RecyclerView.ViewHolder(view) } private fun getDateString(timestamp: Long): String { - val nowDate = System.currentTimeMillis() / 1000 / 60 / 60 - val thenDate = timestamp / 1000 / 60 / 60 + val nowDate = System.currentTimeMillis() / 1000 / 60 / 60 / 24 + val thenDate = timestamp / 1000 / 60 / 60 / 24 /* test code val testNow = System.currentTimeMillis() diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/start/createGroup/CreateGroupViewModel.kt b/app/src/main/java/com/example/noogabab/presentation/ui/start/createGroup/CreateGroupViewModel.kt index 305f7ad..664ac11 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/start/createGroup/CreateGroupViewModel.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/start/createGroup/CreateGroupViewModel.kt @@ -27,7 +27,12 @@ class CreateGroupViewModel @ViewModelInject constructor(private val useCase: Gro fun createGroupAndDog() = liveData { val bobTimes = ArrayList() - for (i in _currentBobTimes.value!!) bobTimes.add(i.time) + for (i in _currentBobTimes.value!!) { + if (i.meridiem == "오후") { + val temp = i.time.split(":") + bobTimes.add((temp[0].toInt() + 12).toString() + ":" + temp[1]) + } else bobTimes.add(i.time) + } val createGroupRequest = CreateGroupRequest( _currentDogName.value, _currentDogAge.value, diff --git a/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt b/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt index 739bfb4..5ae9244 100644 --- a/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt +++ b/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt @@ -1,7 +1,7 @@ package com.example.noogabab.util object NetworkConstants { - const val BASE_URL = "http://10.0.2.2:8080/api/" + const val BASE_URL = "http://13.125.103.179:9000/api/" // groups const val URL_GROUPS = "groups" From 88e8e877ec50955546aafcf181fe4bd78049cca5 Mon Sep 17 00:00:00 2001 From: bbaktaeho Date: Fri, 26 Feb 2021 11:52:39 +0900 Subject: [PATCH 3/7] =?UTF-8?q?Fix:=20Chart=20View=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/chart/ChartValueFormatter.kt | 17 +++ .../ui/main/chart/ChartViewModel.kt | 5 +- .../ui/main/chart/MonthChartFragment.kt | 11 +- .../ui/main/chart/WeekChartFragment.kt | 103 +++++++++--------- .../ui/main/timeline/TimelineActivity.kt | 31 +----- .../ui/main/timeline/TimelineAdapter.kt | 29 +++-- 6 files changed, 88 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartValueFormatter.kt diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartValueFormatter.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartValueFormatter.kt new file mode 100644 index 0000000..5f0582b --- /dev/null +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartValueFormatter.kt @@ -0,0 +1,17 @@ +package com.example.noogabab.presentation.ui.main.chart + +import com.github.mikephil.charting.data.Entry +import com.github.mikephil.charting.formatter.ValueFormatter +import com.github.mikephil.charting.utils.ViewPortHandler +import java.text.DecimalFormat + +class ChartValueFormatter: ValueFormatter { + override fun getFormattedValue( + value: Float, + entry: Entry?, + dataSetIndex: Int, + viewPortHandler: ViewPortHandler? + ): String { + return "" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt index 692c0a9..54a5038 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt @@ -20,11 +20,10 @@ class ChartViewModel @ViewModelInject constructor(private val groupUseCase: Grou private val _currentDate = MutableLiveData() init { - val sdf = SimpleDateFormat("yyyy-MM-dd") _currentXGroups.value = ArrayList() _currentYBobs.value = floatArrayOf() _currentYSnacks.value = floatArrayOf() - _currentDate.value = sdf.format(Date(System.currentTimeMillis())) + _currentDate.value = "1970-12-10" } fun getStatistics(key: String, groupId: Int, type: String, date: String) = liveData { @@ -45,9 +44,9 @@ class ChartViewModel @ViewModelInject constructor(private val groupUseCase: Grou get() = _currentYSnacks.value fun updateChart(xGroups: ArrayList, yBobs: FloatArray, ySnacks: FloatArray) { - _currentXGroups.value = xGroups _currentYBobs.value = yBobs _currentYSnacks.value = ySnacks + _currentXGroups.value = xGroups } fun updateDate(input: String) { diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt index e8866e3..c2ce3db 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt @@ -108,6 +108,7 @@ class MonthChartFragment : Fragment(R.layout.fragment_month_chart), View.OnClick // make a bar data val barData = BarData(xValues, finalBarDataSet as List) + barData.setValueFormatter(ChartValueFormatter()) chart_month_bar.apply { data = barData setBackgroundColor(Color.WHITE) @@ -124,20 +125,14 @@ class MonthChartFragment : Fragment(R.layout.fragment_month_chart), View.OnClick axisLeft.apply { textSize = 10f setDrawGridLines(true) + mAxisMinimum = 0f + } axisRight.apply { - setDrawGridLines(false) -// setDrawAxisLine(false) isEnabled = false - setDrawLabels(false) } legend.apply { isEnabled = false - formSize = 15f - form = Legend.LegendForm.CIRCLE - xEntrySpace = 30f - textSize = 14f - position = Legend.LegendPosition.ABOVE_CHART_CENTER } } } diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt index 6addfe3..5f3486e 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt @@ -1,5 +1,6 @@ package com.example.noogabab.presentation.ui.main.chart +import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import android.graphics.Color @@ -14,7 +15,6 @@ import androidx.fragment.app.activityViewModels import com.example.noogabab.R import com.example.noogabab.data.api.model.ResultData import com.example.noogabab.util.SharedGroup -import com.github.mikephil.charting.components.Legend import com.github.mikephil.charting.components.XAxis import com.github.mikephil.charting.data.BarData import com.github.mikephil.charting.data.BarDataSet @@ -37,7 +37,6 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - load() observe() } @@ -54,6 +53,7 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi }) chartViewModel.currentXGroups.observe(requireActivity(), androidx.lifecycle.Observer { setBarChartValues(it, chartViewModel.currentYBobs!!, chartViewModel.currentYSnacks!!) + linear_week_rank.removeAllViews() for (i in 0 until it.size) linear_week_rank.addView(createRankImage()) }) } @@ -62,26 +62,29 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi val key = sharedGroup.getString(SharedGroup.GROUP_UUID_KEY, "") val groupId = sharedGroup.getInt(SharedGroup.GROUP_ID_KEY, -1) - chartViewModel.getStatistics(key!!, groupId, "week", date).observe(requireActivity(), androidx.lifecycle.Observer { resultData -> - when(resultData) { - is ResultData.Loading -> {} - is ResultData.Success -> { - val mealsData = resultData.data!!.statisticsData!!.mealRankData!! - val snacksData = resultData.data!!.statisticsData!!.snackRankData!! - val users = mealsData.map { it.name!! } - val mealsCount = mealsData.map { it.cnt!!.toFloat() } - val snacksCount = snacksData.map { it.cnt!!.toFloat() } - chartViewModel.updateChart( - users as ArrayList, - mealsCount.toFloatArray(), - snacksCount.toFloatArray() - ) - } - else -> { - Toast.makeText(requireContext(), "err", Toast.LENGTH_LONG).show() + chartViewModel.getStatistics(key!!, groupId, "week", date).observe( + requireActivity(), + androidx.lifecycle.Observer { resultData -> + when (resultData) { + is ResultData.Loading -> { + } + is ResultData.Success -> { + val mealsData = resultData.data!!.statisticsData!!.mealRankData!! + val snacksData = resultData.data!!.statisticsData!!.snackRankData!! + val users = mealsData.map { it.name!! } + val mealsCount = mealsData.map { it.cnt!!.toFloat() } + val snacksCount = snacksData.map { it.cnt!!.toFloat() } + chartViewModel.updateChart( + users as ArrayList, + mealsCount.toFloatArray(), + snacksCount.toFloatArray() + ) + } + else -> { + Toast.makeText(requireContext(), "err", Toast.LENGTH_LONG).show() + } } - } - }) + }) } private fun getFirst(size: Int, position: Int) { @@ -125,7 +128,7 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi // make a bar data val barData = BarData(xValues, finalBarDataSet as List) -// barData.groupSpace = 30f + barData.setValueFormatter(ChartValueFormatter()) chart_week_bar.apply { data = barData setBackgroundColor(Color.WHITE) @@ -136,26 +139,19 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi extraBottomOffset = 20f xAxis.apply { - textSize = 14f + textSize = 12f position = XAxis.XAxisPosition.BOTTOM } axisLeft.apply { - textSize = 10f + textSize = 8f setDrawGridLines(true) + mAxisMinimum = 0f } axisRight.apply { - setDrawGridLines(false) -// setDrawAxisLine(false) isEnabled = false - setDrawLabels(false) } legend.apply { isEnabled = false - formSize = 15f - form = Legend.LegendForm.CIRCLE - xEntrySpace = 30f - textSize = 14f - position = Legend.LegendPosition.ABOVE_CHART_CENTER } } } @@ -163,31 +159,32 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi override fun onClick(view: View?) { when(view) { btn_select_week_date -> selectDate() - btn_week_rank_bob -> {} - btn_week_rank_snack -> {} + btn_week_rank_bob -> bobRankClick() + btn_week_rank_snack -> snackRankClick() } } -// private fun bobRankClick() { -// var position = 0 -// var max = -1f -// val yBobs = chartViewModel.currentYBobs!! -// for (i in yBobs.indices) if (max < yBobs[i]) { -// max = yBobs[i]; position = i -// } -// getFirst(yBobs.size, position) -// } - -// private fun snackRankClick() { -// var position = 0 -// var max = -1f -// val ySnacks = chartViewModel.currentYSnacks!! -// for (i in ySnacks.indices) if (max < ySnacks[i]) { -// max = ySnacks[i]; position = i -// } -// getFirst(ySnacks.size, position) -// } + private fun bobRankClick() { + var position = 0 + var max = -1f + val yBobs = chartViewModel.currentYBobs!! + for (i in yBobs.indices) if (max < yBobs[i]) { + max = yBobs[i]; position = i + } + getFirst(yBobs.size, position) + } + + private fun snackRankClick() { + var position = 0 + var max = -1f + val ySnacks = chartViewModel.currentYSnacks!! + for (i in ySnacks.indices) if (max < ySnacks[i]) { + max = ySnacks[i]; position = i + } + getFirst(ySnacks.size, position) + } + @SuppressLint("SimpleDateFormat") private fun selectDate() { val datePicker = MaterialDatePicker.Builder.datePicker() .setTitleText("날짜를 선택하세요") diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineActivity.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineActivity.kt index 66502ae..61b7890 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineActivity.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineActivity.kt @@ -46,33 +46,6 @@ class TimelineActivity : AppCompatActivity() { btn_timeline_close.setOnClickListener { finish() } } - private fun test() { - val dummy = ArrayList() - dummy.add(TimelineData("밥", "나 홍길동", 1613040705782, 0)) - dummy.add(TimelineData("간식", "나 홍길동", 1613040705782, 1)) - dummy.add(TimelineData("밥", "나 홍길동", 1613040705782, 0)) - dummy.add(TimelineData("밥", "나 홍길동", 1612990705782, 0)) - dummy.add(TimelineData("간식", "나 홍길동", 1612990705782, 1)) - dummy.add(TimelineData("밥", "나 홍길동", 1613040705782, 0)) - dummy.add(TimelineData("밥", "나 홍길동", 1612776760668, 0)) - dummy.add(TimelineData("밥", "나 홍길동", 1612776760668, 0)) - dummy.add(TimelineData("밥", "나 홍길동", 1612776760668, 0)) - dummy.add(TimelineData("간식", "나 홍길동", 1612275760668, 1)) - dummy.add(TimelineData("간식", "나 홍길동", 1612275760668, 1)) - dummy.add(TimelineData("간식", "나 홍길동", 1612275760668, 1)) - dummy.add(TimelineData("간식", "나 홍길동", 1612275760668, 1)) - dummy.add(TimelineData("밥", "나 홍길동", 1612275760668, 0)) - dummy.add(TimelineData("밥", "나 홍길동", 1612175760668, 0)) - dummy.add(TimelineData("밥", "나 홍길동", 1612175760668, 0)) - CoroutineScope(Dispatchers.Main).launch { - progress_timeline_loading.visibility = View.VISIBLE - val data = setPresenterTimeline(dummy) - delay(2000) - setRecyclerView(data) - progress_timeline_loading.visibility = View.GONE - } - } - private fun observe() { val timeline = timelineViewModel.getTimeline(key, groupId) timeline.observe(this, { resultData -> @@ -86,11 +59,11 @@ class TimelineActivity : AppCompatActivity() { } is ResultData.Failed -> { progress_timeline_loading.visibility = View.GONE - Toast.makeText(this, getString(R.string.toast_server_failed), Toast.LENGTH_SHORT).show() + Toast.makeText(this, "서버가 불안정합니다.", Toast.LENGTH_SHORT).show() } is ResultData.Exception -> { progress_timeline_loading.visibility = View.GONE - Toast.makeText(this, getString(R.string.toast_server_failed), Toast.LENGTH_SHORT).show() + Toast.makeText(this, "서버가 불안정합니다.", Toast.LENGTH_SHORT).show() } } }) diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt index 7346534..044e87c 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/timeline/TimelineAdapter.kt @@ -1,5 +1,6 @@ package com.example.noogabab.presentation.ui.main.timeline +import android.annotation.SuppressLint import android.icu.text.SimpleDateFormat import android.text.Html import android.util.Log @@ -74,26 +75,24 @@ class TimelineViewHolder(private val view: View): RecyclerView.ViewHolder(view) return (prevDate.day != itemDate.day) } + @SuppressLint("SimpleDateFormat") private fun getDateString(timestamp: Long): String { - val nowDate = System.currentTimeMillis() / 1000 / 60 / 60 / 24 - val thenDate = timestamp / 1000 / 60 / 60 / 24 - - /* test code - val testNow = System.currentTimeMillis() - val sdf = SimpleDateFormat("yyyy-MM-dd") - val currentDate = sdf.format(Date(testNow)) - val latestDate = sdf.format(Date(timestamp)) - Log.d("zzzz", "getDateString: $currentDate") - Log.d("zzzz", "getDateString: $latestDate") - Log.d("zzzz", "getDateString: $nowDate") - Log.d("zzzz", "getDateString: $thenDate") */ + val sdf = SimpleDateFormat("yyyy-MM-dd 00:00:00") + val t = sdf.format(timestamp) + var today = Calendar.getInstance() + + val nowDate = today.time.time + val thenDate = sdf.parse(t).time + val calcDate = (nowDate - thenDate) / (60 * 60 * 24 * 1000) return when { thenDate > nowDate -> view.context.getString(R.string.app_name) - thenDate == nowDate -> view.context.getString(R.string.today) - thenDate == nowDate - 1 -> view.context.getString(R.string.yesterday) - else -> view.context.getString(R.string.n_days_before, nowDate - thenDate) + calcDate == 0L -> view.context.getString(R.string.today) + calcDate == 1L -> view.context.getString(R.string.yesterday) + else -> view.context.getString(R.string.n_days_before, calcDate) } } + + } \ No newline at end of file From 14f6e784672ae7bb07ec78840dfd238b85ade04b Mon Sep 17 00:00:00 2001 From: bbaktaeho Date: Fri, 26 Feb 2021 14:01:55 +0900 Subject: [PATCH 4/7] =?UTF-8?q?Fix:=20=EC=9B=94=EA=B0=84=20=ED=86=B5?= =?UTF-8?q?=EA=B3=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/noogabab/data/api/ApiService.kt | 13 ++- .../domain/repository/DogRepository.kt | 3 + .../noogabab/domain/usecase/DogUseCase.kt | 12 +++ .../ui/main/chart/ChartViewModel.kt | 78 ++++++++++----- .../ui/main/chart/MonthChartFragment.kt | 96 +++++++++++++------ .../ui/main/chart/WeekChartFragment.kt | 19 ++-- 6 files changed, 155 insertions(+), 66 deletions(-) diff --git a/app/src/main/java/com/example/noogabab/data/api/ApiService.kt b/app/src/main/java/com/example/noogabab/data/api/ApiService.kt index 0bc3c75..364a990 100644 --- a/app/src/main/java/com/example/noogabab/data/api/ApiService.kt +++ b/app/src/main/java/com/example/noogabab/data/api/ApiService.kt @@ -3,6 +3,7 @@ package com.example.noogabab.data.api import com.example.noogabab.data.api.model.* import com.example.noogabab.data.api.request.CreateGroupRequest import com.example.noogabab.data.api.request.CreateUserRequest +import com.example.noogabab.data.api.request.FeedRequest import com.example.noogabab.util.NetworkConstants import okhttp3.RequestBody import retrofit2.http.* @@ -72,8 +73,16 @@ interface ApiService { suspend fun modifyDog() @POST(NetworkConstants.URL_DOGS_MEAL) - suspend fun feedMealDog() + suspend fun feedMealDog( + @Header("key") key: String, + @Path("dogId") dogId: Int, + @Body feed: FeedRequest + ): FeedModel @POST(NetworkConstants.URL_DOGS_SNACK) - suspend fun feedSnackDog() + suspend fun feedSnackDog( + @Header("key") key: String, + @Path("dogId") dogId: Int, + @Body feed: FeedRequest + ): FeedModel } \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/domain/repository/DogRepository.kt b/app/src/main/java/com/example/noogabab/domain/repository/DogRepository.kt index a9ad423..5a57dfc 100644 --- a/app/src/main/java/com/example/noogabab/domain/repository/DogRepository.kt +++ b/app/src/main/java/com/example/noogabab/domain/repository/DogRepository.kt @@ -1,10 +1,13 @@ package com.example.noogabab.domain.repository import com.example.noogabab.data.api.ApiService +import com.example.noogabab.data.api.request.FeedRequest import okhttp3.Headers import javax.inject.Inject class DogRepository @Inject constructor(private val apiService: ApiService) { suspend fun getDog(key: String) = apiService.getDog(key) suspend fun getMealLatest(dogId: Int) = apiService.getMealLatest(dogId) + suspend fun feedMeal(key: String, dogId: Int, feed: FeedRequest) = apiService.feedMealDog(key, dogId, feed) + suspend fun feedSnack(key: String, dogId: Int, feed: FeedRequest) = apiService.feedSnackDog(key, dogId, feed) } \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/domain/usecase/DogUseCase.kt b/app/src/main/java/com/example/noogabab/domain/usecase/DogUseCase.kt index 4095d63..aed2e7c 100644 --- a/app/src/main/java/com/example/noogabab/domain/usecase/DogUseCase.kt +++ b/app/src/main/java/com/example/noogabab/domain/usecase/DogUseCase.kt @@ -1,8 +1,10 @@ package com.example.noogabab.domain.usecase +import com.example.noogabab.data.api.model.FeedModel import com.example.noogabab.data.api.model.GetDogModel import com.example.noogabab.data.api.model.MealLatestModel import com.example.noogabab.data.api.model.ResultData +import com.example.noogabab.data.api.request.FeedRequest import com.example.noogabab.domain.repository.DogRepository import javax.inject.Inject @@ -17,4 +19,14 @@ class DogUseCase @Inject constructor(private val dogRepository: DogRepository) { return if (mealLatest.success) ResultData.Success(mealLatest) else ResultData.Failed(mealLatest.message) } + suspend fun feedMeal(key: String, dogId: Int, feed: FeedRequest): ResultData { + val res = dogRepository.feedMeal(key, dogId, feed) + return if (res.success) ResultData.Success(res) + else ResultData.Failed(res.message) + } + suspend fun feedSnack(key: String, dogId: Int, feed: FeedRequest): ResultData { + val res = dogRepository.feedSnack(key, dogId, feed) + return if (res.success) ResultData.Success(res) + else ResultData.Failed(res.message) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt index 54a5038..82b651b 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/ChartViewModel.kt @@ -8,22 +8,27 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.liveData import com.example.noogabab.data.api.model.ResultData import com.example.noogabab.domain.usecase.GroupUseCase -import java.text.SimpleDateFormat -import java.util.* import kotlin.collections.ArrayList -@SuppressLint("SimpleDateFormat") class ChartViewModel @ViewModelInject constructor(private val groupUseCase: GroupUseCase): ViewModel() { - private val _currentXGroups = MutableLiveData>() - private val _currentYBobs = MutableLiveData() - private val _currentYSnacks = MutableLiveData() - private val _currentDate = MutableLiveData() + private val _currentWeekXGroups = MutableLiveData>() + private val _currentWeekYBobs = MutableLiveData() + private val _currentWeekYSnacks = MutableLiveData() + private val _currentMonthXGroups = MutableLiveData>() + private val _currentMonthYBobs = MutableLiveData() + private val _currentMonthYSnacks = MutableLiveData() + private val _currentWeekDate = MutableLiveData() + private val _currentMonthDate = MutableLiveData() init { - _currentXGroups.value = ArrayList() - _currentYBobs.value = floatArrayOf() - _currentYSnacks.value = floatArrayOf() - _currentDate.value = "1970-12-10" + _currentWeekXGroups.value = ArrayList() + _currentWeekYBobs.value = floatArrayOf() + _currentWeekYSnacks.value = floatArrayOf() + _currentMonthXGroups.value = ArrayList() + _currentMonthYBobs.value = floatArrayOf() + _currentMonthYSnacks.value = floatArrayOf() + _currentWeekDate.value = "1970-12-10" + _currentMonthDate.value = "1970-12-10" } fun getStatistics(key: String, groupId: Int, type: String, date: String) = liveData { @@ -31,25 +36,48 @@ class ChartViewModel @ViewModelInject constructor(private val groupUseCase: Grou emit(groupUseCase.getGroupStatistics(key, groupId, type, date)) } - val currentXGroups: LiveData> - get() = _currentXGroups + val currentWeekXGroups: LiveData> + get() = _currentWeekXGroups - val currentDate: LiveData - get() = _currentDate + val currentWeekDate: LiveData + get() = _currentWeekDate - val currentYBobs: FloatArray? - get() = _currentYBobs.value + val currentWeekYBobs: FloatArray? + get() = _currentWeekYBobs.value - val currentYSnacks: FloatArray? - get() = _currentYSnacks.value + val currentWeekYSnacks: FloatArray? + get() = _currentWeekYSnacks.value + + val currentMonthXGroups: LiveData> + get() = _currentMonthXGroups + + val currentMonthDate: LiveData + get() = _currentMonthDate + + val currentMonthYBobs: FloatArray? + get() = _currentMonthYBobs.value + + val currentMonthYSnacks: FloatArray? + get() = _currentMonthYSnacks.value + + fun updateChart(xGroups: ArrayList, yBobs: FloatArray, ySnacks: FloatArray, type: String) { + when(type) { + "week" -> { + _currentWeekYBobs.value = yBobs + _currentWeekYSnacks.value = ySnacks + _currentWeekXGroups.value = xGroups // 마지막에 위치시킴 + } + "month" -> { + _currentMonthYBobs.value = yBobs + _currentMonthYSnacks.value = ySnacks + _currentMonthXGroups.value = xGroups + } + } - fun updateChart(xGroups: ArrayList, yBobs: FloatArray, ySnacks: FloatArray) { - _currentYBobs.value = yBobs - _currentYSnacks.value = ySnacks - _currentXGroups.value = xGroups } - fun updateDate(input: String) { - _currentDate.value = input + fun updateDate(input: String, type: String) { + if (type == "week") _currentWeekDate.value = input + else if (type == "month") _currentMonthDate.value = input } } \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt index c2ce3db..1cad5bc 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/MonthChartFragment.kt @@ -1,17 +1,21 @@ package com.example.noogabab.presentation.ui.main.chart +import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import android.graphics.Color import android.os.Bundle +import android.util.Log import androidx.fragment.app.Fragment import android.view.View import android.widget.ImageView import android.widget.LinearLayout import android.widget.Toast import androidx.core.view.get +import androidx.fragment.app.activityViewModels import androidx.lifecycle.Observer import com.example.noogabab.R +import com.example.noogabab.data.api.model.ResultData import com.example.noogabab.util.SharedGroup import com.github.mikephil.charting.components.Legend import com.github.mikephil.charting.components.XAxis @@ -21,16 +25,14 @@ import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.interfaces.datasets.IBarDataSet import com.google.android.material.datepicker.MaterialDatePicker import kotlinx.android.synthetic.main.fragment_month_chart.* +import kotlinx.android.synthetic.main.fragment_week_chart.* import java.text.SimpleDateFormat import java.util.* import kotlin.collections.ArrayList class MonthChartFragment : Fragment(R.layout.fragment_month_chart), View.OnClickListener { - private var groupSize = 0 - private var xGroup: ArrayList = ArrayList() - private lateinit var yBob: FloatArray - private lateinit var ySnack: FloatArray + private val chartViewModel: ChartViewModel by activityViewModels() private lateinit var sharedGroup: SharedPreferences override fun onCreate(savedInstanceState: Bundle?) { @@ -41,7 +43,7 @@ class MonthChartFragment : Fragment(R.layout.fragment_month_chart), View.OnClick override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setValues() + observe() load() } @@ -51,25 +53,58 @@ class MonthChartFragment : Fragment(R.layout.fragment_month_chart), View.OnClick btn_month_rank_snack.setOnClickListener(this) } - private fun getFirst(size: Int, position: Int) { - for (i in 0 until size) linear_month_rank[i].visibility = View.INVISIBLE - linear_month_rank[position].visibility = View.VISIBLE - } + private fun observe() { + chartViewModel.currentMonthDate.observe(requireActivity(), androidx.lifecycle.Observer { + getStatistics(it) + }) + chartViewModel.currentMonthXGroups.observe(requireActivity(), androidx.lifecycle.Observer { + if (it.isEmpty()) getStatistics("1970-12-10") + else { + setBarChartValues( + it, + chartViewModel.currentMonthYBobs!!, + chartViewModel.currentMonthYSnacks!! + ) + linear_month_rank.removeAllViews() + for (i in 0 until it.size) linear_month_rank.addView(createRankImage()) + } - // 서버에서 가져온 데이터를 셋팅 - private fun setValues() { - xGroup.add("나") - xGroup.add("엄마") - xGroup.add("아빠") - xGroup.add("누나") - groupSize = xGroup.size - yBob = floatArrayOf(2.0f, 6f, 7.8f, 3.4f) - ySnack = floatArrayOf(1.0f, 7f, 3.8f, 8.4f) + }) + } - setBarChartValues(xGroup, yBob, ySnack) + private fun getStatistics(date: String) { + val key = sharedGroup.getString(SharedGroup.GROUP_UUID_KEY, "") + val groupId = sharedGroup.getInt(SharedGroup.GROUP_ID_KEY, -1) + + chartViewModel.getStatistics(key!!, groupId, "month", date).observe( + requireActivity(), + androidx.lifecycle.Observer { resultData -> + when (resultData) { + is ResultData.Loading -> { + } + is ResultData.Success -> { + val mealsData = resultData.data!!.statisticsData!!.mealRankData!! + val snacksData = resultData.data!!.statisticsData!!.snackRankData!! + val users = mealsData.map { it.name!! } + val mealsCount = mealsData.map { it.cnt!!.toFloat() } + val snacksCount = snacksData.map { it.cnt!!.toFloat() } + chartViewModel.updateChart( + users as ArrayList, + mealsCount.toFloatArray(), + snacksCount.toFloatArray(), + "month" + ) + } + else -> { + Toast.makeText(requireContext(), "err", Toast.LENGTH_LONG).show() + } + } + }) + } - // 가족 구성원에 맞춰서 INVISIBLE 뷰 셋팅 - for (i in 0 until groupSize) linear_month_rank.addView(createRankImage()) + private fun getFirst(size: Int, position: Int) { + for (i in 0 until size) linear_month_rank[i].visibility = View.INVISIBLE + linear_month_rank[position].visibility = View.VISIBLE } private fun createRankImage(): ImageView { @@ -148,23 +183,24 @@ class MonthChartFragment : Fragment(R.layout.fragment_month_chart), View.OnClick private fun bobRankClick() { var position = 0 var max = -1f - for (i in yBob.indices) if (max < yBob[i]) { - max = yBob[i]; - position = i + val yBobs = chartViewModel.currentMonthYBobs!! + for (i in yBobs.indices) if (max < yBobs[i]) { + max = yBobs[i]; position = i } - getFirst(groupSize, position) + if (max != 0f) getFirst(yBobs.size, position) } private fun snackRankClick() { var position = 0 var max = -1f - for (i in ySnack.indices) if (max < ySnack[i]) { - max = ySnack[i]; - position = i + val ySnacks = chartViewModel.currentMonthYSnacks!! + for (i in ySnacks.indices) if (max < ySnacks[i]) { + max = ySnacks[i]; position = i } - getFirst(groupSize, position) + if (max != 0f) getFirst(ySnacks.size, position) } + @SuppressLint("SimpleDateFormat") private fun selectDate() { val datePicker = MaterialDatePicker.Builder.datePicker() .setTitleText("날짜를 선택하세요") @@ -173,7 +209,7 @@ class MonthChartFragment : Fragment(R.layout.fragment_month_chart), View.OnClick datePicker.addOnPositiveButtonClickListener { val sdf = SimpleDateFormat("yyyy-MM-dd") val formatTime = sdf.format(Date(it)) - Toast.makeText(requireContext(), formatTime, Toast.LENGTH_LONG).show() + chartViewModel.updateDate(formatTime, "month") } } diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt index 5f3486e..676fe57 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/chart/WeekChartFragment.kt @@ -48,11 +48,11 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi } private fun observe() { - chartViewModel.currentDate.observe(requireActivity(), androidx.lifecycle.Observer { + chartViewModel.currentWeekDate.observe(requireActivity(), androidx.lifecycle.Observer { getStatistics(it) }) - chartViewModel.currentXGroups.observe(requireActivity(), androidx.lifecycle.Observer { - setBarChartValues(it, chartViewModel.currentYBobs!!, chartViewModel.currentYSnacks!!) + chartViewModel.currentWeekXGroups.observe(requireActivity(), androidx.lifecycle.Observer { + setBarChartValues(it, chartViewModel.currentWeekYBobs!!, chartViewModel.currentWeekYSnacks!!) linear_week_rank.removeAllViews() for (i in 0 until it.size) linear_week_rank.addView(createRankImage()) }) @@ -77,7 +77,8 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi chartViewModel.updateChart( users as ArrayList, mealsCount.toFloatArray(), - snacksCount.toFloatArray() + snacksCount.toFloatArray(), + "week" ) } else -> { @@ -167,21 +168,21 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi private fun bobRankClick() { var position = 0 var max = -1f - val yBobs = chartViewModel.currentYBobs!! + val yBobs = chartViewModel.currentWeekYBobs!! for (i in yBobs.indices) if (max < yBobs[i]) { max = yBobs[i]; position = i } - getFirst(yBobs.size, position) + if (max != 0f) getFirst(yBobs.size, position) } private fun snackRankClick() { var position = 0 var max = -1f - val ySnacks = chartViewModel.currentYSnacks!! + val ySnacks = chartViewModel.currentWeekYSnacks!! for (i in ySnacks.indices) if (max < ySnacks[i]) { max = ySnacks[i]; position = i } - getFirst(ySnacks.size, position) + if (max != 0f) getFirst(ySnacks.size, position) } @SuppressLint("SimpleDateFormat") @@ -193,7 +194,7 @@ class WeekChartFragment : Fragment(R.layout.fragment_week_chart), View.OnClickLi datePicker.addOnPositiveButtonClickListener { val sdf = SimpleDateFormat("yyyy-MM-dd") val formatTime = sdf.format(Date(it)) - chartViewModel.updateDate(formatTime) + chartViewModel.updateDate(formatTime, "week") } } } \ No newline at end of file From 5fc172f22925da0903d9b5f66d8021da882c1fa9 Mon Sep 17 00:00:00 2001 From: bbaktaeho Date: Fri, 26 Feb 2021 14:02:22 +0900 Subject: [PATCH 5/7] =?UTF-8?q?Add:=20=EB=B0=A5,=20=EA=B0=84=EC=8B=9D=20?= =?UTF-8?q?=EC=A3=BC=EB=8A=94=20=EB=AA=A8=EB=8D=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/noogabab/data/api/model/FeedModel.kt | 13 +++++++++++++ .../noogabab/data/api/request/FeedRequest.kt | 8 ++++++++ 2 files changed, 21 insertions(+) create mode 100644 app/src/main/java/com/example/noogabab/data/api/model/FeedModel.kt create mode 100644 app/src/main/java/com/example/noogabab/data/api/request/FeedRequest.kt diff --git a/app/src/main/java/com/example/noogabab/data/api/model/FeedModel.kt b/app/src/main/java/com/example/noogabab/data/api/model/FeedModel.kt new file mode 100644 index 0000000..a66d571 --- /dev/null +++ b/app/src/main/java/com/example/noogabab/data/api/model/FeedModel.kt @@ -0,0 +1,13 @@ +package com.example.noogabab.data.api.model + + +import com.google.gson.annotations.SerializedName + +data class FeedModel( + @SerializedName("data") + val data: Any?, + @SerializedName("message") + val message: String, + @SerializedName("success") + val success: Boolean +) \ No newline at end of file diff --git a/app/src/main/java/com/example/noogabab/data/api/request/FeedRequest.kt b/app/src/main/java/com/example/noogabab/data/api/request/FeedRequest.kt new file mode 100644 index 0000000..b6d4713 --- /dev/null +++ b/app/src/main/java/com/example/noogabab/data/api/request/FeedRequest.kt @@ -0,0 +1,8 @@ +package com.example.noogabab.data.api.request + +import com.google.gson.annotations.SerializedName + +data class FeedRequest( + @SerializedName("userId") + val userId: Int, +) From f33d3e26d04d97a19e6ad04620c5945786c7d677 Mon Sep 17 00:00:00 2001 From: bbaktaeho Date: Fri, 26 Feb 2021 14:45:23 +0900 Subject: [PATCH 6/7] =?UTF-8?q?Add:=20=EC=84=A4=EC=A0=95=ED=99=94=EB=A9=B4?= =?UTF-8?q?=20=EC=97=90=EC=85=8B=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 +- .../presentation/ui/main/MainActivity.kt | 1 + .../ui/main/setting/SettingsActivity.kt | 7 +++- .../main/res/drawable/ic_settings_arrow.xml | 13 +++++++ app/src/main/res/layout/fragment_setting.xml | 36 +++++++++---------- app/src/main/res/menu/nav_main.xml | 3 +- 6 files changed, 41 insertions(+), 22 deletions(-) create mode 100644 app/src/main/res/drawable/ic_settings_arrow.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f0afcef..2e64657 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,8 +19,6 @@ android:supportsRtl="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true"> - - + diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/MainActivity.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/MainActivity.kt index 50cc03e..d62eac7 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/MainActivity.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/MainActivity.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.widget.Toast import androidx.annotation.IdRes import androidx.core.app.ActivityCompat +import androidx.core.view.get import androidx.fragment.app.Fragment import com.example.noogabab.R import com.example.noogabab.presentation.ui.main.album.AlbumFragment diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/setting/SettingsActivity.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/setting/SettingsActivity.kt index a063b56..9419a25 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/setting/SettingsActivity.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/setting/SettingsActivity.kt @@ -9,6 +9,11 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class SettingsActivity : AppCompatActivity() { + override fun onBackPressed() { + super.onBackPressed() + finish() + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_settings) @@ -21,7 +26,7 @@ class SettingsActivity : AppCompatActivity() { } - public fun makeCurrentFragment(fragment: Fragment) = + fun makeCurrentFragment(fragment: Fragment) = supportFragmentManager.beginTransaction().apply { replace(R.id.frameLayout_settings, fragment) commit() diff --git a/app/src/main/res/drawable/ic_settings_arrow.xml b/app/src/main/res/drawable/ic_settings_arrow.xml new file mode 100644 index 0000000..f67ec9c --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_arrow.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml index 2f50362..8af42a6 100644 --- a/app/src/main/res/layout/fragment_setting.xml +++ b/app/src/main/res/layout/fragment_setting.xml @@ -60,15 +60,15 @@ android:lineSpacingExtra="9sp" android:text="푸쉬 알림" android:textColor="#3d3d3d" - android:textSize="20sp" + android:textSize="18sp" android:textStyle="normal" /> @@ -100,17 +100,17 @@ android:lineSpacingExtra="9sp" android:text="내 정보" android:textColor="#3d3d3d" - android:textSize="20sp" + android:textSize="18sp" android:textStyle="normal" /> + android:src="@drawable/ic_settings_arrow" /> + android:src="@drawable/ic_settings_arrow" /> + android:src="@drawable/ic_settings_arrow" /> @@ -221,8 +221,8 @@ android:fontFamily="@font/noto_sans_cjkkr_medium" android:lineSpacingExtra="9sp" android:text="그룹 키" - android:textColor="#1E77FC" - android:textSize="20sp" + android:textColor="@color/color_cccccc" + android:textSize="18sp" android:textStyle="normal" /> @@ -254,7 +254,7 @@ android:lineSpacingExtra="9sp" android:text="그룹 탈퇴" android:textColor="#F44336" - android:textSize="20sp" + android:textSize="18sp" android:textStyle="normal" /> - + Date: Fri, 26 Feb 2021 15:05:40 +0900 Subject: [PATCH 7/7] =?UTF-8?q?Add:=20=EB=B0=A5=20=EC=A3=BC=EA=B8=B0,=20?= =?UTF-8?q?=EA=B0=84=EC=8B=9D=20=EC=A3=BC=EA=B8=B0=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/main/home/HomeFragment.kt | 72 ++++++++++++++++--- .../ui/main/home/HomeViewModel.kt | 11 +++ .../example/noogabab/util/NetworkConstants.kt | 4 +- 3 files changed, 77 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeFragment.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeFragment.kt index 73e7f37..62cfd58 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeFragment.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeFragment.kt @@ -13,23 +13,31 @@ import androidx.lifecycle.Observer import com.bumptech.glide.Glide import com.example.noogabab.R import com.example.noogabab.data.api.model.ResultData +import com.example.noogabab.data.api.request.FeedRequest import com.example.noogabab.presentation.dialog.AlertDialog import com.example.noogabab.presentation.ui.main.MainActivity import com.example.noogabab.presentation.ui.main.MainViewModel import com.example.noogabab.presentation.ui.main.timeline.TimelineActivity import com.example.noogabab.util.SharedDog +import com.example.noogabab.util.SharedGroup import com.example.noogabab.util.SharedProfile +import com.example.noogabab.util.SharedUser import kotlinx.android.synthetic.main.fragment_home.* class HomeFragment : Fragment(R.layout.fragment_home), View.OnClickListener { private val homeViewModel: HomeViewModel by activityViewModels() private lateinit var sharedDog: SharedPreferences private lateinit var sharedProfile: SharedPreferences + private lateinit var sharedGroup: SharedPreferences + private lateinit var sharedUser: SharedPreferences override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) sharedDog = requireActivity().getSharedPreferences(SharedDog.NAME, Context.MODE_PRIVATE) - sharedProfile = requireActivity().getSharedPreferences(SharedProfile.NAME, Context.MODE_PRIVATE) + sharedProfile = + requireActivity().getSharedPreferences(SharedProfile.NAME, Context.MODE_PRIVATE) + sharedGroup = requireActivity().getSharedPreferences(SharedGroup.NAME, Context.MODE_PRIVATE) + sharedUser = requireActivity().getSharedPreferences(SharedUser.NAME, Context.MODE_PRIVATE) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -63,18 +71,22 @@ class HomeFragment : Fragment(R.layout.fragment_home), View.OnClickListener { } private fun observe() { + getLatest() + homeViewModel.currentMealLatest.observe(requireActivity(), Observer { + txt_status_time.text = it + }) + } + + private fun getLatest() { val dogId = sharedDog.getInt(SharedDog.DOG_ID_KEY, -1) if (dogId == -1) return homeViewModel.getMealLatest(dogId).observe(requireActivity(), Observer { resultData -> - when(resultData) { + when (resultData) { is ResultData.Loading -> homeViewModel.updateMealLatest("로딩 중") is ResultData.Success -> homeViewModel.updateMealLatest(resultData.data!!.content!!) else -> homeViewModel.updateMealLatest("로딩 중") } }) - homeViewModel.currentMealLatest.observe(requireActivity(), Observer { - txt_status_time.text = it - }) } private fun clickTimeline() { @@ -88,14 +100,58 @@ class HomeFragment : Fragment(R.layout.fragment_home), View.OnClickListener { private fun clickFeedBob() { AlertDialog().defaultAlert( - requireContext(), "밥을 먹일까요?", "선택한 식사는 취소가 불가능합니다.", "확인", "취소", { - }, { - }) + requireContext(), + "밥을 먹일까요?", + "선택한 식사는 취소가 불가능합니다.", + "확인", + "취소", { + homeViewModel.feedMeal( + sharedGroup.getString(SharedGroup.GROUP_UUID_KEY, "")!!, + sharedDog.getInt(SharedDog.DOG_ID_KEY, -1), + FeedRequest(sharedUser.getInt(SharedUser.USER_ID_KEY, -1)) + ).observe(requireActivity(), Observer { resultData -> + when (resultData) { + is ResultData.Loading -> { + } + is ResultData.Success -> { + Toast.makeText(requireContext(), "밥 주기 완료!", Toast.LENGTH_SHORT).show() + getLatest() + } + else -> { + Toast.makeText( + requireContext(), + getString(R.string.toast_server_exception), + Toast.LENGTH_SHORT + ).show() + } + } + }) + }, {}) } private fun clickFeedSnack() { AlertDialog().defaultAlert( requireContext(), "간식을 먹일까요?", "선택한 식사는 취소가 불가능합니다.", "확인", "취소", { + homeViewModel.feedSnack( + sharedGroup.getString(SharedGroup.GROUP_UUID_KEY, "")!!, + sharedDog.getInt(SharedDog.DOG_ID_KEY, -1), + FeedRequest(sharedUser.getInt(SharedUser.USER_ID_KEY, -1)) + ).observe(requireActivity(), Observer { resultData -> + when (resultData) { + is ResultData.Loading -> { + } + is ResultData.Success -> { + Toast.makeText(requireContext(), "간식 주기 완료!", Toast.LENGTH_SHORT).show() + } + else -> { + Toast.makeText( + requireContext(), + getString(R.string.toast_server_exception), + Toast.LENGTH_SHORT + ).show() + } + } + }) }, { }) } diff --git a/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeViewModel.kt b/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeViewModel.kt index 2c0bdc7..a008fa1 100644 --- a/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeViewModel.kt +++ b/app/src/main/java/com/example/noogabab/presentation/ui/main/home/HomeViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.liveData import com.example.noogabab.data.api.model.ResultData +import com.example.noogabab.data.api.request.FeedRequest import com.example.noogabab.domain.usecase.DogUseCase class HomeViewModel @ViewModelInject constructor(private val useCase: DogUseCase): ViewModel() { @@ -24,6 +25,16 @@ class HomeViewModel @ViewModelInject constructor(private val useCase: DogUseCase emit(useCase.getMealLatest(dogId)) } + fun feedMeal(key: String, dogId: Int, feed: FeedRequest) = liveData { + emit(ResultData.Loading()) + emit(useCase.feedMeal(key, dogId, feed)) + } + + fun feedSnack(key: String, dogId: Int, feed: FeedRequest) = liveData { + emit(ResultData.Loading()) + emit(useCase.feedSnack(key, dogId, feed)) + } + fun updateMealLatest(input: String) { _currentMealLatest.value = "최근 식사 $input" } diff --git a/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt b/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt index 5ae9244..b6d8c50 100644 --- a/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt +++ b/app/src/main/java/com/example/noogabab/util/NetworkConstants.kt @@ -17,7 +17,7 @@ object NetworkConstants { // dogs const val URL_DOGS = "dogs" const val URL_DOGS_DOG = "dogs/{dogId}" - const val URL_DOGS_MEAL = "dogs/{dogId}/meal" + const val URL_DOGS_MEAL = "dogs/{dogId}/meals" const val URL_DOGS_MEAL_LATEST = "dogs/{dogId}/meal/latest" - const val URL_DOGS_SNACK = "dogs/{dogId}/snack" + const val URL_DOGS_SNACK = "dogs/{dogId}/snacks" } \ No newline at end of file