добавление открытия созданных тренировок

This commit is contained in:
Надежда Емцова 2025-05-15 00:41:41 +03:00
parent 3078443367
commit 57f305819a
11 changed files with 138 additions and 36 deletions

View File

@ -34,12 +34,13 @@ class AddWorkout : AppCompatActivity() {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
val workoutViewModel = ViewModelProvider(
this,
ViewModelProvider.AndroidViewModelFactory.getInstance(application)
)[WorkoutViewModel::class.java]
val workoutId = intent.getIntExtra("workoutId", -1)
editWorkoutView = findViewById(R.id.name_training)
numWorkoutView = findViewById(R.id.num_exercise)
@ -48,6 +49,27 @@ class AddWorkout : AppCompatActivity() {
numSetsView = findViewById(R.id.numbers_of_sets_all)
timeWorkoutView = findViewById(R.id.time_work_all)
if (workoutId != -1) {
val viewModel = ViewModelProvider(
this,
ViewModelProvider.AndroidViewModelFactory.getInstance(application)
)[WorkoutViewModel::class.java]
viewModel.allWorkouts.observe(this) { workouts ->
val workout = workouts.find { it.id == workoutId }
if (workout != null) {
editWorkoutView.setText(workout.name)
numWorkoutView.setText(workout.numExercises.toString())
numRestWorkoutView.setText(workout.restBetweenExercises.toString())
numRestSetsView.setText(workout.restBetweenApproaches.toString())
numSetsView.setText(workout.numApproaches.toString())
timeWorkoutView.setText(workout.exerciseDuration.toString())
}
}
}
val buttonSaveAll: Button = findViewById(R.id.btn_save_all)
buttonSaveAll.setOnClickListener {
@ -85,7 +107,7 @@ class AddWorkout : AppCompatActivity() {
)
workoutViewModel.insert(newWorkout)
Toast.makeText(this, "Упражнение сохранено", Toast.LENGTH_SHORT).show()
Toast.makeText(this, "Тренировка сохранена", Toast.LENGTH_SHORT).show()
isSave = true

View File

@ -63,6 +63,7 @@ class AllTraining : AppCompatActivity() {
trainingId = 0
)
exerciseViewModel.insert(newExercise)
//exerciseViewModel.addUnsavedExercise(newExercise)
Toast.makeText(this, "Упражнение сохранено", Toast.LENGTH_SHORT).show()
isSave = true
finish()

View File

@ -13,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.timert.data.adapter.ExerciseAdapter
@ -20,10 +21,12 @@ import com.example.timert.data.entity.Training
import com.example.timert.data.viewModel.ExerciseViewModel
import com.example.timert.data.viewModel.TrainingViewModel
import com.example.timert.data.viewModel.WorkoutViewModel
import kotlinx.coroutines.launch
class CreatingTraining : AppCompatActivity() {
private lateinit var viewModel: ExerciseViewModel
private lateinit var trainingViewModel: TrainingViewModel
private lateinit var name_training: EditText
private lateinit var numSets: EditText
@ -40,46 +43,52 @@ class CreatingTraining : AppCompatActivity() {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
viewModel = ViewModelProvider(
this,
ViewModelProvider.AndroidViewModelFactory.getInstance(application)
)[ExerciseViewModel::class.java]
name_training = findViewById(R.id.name_training)
numSets = findViewById(R.id.numbers_of_sets)
restSets = findViewById(R.id.rest_sets)
val recyclerView = findViewById<RecyclerView>(R.id.exercise)
val buttonSave: Button = findViewById(R.id.btn_save)
viewModel = ViewModelProvider(this)[ExerciseViewModel::class.java]
trainingViewModel = ViewModelProvider(this)[TrainingViewModel::class.java]
val adapter = ExerciseAdapter { id ->
viewModel.deleteExerciseById(id)
}
// adapter = ExerciseAdapter(this)
val recyclerView = findViewById<RecyclerView>(R.id.exercise)
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(this)
viewModel.allExercise.observe(this) { exercises ->
exercises?.let {
adapter.setExercises(it)
}
val type = intent.getStringExtra("type")
val trainingId = intent.getIntExtra("trainingId", -1)
if (trainingId != -1) {
// Загружаем тренировку по ID
trainingViewModel.getTrainingById(trainingId).observe(this) { training ->
name_training.setText(training.name)
numSets.setText(training.numSets.toString())
restSets.setText(training.restBetweenSets.toString())
}
val trainingViewModel = ViewModelProvider(
this,
ViewModelProvider.AndroidViewModelFactory.getInstance(application)
)[TrainingViewModel::class.java]
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
if (type == "trainingWithExercises") {
// Загружаем упражнения только если тренировка с упражнениями
viewModel.getExercisesByTrainingId(trainingId).observe(this) { exercises ->
adapter.setExercises(exercises)
}
val buttonSave: Button = findViewById(R.id.btn_save)
viewModel.unsavedExercises.observe(this) { exercises ->
adapter.setExercises(exercises)
}
} else {
adapter.setExercises(emptyList()) // у обычной тренировки нет упражнений
}
} else {
// Создание новой — поля пустые, список упражнений пустой
adapter.setExercises(emptyList())
}
buttonSave.setOnClickListener {
val name = name_training.text.toString()
val numS = numSets.text.toString()

View File

@ -34,7 +34,17 @@ class MainActivity : AppCompatActivity() {
}
adapter = TrainingAdapter(
onDeleteWorkout = { id -> workoutViewModel.deleteWorkoutById(id) },
onDeleteTraining = { id -> trainingViewModel.deleteTrainingById(id) }
onDeleteTraining = { id -> trainingViewModel.deleteTrainingById(id) },
onWorkoutClick = { workout ->
val intent = Intent(this, AddWorkout::class.java)
intent.putExtra("workout_id", workout.id)
startActivity(intent)
},
onTrainingClick = { training ->
val intent = Intent(this, CreatingTraining::class.java)
intent.putExtra("training_id", training.id)
startActivity(intent)
}
)
val recyclerView = findViewById<RecyclerView>(R.id.workout)

View File

@ -1,5 +1,6 @@
package com.example.timert.data.adapter
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -9,14 +10,20 @@ import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.example.timert.AddWorkout
import com.example.timert.CreatingTraining
import com.example.timert.R
import com.example.timert.com.example.timert.data.entity.Workout
import com.example.timert.data.TrainingItem
import com.example.timert.data.entity.Training
import com.example.timert.data.trainingWithExercise
class TrainingAdapter( private val onDeleteWorkout: (Int) -> Unit,
private val onDeleteTraining: (Int) -> Unit
private val onDeleteTraining: (Int) -> Unit,
private val onWorkoutClick: (Workout) -> Unit,
private val onTrainingClick: (Training) -> Unit
) : ListAdapter<TrainingItem, RecyclerView.ViewHolder>(DiffCallback()) {
companion object {
@ -35,8 +42,8 @@ class TrainingAdapter( private val onDeleteWorkout: (Int) -> Unit,
val inflater = LayoutInflater.from(parent.context)
val view = inflater.inflate(R.layout.training_item_layout, parent, false) // один layout
return when (viewType) {
TYPE_WORKOUT -> WorkoutViewHolder(view, onDeleteWorkout)
TYPE_TRAINING_WITH_EXERCISES -> TrainingViewHolder(view, onDeleteTraining)
TYPE_WORKOUT -> WorkoutViewHolder(view, onDeleteWorkout, onWorkoutClick)
TYPE_TRAINING_WITH_EXERCISES -> TrainingViewHolder(view, onDeleteTraining, onTrainingClick)
else -> throw IllegalArgumentException("Invalid view type")
}
}
@ -48,23 +55,40 @@ class TrainingAdapter( private val onDeleteWorkout: (Int) -> Unit,
}
}
class WorkoutViewHolder(itemView: View, private val onDelete: (Int) -> Unit) :
class WorkoutViewHolder(itemView: View, private val onDelete: (Int) -> Unit,
private val onClick: (Workout) -> Unit) :
RecyclerView.ViewHolder(itemView) {
fun bind(workout: Workout) {
itemView.findViewById<TextView>(R.id.training_text).text = workout.name
itemView.findViewById<ImageButton>(R.id.deleteButtonTraining).setOnClickListener {
onDelete(workout.id)
}
itemView.setOnClickListener {
val context = itemView.context
val intent = Intent(context, AddWorkout::class.java)
intent.putExtra("workoutId", workout.id)
context.startActivity(intent)
}
}
}
class TrainingViewHolder(itemView: View, private val onDelete: (Int) -> Unit) :
class TrainingViewHolder(itemView: View, private val onDelete: (Int) -> Unit,
private val onClick: (Training) -> Unit) :
RecyclerView.ViewHolder(itemView) {
fun bind(trainingWithExercise: trainingWithExercise) {
val training = trainingWithExercise.training
itemView.findViewById<TextView>(R.id.training_text).text = trainingWithExercise.training.name
itemView.findViewById<ImageButton>(R.id.deleteButtonTraining).setOnClickListener {
onDelete(trainingWithExercise.training.id)
}
itemView.setOnClickListener {
val context = itemView.context
val intent = Intent(context, CreatingTraining::class.java)
intent.putExtra("type", "trainingWithExercises")
intent.putExtra("trainingId", trainingWithExercise.training.id)
context.startActivity(intent)
}
}
}

View File

@ -26,4 +26,7 @@ interface ExerciseDao {
@Query("UPDATE exercise_table SET trainingId = :newTrainingId WHERE trainingId = 0")
suspend fun updateExercisesWithTrainingId(newTrainingId: Int)
@Query("SELECT * FROM exercise_table WHERE trainingId = :trainingId")
fun getExercisesByTrainingId(trainingId: Int): LiveData<List<Exercise>>
}

View File

@ -38,4 +38,7 @@ interface TrainingDao {
@Transaction
@Query("SELECT * FROM training")
fun getTrainingsWithExercises(): LiveData<List<trainingWithExercise>>
@Query("SELECT * FROM training WHERE id = :id")
fun getTrainingById(id: Int): LiveData<Training>
}

View File

@ -14,4 +14,8 @@ class ExerciseRepository(private val exerciseDao:ExerciseDao){
exerciseDao.deleteById(id)
}
fun getExercisesByTrainingId(trainingId: Int): LiveData<List<Exercise>> {
return exerciseDao.getExercisesByTrainingId(trainingId)
}
}

View File

@ -20,4 +20,8 @@ class TrainingRepository(private val trainingDao: TrainingDao) {
trainingDao.deleteById(id)
}
fun getTrainingById(id: Int): LiveData<Training> {
return trainingDao.getTrainingById(id)
}
}

View File

@ -3,6 +3,7 @@ package com.example.timert.data.viewModel
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.example.timert.com.example.timert.data.database.AppDatabase
import com.example.timert.data.entity.Exercise
@ -12,7 +13,8 @@ import kotlinx.coroutines.launch
class ExerciseViewModel(application: Application):AndroidViewModel(application){
private val repository: ExerciseRepository
val allExercise: LiveData<List<Exercise>>
private val _unsavedExercises = MutableLiveData<List<Exercise>>(emptyList())
val unsavedExercises: LiveData<List<Exercise>> = _unsavedExercises
init{
val exercisesDao = AppDatabase.getDatabase(application).exerciseDao()
repository = ExerciseRepository(exercisesDao)
@ -25,4 +27,20 @@ class ExerciseViewModel(application: Application):AndroidViewModel(application){
fun deleteExerciseById(id: Int) = viewModelScope.launch {
repository.deleteExerciseById(id)
}
fun getExercisesByTrainingId(trainingId: Int): LiveData<List<Exercise>> {
return repository.getExercisesByTrainingId(trainingId)
}
fun addUnsavedExercise(exercise: Exercise) {
_unsavedExercises.value = _unsavedExercises.value.orEmpty() + exercise
}
fun deleteUnsavedExerciseById(id: Int) {
_unsavedExercises.value = _unsavedExercises.value.orEmpty().filterNot { it.id == id }
}
fun clearUnsavedExercises() {
_unsavedExercises.value = emptyList()
}
}

View File

@ -38,6 +38,10 @@ class TrainingViewModel (application: Application): AndroidViewModel(application
repository.delete(training)
}
fun getTrainingById(id: Int): LiveData<Training> {
return repository.getTrainingById(id)
}
fun insertTrainingAndLinkExercises(training: Training) {
viewModelScope.launch {
val newId = repository.insert(training) // возвращает id