diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..ab502a6 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Rehabilitation \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index b589d56..fb7f4a8 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 0ad17cb..54d5acd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7223ade..ff07d54 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,8 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' + id 'kotlin-kapt' + } android { @@ -36,7 +38,9 @@ android { } dependencies { - + implementation 'androidx.room:room-ktx:2.5.2' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1' + kapt 'androidx.room:room-compiler:2.5.2' implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.9.0' diff --git a/app/src/main/java/com/example/rehabilitation/Baza/TaskItem.kt b/app/src/main/java/com/example/rehabilitation/Baza/TaskItem.kt index ba2652b..23a87f0 100644 --- a/app/src/main/java/com/example/rehabilitation/Baza/TaskItem.kt +++ b/app/src/main/java/com/example/rehabilitation/Baza/TaskItem.kt @@ -1,4 +1,24 @@ package com.example.rehabilitation.Baza -class TaskItem { +import android.content.Context +import androidx.core.content.ContextCompat +import com.example.rehabilitation.R +import java.time.LocalDate +import java.time.LocalTime +import java.util.* + +class TaskItem( + var name:String, + var desc:String, + var dueTime: LocalTime?, + var completedDate:LocalDate?, + var id: UUID = UUID.randomUUID(), + ) { + fun isCompleted() = completedDate !=null + fun imageResource(): Int = if(isCompleted()) R.drawable.check_24 else R.drawable.unchecked_24 + fun imageColor(context:Context): Int = if(isCompleted()) purple(context) else black(context) + + private fun purple(context:Context) = ContextCompat.getColor(context,R.color.purple_500) + private fun black(context:Context) = ContextCompat.getColor(context,R.color.black) + } \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/Baza/TaskItemAdapter.kt b/app/src/main/java/com/example/rehabilitation/Baza/TaskItemAdapter.kt index f9270dd..3ba5d97 100644 --- a/app/src/main/java/com/example/rehabilitation/Baza/TaskItemAdapter.kt +++ b/app/src/main/java/com/example/rehabilitation/Baza/TaskItemAdapter.kt @@ -1,4 +1,25 @@ package com.example.rehabilitation.Baza -class TaskItemAdapter { +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.rehabilitation.databinding.TaskItemBinding + +class TaskItemAdapter( + private val taskItems: List, + private val clickListener: TaskItemClickListener + +):RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TaskItemViewHolder { + val from = LayoutInflater.from(parent.context) + val binding = TaskItemBinding.inflate(from,parent,false) + return TaskItemViewHolder(parent.context, binding, clickListener) + } + + override fun getItemCount(): Int = taskItems.size + + override fun onBindViewHolder(holder: TaskItemViewHolder, position: Int) { + holder.bindTaskItem(taskItems[position]) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/Baza/TaskItemClickListener.kt b/app/src/main/java/com/example/rehabilitation/Baza/TaskItemClickListener.kt index 7bdbddf..aa4e0df 100644 --- a/app/src/main/java/com/example/rehabilitation/Baza/TaskItemClickListener.kt +++ b/app/src/main/java/com/example/rehabilitation/Baza/TaskItemClickListener.kt @@ -1,4 +1,7 @@ package com.example.rehabilitation.Baza interface TaskItemClickListener { + fun editTaskItem(taskitem:TaskItem) + fun completeTaskItem(taskitem:TaskItem) + } \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/Baza/TaskItemViewHolder.kt b/app/src/main/java/com/example/rehabilitation/Baza/TaskItemViewHolder.kt index a1ef31f..4470c61 100644 --- a/app/src/main/java/com/example/rehabilitation/Baza/TaskItemViewHolder.kt +++ b/app/src/main/java/com/example/rehabilitation/Baza/TaskItemViewHolder.kt @@ -1,4 +1,41 @@ package com.example.rehabilitation.Baza -class TaskItemViewHolder { +import android.content.Context +import android.graphics.Paint +import androidx.recyclerview.widget.RecyclerView +import com.example.rehabilitation.databinding.TaskItemBinding +import java.time.format.DateTimeFormatter + +class TaskItemViewHolder( + private val context: Context, + private val binding: TaskItemBinding, + private val clickListener: TaskItemClickListener +):RecyclerView.ViewHolder(binding.root) { + + private val timeFormat = DateTimeFormatter.ofPattern("HH:mm") + fun bindTaskItem(taskItem:TaskItem){ + binding.txtName.text = taskItem.name + //binding.txtDesc.text = taskItem.desc + + if(taskItem.isCompleted()){ + binding.txtName.paintFlags = Paint.STRIKE_THRU_TEXT_FLAG + binding.txtTime.paintFlags = Paint.STRIKE_THRU_TEXT_FLAG + } + + binding.btnComplete.setBackgroundResource(taskItem.imageResource()) + binding.btnComplete.setColorFilter(taskItem.imageColor(context)) + binding.btnComplete.setOnClickListener{ + clickListener.completeTaskItem(taskItem) + } + binding.taskCellContainers.setOnClickListener{ + clickListener.editTaskItem(taskItem) + } + + if(taskItem.dueTime != null){ + binding.txtTime.text = timeFormat.format(taskItem.dueTime) + } + else{ + binding.txtTime.text = "" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/Baza/TaskViewModel.kt b/app/src/main/java/com/example/rehabilitation/Baza/TaskViewModel.kt index 5d70ca2..4b12b36 100644 --- a/app/src/main/java/com/example/rehabilitation/Baza/TaskViewModel.kt +++ b/app/src/main/java/com/example/rehabilitation/Baza/TaskViewModel.kt @@ -1,4 +1,44 @@ package com.example.rehabilitation.Baza -class TaskViewModel { +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import java.time.LocalDate +import java.time.LocalTime +import java.util.UUID + +class TaskViewModel:ViewModel() { + var taskItems = MutableLiveData>() + + init{ + taskItems.value = mutableListOf() + } + + //Добавление + fun addTaskItem(newTask:TaskItem){ + val list = taskItems.value + list!!.add(newTask) + taskItems.postValue(list!!) + } + + //Обновление + fun updateTaskItem(id: UUID, name:String, desc:String, dueTime: LocalTime?){ + val list = taskItems.value + val task = list!!.find{it.id == id}!! + task.name = name + task.desc = desc + task.dueTime = dueTime + taskItems.postValue(list!!) + } + + //Вывод + fun setCompleted(taskItem:TaskItem){ + val list = taskItems.value + val task = list!!.find{it.id == taskItem.id}!! + if(task.completedDate == null){ + task.completedDate = LocalDate.now() + } + taskItems.postValue(list!!) + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/db/Dao.kt b/app/src/main/java/com/example/rehabilitation/db/Dao.kt index 1a6171f..f29c941 100644 --- a/app/src/main/java/com/example/rehabilitation/db/Dao.kt +++ b/app/src/main/java/com/example/rehabilitation/db/Dao.kt @@ -1,4 +1,14 @@ package com.example.rehabilitation.db +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import kotlinx.coroutines.flow.Flow + +@Dao interface Dao { + @Insert + fun insertItem(item:Item) + @Query("SELECT * FROM items") + fun getAllItems(): Flow> } \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/db/Item.kt b/app/src/main/java/com/example/rehabilitation/db/Item.kt index b003481..97890d3 100644 --- a/app/src/main/java/com/example/rehabilitation/db/Item.kt +++ b/app/src/main/java/com/example/rehabilitation/db/Item.kt @@ -1,3 +1,16 @@ package com.example.rehabilitation.db -data class Item() +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "items") +data class Item( + @PrimaryKey(autoGenerate = true) + var id:Int? = null, + @ColumnInfo(name = "name") + var name:String, + @ColumnInfo(name = "price") + var price:String, + + ) diff --git a/app/src/main/java/com/example/rehabilitation/db/MainDB.kt b/app/src/main/java/com/example/rehabilitation/db/MainDB.kt index 22c761c..bf40c2f 100644 --- a/app/src/main/java/com/example/rehabilitation/db/MainDB.kt +++ b/app/src/main/java/com/example/rehabilitation/db/MainDB.kt @@ -1,4 +1,20 @@ package com.example.rehabilitation.db -class MainDB { +import androidx.room.Room +import androidx.room.RoomDatabase +import android.content.Context +import androidx.room.Database + +@Database(entities = [Item::class], version = 1) +abstract class MainDB: RoomDatabase() { + abstract fun getDao(): Dao + companion object{ + fun getDB(context: Context):MainDB{ + return Room.databaseBuilder( + context.applicationContext, + MainDB::class.java, + "tests.db" + ).build() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/fragment/User/SceduleFragment.kt b/app/src/main/java/com/example/rehabilitation/fragment/User/SceduleFragment.kt index 518627a..f44dfed 100644 --- a/app/src/main/java/com/example/rehabilitation/fragment/User/SceduleFragment.kt +++ b/app/src/main/java/com/example/rehabilitation/fragment/User/SceduleFragment.kt @@ -5,12 +5,19 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import com.example.rehabilitation.R +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.example.rehabilitation.Baza.TaskItem +import com.example.rehabilitation.Baza.TaskItemAdapter +import com.example.rehabilitation.Baza.TaskItemClickListener +import com.example.rehabilitation.Baza.TaskViewModel import com.example.rehabilitation.databinding.FragmentSceduleBinding -class SceduleFragment : Fragment() { +class SceduleFragment(var taskItem: TaskItem?) : Fragment(), TaskItemClickListener { private lateinit var binding: FragmentSceduleBinding + private lateinit var taskViewModel: TaskViewModel + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -19,7 +26,84 @@ class SceduleFragment : Fragment() { return binding.root } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + //Закрытие карточки определенного дня + binding.btnExitCardSport.setOnClickListener { + binding.CLCardSport.visibility = View.GONE + binding.CLListSport.visibility = View.VISIBLE + binding.txtNameCard.setText("") + binding.txtDescCard.setText("") + } + + if(taskItem != null){ + binding.CLCardSport.visibility = View.VISIBLE + binding.CLListSport.visibility = View.GONE + binding.txtNameCard.text = taskItem!!.name + binding.txtDescCard.text = taskItem!!.desc + } + else{ + binding.CLCardSport.visibility = View.GONE + binding.CLListSport.visibility = View.VISIBLE + } + + taskViewModel = ViewModelProvider(requireActivity()).get(TaskViewModel::class.java) + binding.btnSave.setOnClickListener { + saveAction() + } + + setRecycleView() + + } + + private fun setRecycleView() { + taskViewModel.taskItems.observe(requireActivity()){ + binding.todoListRecycleView.apply { + layoutManager = LinearLayoutManager(activity?.applicationContext) + adapter = TaskItemAdapter(it,this@SceduleFragment) + } + } + } + + private fun saveAction() { + val name = binding.edName.text.toString() + val desc = binding.edDesc.text.toString() + + if(taskItem == null){ + val newTask = TaskItem(name,desc,null,null) + taskViewModel.addTaskItem(newTask) + } + else{ + taskViewModel.updateTaskItem(taskItem!!.id,name,desc,null) + } + binding.edName.setText("") + binding.edDesc.setText("") + } + + override fun onResume() { + super.onResume() + + } + + override fun onDestroy() { + super.onDestroy() + + } + companion object { - fun newInstance() = SceduleFragment() + fun newInstance() = SceduleFragment(null) + } + + override fun editTaskItem(taskitem: TaskItem) { + binding.CLCardSport.visibility = View.VISIBLE + binding.CLListSport.visibility = View.GONE + + binding.txtNameCard.setText(taskitem.name) + binding.txtDescCard.setText(taskitem.desc) + } + + override fun completeTaskItem(taskitem: TaskItem) { + taskItem?.let { taskViewModel.setCompleted(it) } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/check_24.xml b/app/src/main/res/drawable/check_24.xml new file mode 100644 index 0000000..bc136f2 --- /dev/null +++ b/app/src/main/res/drawable/check_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_scedule.xml b/app/src/main/res/layout/fragment_scedule.xml index 4671b72..323eaa1 100644 --- a/app/src/main/res/layout/fragment_scedule.xml +++ b/app/src/main/res/layout/fragment_scedule.xml @@ -1,110 +1,144 @@ - + android:visibility="visible"> + + + +