Compare commits

..

No commits in common. "main" and "main" have entirely different histories.
main ... main

45 changed files with 355 additions and 2042 deletions

View File

@ -1,8 +1,6 @@
plugins { plugins {
alias(libs.plugins.android.application) alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.android)
id("org.jetbrains.kotlin.kapt")
id("androidx.room")
} }
android { android {
@ -35,13 +33,6 @@ android {
kotlinOptions { kotlinOptions {
jvmTarget = "11" jvmTarget = "11"
} }
buildFeatures {
//noinspection WrongGradleMethod
room {
schemaDirectory("$projectDir/schemas")
}
}
} }
dependencies { dependencies {
@ -54,13 +45,4 @@ dependencies {
testImplementation(libs.junit) testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)
// Room dependencies
implementation("androidx.room:room-runtime:2.7.1") // Замените на вашу версию
implementation("androidx.room:room-ktx:2.7.1") // Замените на вашу версию
kapt("androidx.room:room-compiler:2.7.1") // Замените на вашу версию
// Lifecycle dependencies
implementation ("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0") // Замените на вашу версию
implementation ("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0") // Замените на вашу версию
} }

View File

@ -1,77 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "87cf8dcd07bc0b2c0a8d52dbb0eca913",
"entities": [
{
"tableName": "workouts",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `numApproaches` INTEGER NOT NULL, `numExercises` INTEGER NOT NULL, `restBetweenExercises` INTEGER NOT NULL, `restBetweenApproaches` INTEGER NOT NULL, `exerciseDuration` INTEGER NOT NULL, `startTime` INTEGER, `endTime` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "numApproaches",
"columnName": "numApproaches",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "numExercises",
"columnName": "numExercises",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "restBetweenExercises",
"columnName": "restBetweenExercises",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "restBetweenApproaches",
"columnName": "restBetweenApproaches",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "exerciseDuration",
"columnName": "exerciseDuration",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "startTime",
"columnName": "startTime",
"affinity": "INTEGER"
},
{
"fieldPath": "endTime",
"columnName": "endTime",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '87cf8dcd07bc0b2c0a8d52dbb0eca913')"
]
}
}

View File

@ -1,67 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "6ba5dfef7859cedba19af71b404c9e4f",
"entities": [
{
"tableName": "workouts",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `numApproaches` INTEGER NOT NULL, `numExercises` INTEGER NOT NULL, `restBetweenExercises` INTEGER NOT NULL, `restBetweenApproaches` INTEGER NOT NULL, `exerciseDuration` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "numApproaches",
"columnName": "numApproaches",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "numExercises",
"columnName": "numExercises",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "restBetweenExercises",
"columnName": "restBetweenExercises",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "restBetweenApproaches",
"columnName": "restBetweenApproaches",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "exerciseDuration",
"columnName": "exerciseDuration",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6ba5dfef7859cedba19af71b404c9e4f')"
]
}
}

View File

@ -3,7 +3,6 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<application <application
android:name=".MyApplication"
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
@ -13,9 +12,6 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.TimerT" android:theme="@style/Theme.TimerT"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name=".History"
android:exported="false" />
<activity <activity
android:name=".SettingsActivity" android:name=".SettingsActivity"
android:exported="false" /> android:exported="false" />
@ -25,12 +21,6 @@
<activity <activity
android:name=".timer" android:name=".timer"
android:exported="false" /> android:exported="false" />
<activity
android:name=".AllTraining"
android:exported="true" />
<activity
android:name=".AddWorkout"
android:exported="true" />
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true"> android:exported="true">

View File

@ -4,26 +4,13 @@ import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.widget.Button import android.widget.Button
import android.widget.EditText
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.ViewModelProvider
import com.example.timert.com.example.timert.data.entity.Workout
import com.example.timert.data.viewModel.WorkoutViewModel
class AddWorkout : AppCompatActivity() { class AddWorkout : AppCompatActivity() {
private var isSave = false private var isSave = false
private lateinit var editWorkoutView: EditText
private lateinit var numWorkoutView: EditText
private lateinit var numRestWorkoutView: EditText
private lateinit var numRestSetsView: EditText
private lateinit var numSetsView: EditText
private lateinit var timeWorkoutView: EditText
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -34,86 +21,13 @@ class AddWorkout : AppCompatActivity() {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets 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)
numRestWorkoutView = findViewById(R.id.rest_workout_all)
numRestSetsView = findViewById(R.id.rest_sets_all)
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) val buttonSaveAll: Button = findViewById(R.id.btn_save_all)
buttonSaveAll.setOnClickListener { buttonSaveAll.setOnClickListener {
val intent = Intent(this, MainActivity::class.java)
val workoutName = editWorkoutView.text.toString() startActivity(intent)
val numWorkoutText = numWorkoutView.text.toString()
val restWorkoutText = numRestWorkoutView.text.toString()
val restSetsText = numRestSetsView.text.toString()
val numSetsText = numSetsView.text.toString()
val timeWorkText = timeWorkoutView.text.toString()
if (workoutName.isBlank() || numSetsText.isBlank() || restSetsText.isBlank()||numWorkoutText.isBlank() || restWorkoutText.isBlank() || timeWorkText.isBlank()) {
Toast.makeText(this, "Заполните все поля", Toast.LENGTH_SHORT).show()
} else {
val numExercise = numWorkoutText.toIntOrNull()
val restExercise = restWorkoutText.toIntOrNull()
val numSets = numSetsText.toIntOrNull()
val restSets = restSetsText.toIntOrNull()
val timeWorkExercise = timeWorkText.toIntOrNull()
if (numSets == null || restSets == null || numExercise == null || restExercise == null || timeWorkExercise == null) {
Toast.makeText(this, "Неверный формат чисел", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
val newWorkout = Workout(
name = workoutName,
numApproaches = numSets,
numExercises = numExercise,
restBetweenExercises = restExercise,
restBetweenApproaches = restSets,
exerciseDuration = timeWorkExercise,
)
workoutViewModel.insert(newWorkout)
Toast.makeText(this, "Тренировка сохранена", Toast.LENGTH_SHORT).show()
isSave = true isSave = true
} }
}
val button_on_main_all: Button = findViewById(R.id.btn_on_main_all) val button_on_main_all: Button = findViewById(R.id.btn_on_main_all)
button_on_main_all.setOnClickListener { button_on_main_all.setOnClickListener {
if (isSave == false) { if (isSave == false) {
@ -139,52 +53,5 @@ class AddWorkout : AppCompatActivity() {
val intent = Intent(this, CreatingTraining::class.java) val intent = Intent(this, CreatingTraining::class.java)
startActivity(intent) startActivity(intent)
} }
val timeInputRestSetAll: EditText = findViewById(R.id.rest_sets_all)
val btnPlusTimeAll: ImageView = findViewById(R.id.add_res_set2)
val btnMinusTimeAll: ImageView = findViewById(R.id.del_res_set2)
val setsInputAll: EditText = findViewById(R.id.numbers_of_sets_all)
val btnPlusSetsAll: ImageView = findViewById(R.id.add_set3)
val btnMinusSetsAll: ImageView = findViewById(R.id.del_set3)
val timeInputRest: EditText = findViewById(R.id.rest_workout_all)
val btnPlusTimeWor: ImageView = findViewById(R.id.add_res)
val btnMinusTimeWor: ImageView = findViewById(R.id.del_res)
val timeWork: EditText = findViewById(R.id.time_work_all)
val Plus: ImageView = findViewById(R.id.add_set)
val Minus: ImageView = findViewById(R.id.del_set)
val numExer: EditText = findViewById(R.id.num_exercise)
val PlusExer: ImageView = findViewById(R.id.add_set4)
val MinusExer: ImageView = findViewById(R.id.del_set4)
setupPlusMinus(timeInputRestSetAll, btnPlusTimeAll, btnMinusTimeAll, minValue = 5, maxValue = 600)
setupPlusMinus(setsInputAll, btnPlusSetsAll, btnMinusSetsAll, minValue = 1, maxValue = 20)
setupPlusMinus(timeInputRest, btnPlusTimeWor, btnMinusTimeWor, minValue = 5, maxValue = 600)
setupPlusMinus(timeWork, Plus, Minus, minValue = 5, maxValue = 600)
setupPlusMinus(numExer, PlusExer, MinusExer, minValue = 1, maxValue = 50)
}
fun setupPlusMinus(
editText: EditText,
plus: ImageView,
minus: ImageView,
minValue: Int = 5,
maxValue: Int = 600
) {
plus.setOnClickListener {
val current = editText.text.toString().toIntOrNull() ?: minValue
val newValue = (current + 1).coerceAtMost(maxValue)
editText.setText(newValue.toString())
}
minus.setOnClickListener {
val current = editText.text.toString().toIntOrNull() ?: minValue
val newValue = (current - 1).coerceAtLeast(minValue)
editText.setText(newValue.toString())
}
} }
} }

View File

@ -1,80 +1,33 @@
package com.example.timert package com.example.timert
import android.app.Activity
import android.app.AlertDialog import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.text.TextUtils
import android.widget.Button import android.widget.Button
import android.widget.EditText
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.ViewModelProvider
import com.example.timert.data.entity.Exercise
import com.example.timert.data.viewModel.ExerciseViewModel
class AllTraining : AppCompatActivity() { class AllTraining : AppCompatActivity() {
private var isSave = false private var isSave = false
private lateinit var editExerciseView: EditText
private lateinit var numExerciseView: EditText
private lateinit var numRestExerciseView: EditText
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
val exerciseViewModel = ViewModelProvider(
this,
ViewModelProvider.AndroidViewModelFactory.getInstance(application)
)[ExerciseViewModel::class.java]
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
setContentView(R.layout.activity_all_training) setContentView(R.layout.activity_all_training)
editExerciseView = findViewById(R.id.name_training)
numExerciseView = findViewById(R.id.time_work)
numRestExerciseView = findViewById(R.id.rest_workout)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets insets
} }
val buttonSaveAll: Button = findViewById(R.id.btn_save_all_vse) val buttonSaveAll: Button = findViewById(R.id.btn_save_all_vse)
buttonSaveAll.setOnClickListener { buttonSaveAll.setOnClickListener {
val exerciseName = editExerciseView.text.toString() val intent = Intent(this, MainActivity::class.java)
val numSetsText = numExerciseView.text.toString() startActivity(intent)
val restSetsText = numRestExerciseView.text.toString()
if (exerciseName.isBlank() || numSetsText.isBlank() || restSetsText.isBlank()) {
Toast.makeText(this, "Заполните все поля", Toast.LENGTH_SHORT).show()
} else {
val numSets = numSetsText.toIntOrNull()
val restSets = restSetsText.toIntOrNull()
if (numSets == null || restSets == null) {
Toast.makeText(this, "Неверный формат чисел", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
val newExercise = Exercise(
name_exercise = exerciseName,
num_sets = numSets,
rest_of_sets = restSets,
trainingId = 0
)
exerciseViewModel.insert(newExercise)
//exerciseViewModel.addUnsavedExercise(newExercise)
Toast.makeText(this, "Упражнение сохранено", Toast.LENGTH_SHORT).show()
isSave = true isSave = true
finish()
}
} }
val button_on_main_all: Button = findViewById(R.id.btn_on_main_all_vse) val button_on_main_all: Button = findViewById(R.id.btn_on_main_all_vse)
button_on_main_all.setOnClickListener { button_on_main_all.setOnClickListener {
if (isSave == false) { if (isSave == false) {
@ -85,7 +38,6 @@ class AllTraining : AppCompatActivity() {
val intent = Intent(this, MainActivity::class.java) val intent = Intent(this, MainActivity::class.java)
startActivity(intent) startActivity(intent)
finish()
} }
.setNegativeButton("Нет") { dialog, _ -> .setNegativeButton("Нет") { dialog, _ ->
dialog.dismiss() dialog.dismiss()
@ -96,41 +48,5 @@ class AllTraining : AppCompatActivity() {
startActivity(intent) startActivity(intent)
} }
} }
val timeInputRest: EditText = findViewById(R.id.rest_workout)
val btnPlusTime: ImageView = findViewById(R.id.add_res)
val btnMinusTime: ImageView = findViewById(R.id.del_res)
val setsInput: EditText = findViewById(R.id.time_work)
val btnPlusSets: ImageView = findViewById(R.id.add_set)
val btnMinusSets: ImageView = findViewById(R.id.del_set)
setupPlusMinus(timeInputRest, btnPlusTime, btnMinusTime, minValue = 5, maxValue = 600)
setupPlusMinus(setsInput, btnPlusSets, btnMinusSets, minValue = 5, maxValue = 600)
}
companion object {
const val EXTRA_REPLY = "com.example.android.wordlistsql.REPLY"
}
fun setupPlusMinus(
editText: EditText,
plus: ImageView,
minus: ImageView,
minValue: Int = 5,
maxValue: Int = 600
) {
plus.setOnClickListener {
val current = editText.text.toString().toIntOrNull() ?: minValue
val newValue = (current + 1).coerceAtMost(maxValue)
editText.setText(newValue.toString())
}
minus.setOnClickListener {
val current = editText.text.toString().toIntOrNull() ?: minValue
val newValue = (current - 1).coerceAtLeast(minValue)
editText.setText(newValue.toString())
}
} }
} }

View File

@ -4,36 +4,14 @@ import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.widget.Button import android.widget.Button
import android.widget.EditText
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat 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
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() { class CreatingTraining : AppCompatActivity() {
private lateinit var viewModel: ExerciseViewModel
private lateinit var trainingViewModel: TrainingViewModel
private lateinit var name_training: EditText
private lateinit var numSets: EditText
private lateinit var restSets: EditText
private var isSave = false private var isSave = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
@ -43,93 +21,12 @@ class CreatingTraining : AppCompatActivity() {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets insets
} }
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) 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)
}
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(this)
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())
}
if (type == "trainingWithExercises") {
// Загружаем упражнения только если тренировка с упражнениями
viewModel.getExercisesByTrainingId(trainingId).observe(this) { exercises ->
adapter.setExercises(exercises)
}
viewModel.unsavedExercises.observe(this) { exercises ->
adapter.setExercises(exercises)
}
} else {
adapter.setExercises(emptyList()) // у обычной тренировки нет упражнений
}
} else {
// Создание новой — поля пустые, список упражнений пустой
adapter.setExercises(emptyList())
}
buttonSave.setOnClickListener { buttonSave.setOnClickListener {
val name = name_training.text.toString()
val numS = numSets.text.toString()
val resS = restSets.text.toString()
if (name.isBlank() || numS.isBlank() || resS.isBlank()) { isSave=true
Toast.makeText(this, "Заполните все поля", Toast.LENGTH_SHORT).show()
} else {
val sets = numS.toIntOrNull()
val rest = resS.toIntOrNull()
if (sets == null || rest == null) {
Toast.makeText(this, "Неверный формат чисел", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
val newTraining = Training(
name = name,
numSets = sets,
restBetweenSets = rest)
trainingViewModel.insertTrainingAndLinkExercises(newTraining)
Toast.makeText(this, "Тренировка сохранена", Toast.LENGTH_SHORT).show()
isSave = true
}
} }
val btnPlusTime: ImageView = findViewById(R.id.add_res)
val btnMinusTime: ImageView = findViewById(R.id.del_res)
val btnPlusSets: ImageView = findViewById(R.id.add_set)
val btnMinusSets: ImageView = findViewById(R.id.del_set)
setupPlusMinus(restSets, btnPlusTime, btnMinusTime, minValue = 5, maxValue = 600)
setupPlusMinus(numSets, btnPlusSets, btnMinusSets, minValue = 1, maxValue = 20)
val button_on_main: Button = findViewById(R.id.btn_on_main) val button_on_main: Button = findViewById(R.id.btn_on_main)
button_on_main.setOnClickListener { button_on_main.setOnClickListener {
if(isSave==false){ if(isSave==false){
@ -151,30 +48,6 @@ class CreatingTraining : AppCompatActivity() {
} }
} }
val button_add: Button = findViewById(R.id.add_workout)
button_add.setOnClickListener {
val intent = Intent(this, AllTraining::class.java)
startActivity(intent)
}
} }
fun setupPlusMinus(
editText: EditText,
plus: ImageView,
minus: ImageView,
minValue: Int = 5,
maxValue: Int = 600
) {
plus.setOnClickListener {
val current = editText.text.toString().toIntOrNull() ?: minValue
val newValue = (current + 1).coerceAtMost(maxValue)
editText.setText(newValue.toString())
}
minus.setOnClickListener {
val current = editText.text.toString().toIntOrNull() ?: minValue
val newValue = (current - 1).coerceAtLeast(minValue)
editText.setText(newValue.toString())
}
}
} }

View File

@ -1,36 +0,0 @@
package com.example.timert
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
class History : AppCompatActivity() {
private lateinit var recyclerViewHistory: RecyclerView
private val coroutineScope = CoroutineScope(Dispatchers.IO)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_history)
recyclerViewHistory = findViewById(R.id.recyclerViewHistory)
recyclerViewHistory.layoutManager = LinearLayoutManager(this)
val button_on_main: Button = findViewById(R.id.btn_on_main)
button_on_main.setOnClickListener {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
}
}
}

View File

@ -8,21 +8,8 @@ import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.timert.com.example.timert.data.adapter.WorkoutAdapter
import com.example.timert.data.TrainingItem
import com.example.timert.data.adapter.TrainingAdapter
import com.example.timert.data.viewModel.TrainingViewModel
import com.example.timert.data.viewModel.WorkoutViewModel
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
private lateinit var adapter: TrainingAdapter
private lateinit var workoutViewModel: WorkoutViewModel
private lateinit var trainingViewModel: TrainingViewModel
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
@ -32,54 +19,6 @@ class MainActivity : AppCompatActivity() {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets insets
} }
adapter = TrainingAdapter(
onDeleteWorkout = { id -> workoutViewModel.deleteWorkoutById(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)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter
workoutViewModel = ViewModelProvider(this)[WorkoutViewModel::class.java]
trainingViewModel = ViewModelProvider(this)[TrainingViewModel::class.java]
// объединяем данные вручную
val combinedList = mutableListOf<TrainingItem>()
workoutViewModel.allWorkouts.observe(this) { workouts ->
combinedList.clear()
combinedList.addAll(workouts.map { TrainingItem.WorkoutItem(it) })
trainingViewModel.allTrainingsWithExercises.value?.let { trainings ->
combinedList.addAll(trainings.map { TrainingItem.TrainingWithExercisesItem(it) })
}
adapter.submitList(combinedList.toList())
}
trainingViewModel.allTrainingsWithExercises.observe(this) { trainings ->
combinedList.clear()
workoutViewModel.allWorkouts.value?.let { workouts ->
combinedList.addAll(workouts.map { TrainingItem.WorkoutItem(it) })
}
combinedList.addAll(trainings.map {TrainingItem.TrainingWithExercisesItem(it) })
adapter.submitList(combinedList.toList())
}
// Кнопки главной формы: // Кнопки главной формы:
val settingsButton: Button = findViewById(R.id.settingsButton) val settingsButton: Button = findViewById(R.id.settingsButton)
@ -92,26 +31,18 @@ class MainActivity : AppCompatActivity() {
startTrainingButton.setOnClickListener { startTrainingButton.setOnClickListener {
Toast.makeText(this, "Запуск тренировки!", Toast.LENGTH_SHORT).show() // Заглушка Toast.makeText(this, "Запуск тренировки!", Toast.LENGTH_SHORT).show() // Заглушка
//TODO: Intent для запуска Activity тренировки (форма 5) //TODO: Intent для запуска Activity тренировки (форма 5)
val intent = Intent(this, timer::class.java)
startActivity(intent)
} }
val templatesButton: Button = findViewById(R.id.templatesButton) val templatesButton: Button = findViewById(R.id.templatesButton)
templatesButton.setOnClickListener { templatesButton.setOnClickListener {
//Toast.makeText(this, "Открытие шаблонов!", Toast.LENGTH_SHORT).show() // Заглушка Toast.makeText(this, "Открытие шаблонов!", Toast.LENGTH_SHORT).show() // Заглушка
//TODO: Intent для открытия Activity шаблонов (форма 3) //TODO: Intent для открытия Activity шаблонов (форма 3)
val intent = Intent(this, AddWorkout::class.java)
startActivity(intent)
} }
val newTemplateButton: Button = findViewById(R.id.newTemplateButton) val newTemplateButton: Button = findViewById(R.id.newTemplateButton)
newTemplateButton.setOnClickListener { newTemplateButton.setOnClickListener {
//Toast.makeText(this, "Создание нового шаблона!", Toast.LENGTH_SHORT).show() // Заглушка Toast.makeText(this, "Создание нового шаблона!", Toast.LENGTH_SHORT).show() // Заглушка
//TODO: Intent для открытия Activity создания шаблона (форма 7) //TODO: Intent для открытия Activity создания шаблона (форма 3)
val intent = Intent(this, History::class.java)
startActivity(intent)
} }
// ---- ROOM TEST ----
} }
} }

View File

@ -1,20 +0,0 @@
package com.example.timert
import android.app.Application
import androidx.room.Room
import com.example.timert.com.example.timert.data.database.AppDatabase
class MyApplication : Application() {
companion object {
lateinit var database: AppDatabase
}
override fun onCreate() {
super.onCreate()
database = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java,
"workout_database"
).build()
}
}

View File

@ -1,7 +1,6 @@
package com.example.timert package com.example.timert
import android.content.Context import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Bundle import android.os.Bundle
import android.widget.Switch import android.widget.Switch
@ -17,17 +16,61 @@ class SettingsActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings2) setContentView(R.layout.activity_settings2)
val versionTextView: TextView = findViewById(R.id.versionTextView)
val darkModeSwitch: Switch = findViewById(R.id.darkModeSwitch)
val aboutButton: Button = findViewById(R.id.aboutButton)
val developersButton: Button = findViewById(R.id.developersButton) val developersButton: Button = findViewById(R.id.developersButton)
// Получаем сохраненное состояние темы из SharedPreferences
val sharedPreferences = getSharedPreferences("AppSettings", Context.MODE_PRIVATE)
val isDarkMode = sharedPreferences.getBoolean("DarkMode", false) // По умолчанию - светлая тема
darkModeSwitch.isChecked = isDarkMode
// Применяем тему
if (isDarkMode) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
try {
val packageInfo = packageManager.getPackageInfo(packageName, 0)
val versionName = packageInfo.versionName
versionTextView.text = "Версия: $versionName"
} catch (e: PackageManager.NameNotFoundException) {
versionTextView.text = "Версия: Неизвестно"
}
// Устанавливаем слушатель для Switch
darkModeSwitch.setOnCheckedChangeListener { _, isChecked ->
// Сохраняем состояние темы в SharedPreferences
val editor = sharedPreferences.edit()
editor.putBoolean("DarkMode", isChecked)
editor.apply()
// Применяем тему
if (isChecked) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
}
// Обработчик нажатия на кнопку "О программе"
aboutButton.setOnClickListener {
AlertDialog.Builder(this)
.setTitle("О программе")
.setMessage("Краткое описание пользования приложением.\n\nНапример: Это приложение позволяет тренироваться, чтобы быть как арнольдшварцнигер 😄")
.setPositiveButton("ОК", null)
.show()
}
// Обработчик нажатия на кнопку "Разработчики" // Обработчик нажатия на кнопку "Разработчики"
developersButton.setOnClickListener { developersButton.setOnClickListener {
AlertDialog.Builder(this) AlertDialog.Builder(this)
.setTitle("Разработчики") .setTitle("Разработчики")
.setMessage(HtmlCompat.fromHtml( .setMessage(HtmlCompat.fromHtml(
"<p style='margin-left: 2em;'><b>Программу разработали:</b></p><br>" + "<p style='margin-left: 2em;'><b>Вятский государственный университет</b></p><br>" +
"<p style='margin-left: 2em;'>Емцова Надежда Александровна</p>" + "<p style='margin-left: 2em;'>Емцова Надежда Александровна</p>" +
"<p style='margin-left: 2em;'>Новиков Николай Алексеевич</p>" + "<p style='margin-left: 2em;'>Новиков Николай Алексеевич</p>" +
"<p style='margin-left: 2em;'>Пискун Алёна Викторовна</p>", "<p style='margin-left: 2em;'>Пискун Алёна Викторовна</p>",
@ -36,10 +79,5 @@ class SettingsActivity : AppCompatActivity() {
.setPositiveButton("ОК", null) .setPositiveButton("ОК", null)
.show() .show()
} }
val on_main: Button = findViewById(R.id.btn_on_main)
on_main.setOnClickListener {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
}
}
} }
}

View File

@ -1,9 +0,0 @@
package com.example.timert.data
import com.example.timert.com.example.timert.data.entity.Workout
import com.example.timert.data.entity.Training
sealed class TrainingItem {
data class WorkoutItem(val workout: Workout) : TrainingItem()
data class TrainingWithExercisesItem(val trainingWithExercise: trainingWithExercise) : TrainingItem()
}

View File

@ -1,50 +0,0 @@
package com.example.timert.data.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.timert.R
import com.example.timert.data.entity.Exercise
//class ExerciseAdapter internal constructor(context: Context):RecyclerView.Adapter<ExerciseAdapter.ExerciseViewHolder>(){
class ExerciseAdapter(
private val onDeleteClick: (Int) -> Unit
) : RecyclerView.Adapter<ExerciseAdapter.ExerciseViewHolder>() {
private var exerciseList: List<Exercise> = emptyList()
inner class ExerciseViewHolder(itemView: View):RecyclerView.ViewHolder(itemView){
val textViewExercise: TextView = itemView.findViewById(R.id.textView13)
val deleteButton: ImageButton = itemView.findViewById(R.id.deleteButton)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExerciseViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.resyclerview_item, parent, false)
return ExerciseViewHolder(view)
}
override fun onBindViewHolder(holder: ExerciseViewHolder, position: Int) {
val exercise = exerciseList[position]
holder.textViewExercise.text =
"${exercise.name_exercise} — работа: ${exercise.num_sets} сек, отдых: ${exercise.rest_of_sets} сек"
holder.deleteButton.setOnClickListener {
onDeleteClick(exercise.id)
}
}
override fun getItemCount() = exerciseList.size
fun setExercises(exercises: List<Exercise>) {
this.exerciseList = exercises
notifyDataSetChanged()
}
}

View File

@ -1,104 +0,0 @@
package com.example.timert.data.adapter
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageButton
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 onWorkoutClick: (Workout) -> Unit,
private val onTrainingClick: (Training) -> Unit
) : ListAdapter<TrainingItem, RecyclerView.ViewHolder>(DiffCallback()) {
companion object {
private const val TYPE_WORKOUT = 0
private const val TYPE_TRAINING_WITH_EXERCISES = 1
}
override fun getItemViewType(position: Int): Int {
return when (getItem(position)) {
is TrainingItem.WorkoutItem -> TYPE_WORKOUT
is TrainingItem.TrainingWithExercisesItem -> TYPE_TRAINING_WITH_EXERCISES
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
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, onWorkoutClick)
TYPE_TRAINING_WITH_EXERCISES -> TrainingViewHolder(view, onDeleteTraining, onTrainingClick)
else -> throw IllegalArgumentException("Invalid view type")
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (val item = getItem(position)) {
is TrainingItem.WorkoutItem -> (holder as WorkoutViewHolder).bind(item.workout)
is TrainingItem.TrainingWithExercisesItem -> (holder as TrainingViewHolder).bind(item.trainingWithExercise)
}
}
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,
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)
}
}
}
class DiffCallback : DiffUtil.ItemCallback<TrainingItem>() {
override fun areItemsTheSame(oldItem: TrainingItem, newItem: TrainingItem): Boolean {
return oldItem == newItem
}
override fun areContentsTheSame(oldItem: TrainingItem, newItem: TrainingItem): Boolean {
return oldItem == newItem
}
}
}

View File

@ -1,48 +0,0 @@
package com.example.timert.com.example.timert.data.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.timert.R
import com.example.timert.com.example.timert.data.entity.Workout
class WorkoutAdapter internal constructor(private val onDeleteClick: (Int) -> Unit
) : RecyclerView.Adapter<WorkoutAdapter.WorkoutViewHolder>() {
private var workouts: List<Workout> = emptyList()
inner class WorkoutViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textViewName: TextView = itemView.findViewById(R.id.training_text)
val deleteButton: ImageButton = itemView.findViewById(R.id.deleteButtonTraining)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WorkoutViewHolder {
val itemView = LayoutInflater.from(parent.context)
.inflate(R.layout.training_item_layout, parent, false)
return WorkoutViewHolder(itemView)
}
override fun onBindViewHolder(holder: WorkoutViewHolder, position: Int) {
val currentItem = workouts[position]
holder.textViewName.text =
"${currentItem.name}"
holder.deleteButton.setOnClickListener {
onDeleteClick(currentItem.id)
}
}
override fun getItemCount() = workouts.size
fun setWorkouts(workouts: List<Workout>) {
this.workouts = workouts
notifyDataSetChanged()
}
}

View File

@ -1,32 +0,0 @@
package com.example.timert.data.dao
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Transaction
import com.example.timert.data.entity.Exercise
@Dao
interface ExerciseDao {
@Transaction
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(exercise: Exercise)
@Query("SELECT * FROM exercise_table")
fun getExercise(): LiveData<List<Exercise>>
@Query("DELETE FROM exercise_table WHERE id = :id")
suspend fun deleteById(id: Int)
@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

@ -1,44 +0,0 @@
package com.example.timert.data.dao
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Transaction
import com.example.timert.data.entity.Training
import com.example.timert.data.trainingWithExercise
@Dao
interface TrainingDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertTraining(training: Training) : Long
@Query("SELECT * FROM Training WHERE id = :trainingId")
fun getTrainingWithExercise(trainingId: Int): LiveData<trainingWithExercise>
@Delete
fun deleteTraining(training: Training)
@Query("SELECT * FROM training")
fun getAllTrainings(): LiveData<List<Training>>
@Query("DELETE FROM training WHERE id = :id")
suspend fun deleteById(id: Int)
@Query("SELECT * FROM training WHERE id = :trainingId")
fun getTrainingWithExercises(trainingId: Int): LiveData<trainingWithExercise>
@Transaction
@Query("SELECT * FROM training")
fun getAllTrainingsWithExercises(): LiveData<List<trainingWithExercise>>
@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

@ -1,29 +0,0 @@
package com.example.timert.com.example.timert.data.dao
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import com.example.timert.com.example.timert.data.entity.Workout
import com.example.timert.data.entity.Exercise
@Dao
interface WorkoutDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insertWorkout(workout: Workout): Long
@Query("SELECT * FROM workouts")
fun getAllWorkouts(): LiveData<List<Workout>>
@Query("SELECT * FROM workouts WHERE id = :workoutId")
suspend fun getWorkoutById(workoutId: Int): Workout?
@Update
suspend fun updateWorkout(workout: Workout)
@Query("DELETE FROM workouts WHERE id = :id")
suspend fun deleteById(id: Int)
}

View File

@ -1,43 +0,0 @@
package com.example.timert.com.example.timert.data.database
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.example.timert.com.example.timert.data.dao.WorkoutDao
import com.example.timert.com.example.timert.data.entity.Workout
import com.example.timert.data.dao.ExerciseDao
import com.example.timert.data.dao.TrainingDao
import com.example.timert.data.entity.Exercise
import com.example.timert.data.entity.Training
import kotlinx.coroutines.CoroutineScope
@Database(entities = [Workout::class, Exercise::class, Training::class], version = 3, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun workoutDao(): WorkoutDao
abstract fun trainingDao(): TrainingDao
abstract fun exerciseDao(): ExerciseDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
val tempInstance = INSTANCE
if (tempInstance != null) {
return tempInstance
}
synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"workout_database"
)
//.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
return instance
}
}
}
}

View File

@ -1,15 +0,0 @@
package com.example.timert.data.entity
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.Index
import androidx.room.PrimaryKey
@Entity(tableName = "exercise_table",
indices = [Index("trainingId")])
data class Exercise(@PrimaryKey(autoGenerate = true) val id: Int = 0,
val name_exercise: String,
val num_sets: Int,
val rest_of_sets: Int,
val trainingId: Int = 0)

View File

@ -1,12 +0,0 @@
package com.example.timert.data.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "training")
data class Training(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val name: String,
val numSets: Int,
val restBetweenSets: Int
)

View File

@ -1,16 +0,0 @@
package com.example.timert.com.example.timert.data.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "workouts")
data class Workout(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val name: String,
val numApproaches: Int,
val numExercises: Int,
val restBetweenExercises: Int,
val restBetweenApproaches: Int,
val exerciseDuration: Int,
//val startTime: Long? = null,
// val endTime: Long? = null
)

View File

@ -1,21 +0,0 @@
package com.example.timert.data.repository
import androidx.lifecycle.LiveData
import com.example.timert.data.dao.ExerciseDao
import com.example.timert.data.entity.Exercise
class ExerciseRepository(private val exerciseDao:ExerciseDao){
val allExercise: LiveData<List<Exercise>> = exerciseDao.getExercise()
suspend fun insert(training: Exercise) {
exerciseDao.insert(training)
}
suspend fun deleteExerciseById(id: Int) {
exerciseDao.deleteById(id)
}
fun getExercisesByTrainingId(trainingId: Int): LiveData<List<Exercise>> {
return exerciseDao.getExercisesByTrainingId(trainingId)
}
}

View File

@ -1,27 +0,0 @@
package com.example.timert.data.repository
import androidx.lifecycle.LiveData
import com.example.timert.data.dao.TrainingDao
import com.example.timert.data.entity.Training
import com.example.timert.data.trainingWithExercise
class TrainingRepository(private val trainingDao: TrainingDao) {
val allTrainings: LiveData<List<Training>> = trainingDao.getAllTrainings()
val allTrainingsWithExercises: LiveData<List<trainingWithExercise>> = trainingDao.getTrainingsWithExercises()
suspend fun insert(training: Training): Long {
return trainingDao.insertTraining(training)
}
suspend fun delete(training: Training) = trainingDao.deleteTraining(training)
suspend fun deleteTrainingById(id: Int) {
trainingDao.deleteById(id)
}
fun getTrainingById(id: Int): LiveData<Training> {
return trainingDao.getTrainingById(id)
}
}

View File

@ -1,17 +0,0 @@
package com.example.timert.data.repository
import androidx.lifecycle.LiveData
import com.example.timert.com.example.timert.data.dao.WorkoutDao
import com.example.timert.com.example.timert.data.entity.Workout
class WorkoutRepository (private val workoutDao: WorkoutDao){
val allWorkout: LiveData<List<Workout>> = workoutDao.getAllWorkouts()
suspend fun insert(workout: Workout) {
workoutDao.insertWorkout(workout)
}
suspend fun deleteWorkoutById(id: Int) {
workoutDao.deleteById(id)
}
}

View File

@ -1,16 +0,0 @@
package com.example.timert.data
import androidx.lifecycle.LiveData
import androidx.room.Embedded
import androidx.room.Relation
import com.example.timert.data.entity.Exercise
import com.example.timert.data.entity.Training
data class trainingWithExercise (
@Embedded val training: Training,
@Relation(
parentColumn = "id",
entityColumn = "trainingId"
)
val exercises: List<Exercise>
)

View File

@ -1,46 +0,0 @@
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
import com.example.timert.data.repository.ExerciseRepository
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)
allExercise = repository.allExercise
}
fun insert(exercise: Exercise) = viewModelScope.launch {
repository.insert(exercise)
}
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

@ -1,54 +0,0 @@
package com.example.timert.data.viewModel
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.viewModelScope
import com.example.timert.com.example.timert.data.database.AppDatabase
import com.example.timert.data.entity.Training
import com.example.timert.data.repository.TrainingRepository
import com.example.timert.data.trainingWithExercise
import kotlinx.coroutines.launch
class TrainingViewModel (application: Application): AndroidViewModel(application){
val allWorkouts: LiveData<List<Training>>
private val trainingDao = AppDatabase.getDatabase(application).trainingDao()
private val repository = TrainingRepository(trainingDao)
val allTrainings: LiveData<List<Training>> = repository.allTrainings
val allTrainingsWithExercises: LiveData<List<trainingWithExercise>> = repository.allTrainingsWithExercises
init{
val trainingDao = AppDatabase.getDatabase(application).trainingDao()
allWorkouts = repository.allTrainings
}
fun insert(training: Training) = viewModelScope.launch {
repository.insert(training)
}
fun deleteTrainingById(id: Int) = viewModelScope.launch {
repository.deleteTrainingById(id)
}
fun delete(training: Training) = viewModelScope.launch {
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
// теперь обновляем trainingId в упражнениях
AppDatabase.getDatabase(getApplication()).exerciseDao()
.updateExercisesWithTrainingId(newId.toInt())
}
}
}

View File

@ -1,28 +0,0 @@
package com.example.timert.data.viewModel
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.viewModelScope
import com.example.timert.com.example.timert.data.database.AppDatabase
import com.example.timert.com.example.timert.data.entity.Workout
import com.example.timert.data.repository.WorkoutRepository
import kotlinx.coroutines.launch
class WorkoutViewModel(application: Application):AndroidViewModel(application){
private val repository: WorkoutRepository
val allWorkouts: LiveData<List<Workout>>
init{
val workoutDao = AppDatabase.getDatabase(application).workoutDao()
repository = WorkoutRepository(workoutDao)
allWorkouts = repository.allWorkout
}
fun insert(workout: Workout) = viewModelScope.launch {
repository.insert(workout)
}
fun deleteWorkoutById(id: Int) = viewModelScope.launch {
repository.deleteWorkoutById(id)
}
}

View File

@ -2,39 +2,17 @@ package com.example.timert
import android.app.AlertDialog import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.media.MediaPlayer import android.media.Image
import android.os.Bundle import android.os.Bundle
import android.os.CountDownTimer import android.widget.Button
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.TextView
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
class timer : AppCompatActivity() { class timer : AppCompatActivity() {
private var isPlay = false private var isPlay = false
private lateinit var statusText: TextView
private lateinit var timerText: TextView
private lateinit var statusSet: TextView
private lateinit var statusExercise: TextView
private var numApproaches = 3
private var numExercises = 5
private var restBetweenExercises = 30
private var restBetweenApproaches = 60
private var exerciseDuration = 45 // например, 45 секунд упражнение
private var currentTimer: CountDownTimer? = null
private var timeLeftInMillis: Long = 0
// Объявляем переменные для MediaPlayer
private var startWorkoutSound: MediaPlayer? = null
private var workSound: MediaPlayer? = null
private var startRestSound: MediaPlayer? = null
private var restSound: MediaPlayer? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
@ -44,24 +22,6 @@ class timer : AppCompatActivity() {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets insets
} }
statusText = findViewById(R.id.statusText)
timerText = findViewById(R.id.timerText)
statusSet = findViewById(R.id.number_set)
statusExercise = findViewById(R.id.num_exercise)
numApproaches = intent.getIntExtra("numApproaches", numApproaches)
numExercises = intent.getIntExtra("numExercises", numExercises)
restBetweenExercises = intent.getIntExtra("restBetweenExercises", restBetweenExercises)
restBetweenApproaches = intent.getIntExtra("restBetweenApproaches", restBetweenApproaches)
exerciseDuration = intent.getIntExtra("exerciseDuration", exerciseDuration)
// Инициализируем MediaPlayer
startWorkoutSound = MediaPlayer.create(this, R.raw.sound1)
workSound = MediaPlayer.create(this, R.raw.sound1)
startRestSound = MediaPlayer.create(this, R.raw.sound2)
restSound = MediaPlayer.create(this, R.raw.sound3)
startTraining()
val button: ImageButton = findViewById(R.id.stop) val button: ImageButton = findViewById(R.id.stop)
button.setOnClickListener { button.setOnClickListener {
AlertDialog.Builder(this) AlertDialog.Builder(this)
@ -97,111 +57,6 @@ class timer : AppCompatActivity() {
}
private fun resumeTimer(onFinish: () -> Unit) {
currentTimer = object : CountDownTimer(timeLeftInMillis, 1000) {
override fun onTick(millisUntilFinished: Long) {
timeLeftInMillis = millisUntilFinished
timerText.text = "${millisUntilFinished / 1000}"
} }
override fun onFinish() {
onFinish()
}
}.start()
}
private fun startTraining() {
var currentApproach = 1
val rootLayout = findViewById<ConstraintLayout>(R.id.main)
fun nextApproach() {
if (currentApproach > numApproaches) {
statusText.text = "Тренировка завершена!"
rootLayout.setBackgroundResource(R.drawable.blue_gradient)
timerText.text = "00:00"
// Здесь должен быть звук завершения тренировки, если нужно
return
}
statusSet.text = "Подход № $currentApproach"
var currentExercise = 1
fun nextExercise() {
if (currentExercise > numExercises) {
statusText.text = "Отдых между подходами"
rootLayout.setBackgroundResource(R.drawable.green_gradient)
// Звук перед началом отдыха между подходами
startRestSound?.start()
startRest(restBetweenApproaches) {
currentApproach++
nextApproach()
}
return
}
rootLayout.setBackgroundResource(R.drawable.gradient_pink)
statusText.text = "Работа"
statusExercise.text = "$currentExercise / $numExercises"
statusSet.text = "$currentApproach"
// Звук перед началом упражнения
workSound?.start()
startTimer(exerciseDuration) {
statusText.text = "Отдых"
rootLayout.setBackgroundResource(R.drawable.green_gradient)
// Звук перед началом отдыха между упражнениями
restSound?.start()
startRest(restBetweenExercises) {
currentExercise++
nextExercise()
}
}
}
// Звук перед началом подхода
startWorkoutSound?.start()
nextExercise()
}
nextApproach()
}
private fun startTimer(seconds: Int, onFinish: () -> Unit) {
timeLeftInMillis = seconds * 1000L
object : CountDownTimer(seconds * 1000L, 1000) {
override fun onTick(millisUntilFinished: Long) {
timerText.text = "${millisUntilFinished / 1000}"
}
override fun onFinish() {
onFinish()
}
}.start()
}
private fun startRest(seconds: Int, onFinish: () -> Unit) {
val rootLayout = findViewById<ConstraintLayout>(R.id.main)
rootLayout.setBackgroundResource(R.drawable.green_gradient)
object : CountDownTimer(seconds * 1000L, 1000) {
override fun onTick(millisUntilFinished: Long) {
timerText.text = "${millisUntilFinished / 1000}"
statusText.text = "Отдых"
}
override fun onFinish() {
onFinish()
}
}.start()
}
override fun onDestroy() {
super.onDestroy()
currentTimer?.cancel()
// Освобождаем ресурсы MediaPlayer
startWorkoutSound?.release()
workSound?.release()
startRestSound?.release()
restSound?.release()
startWorkoutSound = null
workSound = null
startRestSound = null
restSound = null
}
} }

View File

@ -31,32 +31,20 @@
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:ems="10" android:ems="10"
android:inputType="text" android:inputType="text"
android:text="Моя тренировка" android:text="Тренировка 1"
android:textAlignment="center" android:textAlignment="center"
android:textSize="20sp" /> android:textSize="20sp" />
</LinearLayout> </LinearLayout>
<ScrollView
android:id="@+id/scrollView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toTopOf="@+id/frameLayout2"
app:layout_constraintTop_toBottomOf="@+id/linearLayout"
tools:layout_editor_absoluteX="9dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout <LinearLayout
android:id="@+id/setting_training" android:id="@+id/setting_training"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="400dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:orientation="vertical"> android:orientation="vertical"
app:layout_constraintTop_toBottomOf="@+id/linearLayout"
tools:layout_editor_absoluteX="16dp">
<TextView <TextView
android:id="@+id/textView6" android:id="@+id/textView6"
@ -75,69 +63,22 @@
android:id="@+id/del_set3" android:id="@+id/del_set3"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_remove_24px" /> app:srcCompat="@drawable/ic_remove_24px" />
<EditText <TextView
android:id="@+id/numbers_of_sets_all" android:id="@+id/numbers_of_sets_all3"
android:layout_width="3dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="38dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
android:ems="10" android:text="0"
android:gravity="center" android:textAlignment="center"
android:inputType="number" android:textSize="34sp" />
android:text="1"
android:textSize="26sp" />
<ImageView <ImageView
android:id="@+id/add_set3" android:id="@+id/add_set3"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1"
app:srcCompat="@drawable/ic_add_24px" />
</LinearLayout>
<TextView
android:id="@+id/textView14"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Количество упражнений"
android:textAlignment="center"
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/del_set4"
android:layout_width="wrap_content"
android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1"
app:srcCompat="@drawable/ic_remove_24px" />
<EditText
android:id="@+id/num_exercise"
android:layout_width="3dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:ems="10"
android:gravity="center"
android:inputType="number"
android:text="1"
android:textSize="26sp" />
<ImageView
android:id="@+id/add_set4"
android:layout_width="wrap_content"
android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_add_24px" /> app:srcCompat="@drawable/ic_add_24px" />
</LinearLayout> </LinearLayout>
@ -152,34 +93,29 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="60dp"
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/del_res_set2" android:id="@+id/del_set2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_remove_24px" /> app:srcCompat="@drawable/ic_remove_24px" />
<EditText <TextView
android:id="@+id/rest_sets_all" android:id="@+id/numbers_of_sets_all2"
android:layout_width="3dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="38dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
android:ems="10" android:text="0"
android:gravity="center" android:textAlignment="center"
android:inputType="number" android:textSize="34sp" />
android:text="5"
android:textSize="26sp" />
<ImageView <ImageView
android:id="@+id/add_res_set2" android:id="@+id/add_set2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_add_24px" /> app:srcCompat="@drawable/ic_add_24px" />
</LinearLayout> </LinearLayout>
@ -202,27 +138,22 @@
android:id="@+id/del_set" android:id="@+id/del_set"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_remove_24px" /> app:srcCompat="@drawable/ic_remove_24px" />
<EditText <TextView
android:id="@+id/time_work_all" android:id="@+id/numbers_of_sets_allall"
android:layout_width="3dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="38dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
android:ems="10" android:text="0"
android:gravity="center" android:textAlignment="center"
android:inputType="number" android:textSize="34sp" />
android:text="5"
android:textSize="26sp" />
<ImageView <ImageView
android:id="@+id/add_set" android:id="@+id/add_set"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_add_24px" /> app:srcCompat="@drawable/ic_add_24px" />
</LinearLayout> </LinearLayout>
@ -244,42 +175,34 @@
android:id="@+id/del_res" android:id="@+id/del_res"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_remove_24px" /> app:srcCompat="@drawable/ic_remove_24px" />
<EditText <TextView
android:id="@+id/rest_workout_all" android:id="@+id/rest_sets_allall"
android:layout_width="3dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="39dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
android:ems="10" android:text="0"
android:gravity="center" android:textAlignment="center"
android:inputType="number" android:textSize="34sp" />
android:text="5"
android:textSize="26sp" />
<ImageView <ImageView
android:id="@+id/add_res" android:id="@+id/add_res"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_add_24px" /> app:srcCompat="@drawable/ic_add_24px" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout>
</ScrollView>
<FrameLayout <FrameLayout
android:id="@+id/frameLayout2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
android:layout_marginTop="10dp"
app:layout_constraintBottom_toTopOf="@+id/linearLayout4" app:layout_constraintTop_toBottomOf="@+id/setting_training"
tools:layout_editor_absoluteX="0dp"> tools:layout_editor_absoluteX="0dp">
<Button <Button
@ -296,10 +219,9 @@
</FrameLayout> </FrameLayout>
<LinearLayout <LinearLayout
android:id="@+id/linearLayout4"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="35dp"
android:orientation="horizontal" android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

View File

@ -11,7 +11,7 @@
<LinearLayout <LinearLayout
android:id="@+id/linearLayout" android:id="@+id/linearLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="130dp"
android:layout_marginTop="25dp" android:layout_marginTop="25dp"
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
@ -20,7 +20,7 @@
android:id="@+id/textView2" android:id="@+id/textView2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Добавить упражнение" android:text="Тренировка"
android:textAlignment="center" android:textAlignment="center"
android:textSize="34sp" /> android:textSize="34sp" />
@ -31,7 +31,7 @@
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:ems="10" android:ems="10"
android:inputType="text" android:inputType="text"
android:text="Упражнение" android:text="Упражнение 1"
android:textAlignment="center" android:textAlignment="center"
android:textSize="20sp" /> android:textSize="20sp" />
@ -40,8 +40,8 @@
<LinearLayout <LinearLayout
android:id="@+id/setting_training" android:id="@+id/setting_training"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="200dp"
android:layout_marginTop="5dp" android:layout_marginTop="37dp"
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintTop_toBottomOf="@+id/linearLayout" app:layout_constraintTop_toBottomOf="@+id/linearLayout"
tools:layout_editor_absoluteX="16dp"> tools:layout_editor_absoluteX="16dp">
@ -50,7 +50,7 @@
android:id="@+id/textView3" android:id="@+id/textView3"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Время работы, сек" android:text="Время работы"
android:textAlignment="center" android:textAlignment="center"
android:textSize="24sp" /> android:textSize="24sp" />
@ -64,27 +64,22 @@
android:id="@+id/del_set" android:id="@+id/del_set"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_remove_24px" /> app:srcCompat="@drawable/ic_remove_24px" />
<EditText <TextView
android:id="@+id/time_work" android:id="@+id/numbers_of_sets_allall"
android:layout_width="3dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="38dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
android:ems="10" android:text="0"
android:gravity="center" android:textAlignment="center"
android:inputType="number" android:textSize="34sp" />
android:text="5"
android:textSize="26sp" />
<ImageView <ImageView
android:id="@+id/add_set" android:id="@+id/add_set"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_add_24px" /> app:srcCompat="@drawable/ic_add_24px" />
</LinearLayout> </LinearLayout>
@ -93,40 +88,35 @@
android:id="@+id/textView8_all" android:id="@+id/textView8_all"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Отдых между упражнениями, сек" android:text="Отдых между подходами"
android:textAlignment="center" android:textAlignment="center"
android:textSize="24sp" /> android:textSize="24sp" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="50dp"
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/del_res" android:id="@+id/del_res"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_remove_24px" /> app:srcCompat="@drawable/ic_remove_24px" />
<EditText <TextView
android:id="@+id/rest_workout" android:id="@+id/rest_sets_allall"
android:layout_width="3dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="39dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
android:ems="10" android:text="0"
android:gravity="center" android:textAlignment="center"
android:inputType="number" android:textSize="34sp" />
android:text="5"
android:textSize="26sp" />
<ImageView <ImageView
android:id="@+id/add_res" android:id="@+id/add_res"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_add_24px" /> app:srcCompat="@drawable/ic_add_24px" />
</LinearLayout> </LinearLayout>
@ -141,21 +131,6 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
tools:layout_editor_absoluteX="7dp"> tools:layout_editor_absoluteX="7dp">
<Button
android:id="@+id/btn_on_main_all_vse"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_weight="1"
android:background="@drawable/gradient_purpure"
android:text="на главную"
android:textAlignment="center"
android:textColor="@color/white"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="653dp" />
<Button <Button
android:id="@+id/btn_save_all_vse" android:id="@+id/btn_save_all_vse"
android:layout_width="150dp" android:layout_width="150dp"
@ -170,5 +145,20 @@
android:textColor="@color/white" android:textColor="@color/white"
tools:layout_editor_absoluteX="245dp" tools:layout_editor_absoluteX="245dp"
tools:layout_editor_absoluteY="653dp" /> tools:layout_editor_absoluteY="653dp" />
<Button
android:id="@+id/btn_on_main_all_vse"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_weight="1"
android:background="@drawable/gradient_purpure"
android:text="на главную"
android:textAlignment="center"
android:textColor="@color/white"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="653dp" />
</LinearLayout> </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -11,7 +11,7 @@
<LinearLayout <LinearLayout
android:id="@+id/linearLayout" android:id="@+id/linearLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="130dp"
android:layout_marginTop="25dp" android:layout_marginTop="25dp"
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
@ -28,9 +28,10 @@
android:id="@+id/name_training" android:id="@+id/name_training"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:ems="10" android:ems="10"
android:inputType="text" android:inputType="text"
android:text="Моя тренировка" android:text="Тренировка 1"
android:textAlignment="center" android:textAlignment="center"
android:textSize="20sp" /> android:textSize="20sp" />
@ -39,12 +40,11 @@
<LinearLayout <LinearLayout
android:id="@+id/setting_training" android:id="@+id/setting_training"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="200dp"
android:layout_marginTop="37dp"
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/exercise" app:layout_constraintTop_toBottomOf="@+id/linearLayout"
app:layout_constraintTop_toBottomOf="@+id/linearLayout"> tools:layout_editor_absoluteX="16dp">
<TextView <TextView
android:id="@+id/textView5" android:id="@+id/textView5"
@ -57,39 +57,33 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="8dp" android:layout_marginBottom="20dp"
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/del_set" android:id="@+id/del_set"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_remove_24px" /> app:srcCompat="@drawable/ic_remove_24px" />
<EditText <TextView
android:id="@+id/numbers_of_sets" android:id="@+id/numbers_of_sets"
android:layout_width="3dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="38dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
android:ems="10" android:text="0"
android:gravity="center" android:textAlignment="center"
android:inputType="number" android:textSize="34sp" />
android:text="1"
android:textSize="26sp" />
<ImageView <ImageView
android:id="@+id/add_set" android:id="@+id/add_set"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_add_24px" /> app:srcCompat="@drawable/ic_add_24px" />
</LinearLayout> </LinearLayout>
<TextView <TextView
android:id="@+id/textView8" android:id="@+id/textView8"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -100,74 +94,47 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="50dp"
android:layout_marginBottom="8dp"
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/del_res" android:id="@+id/del_res"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_remove_24px" /> app:srcCompat="@drawable/ic_remove_24px" />
<EditText <TextView
android:id="@+id/rest_sets" android:id="@+id/rest_sets"
android:layout_width="3dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="39dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
android:ems="10" android:text="0"
android:gravity="center" android:textAlignment="center"
android:inputType="number" android:textSize="34sp" />
android:text="5"
android:textSize="26sp" />
<ImageView <ImageView
android:id="@+id/add_res" android:id="@+id/add_res"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="37dp" android:layout_height="37dp"
android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/ic_add_24px" /> app:srcCompat="@drawable/ic_add_24px" />
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" />
</LinearLayout> </LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/exercise"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/frameLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.373"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/setting_training"
app:layout_constraintVertical_bias="0.178" />
<FrameLayout <FrameLayout
android:id="@+id/frameLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="60dp"
app:layout_constraintBottom_toTopOf="@+id/linearLayout2" android:layout_marginTop="19dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/setting_training"
app:layout_constraintHorizontal_bias="1.0" tools:layout_editor_absoluteX="0dp">
app:layout_constraintStart_toStartOf="parent">
<Button <Button
android:id="@+id/add_workout" android:id="@+id/add_workout"
android:layout_width="176dp" android:layout_width="176dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="@drawable/green_rectangle" android:background="@drawable/green_rectangle"
android:gravity="center" android:gravity="center"
android:text="+ упражнение" android:text="+ упражнение"
@ -177,13 +144,12 @@
</FrameLayout> </FrameLayout>
<LinearLayout <LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="60dp"
android:layout_marginBottom="35dp"
android:orientation="horizontal" android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"> app:layout_constraintStart_toStartOf="parent">
<Button <Button
@ -191,8 +157,8 @@
android:layout_width="150dp" android:layout_width="150dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginLeft="8dp" android:layout_marginLeft="20dp"
android:layout_marginRight="8dp" android:layout_marginRight="20dp"
android:layout_weight="1" android:layout_weight="1"
android:background="@drawable/gradient_purpure" android:background="@drawable/gradient_purpure"
android:text="на главную" android:text="на главную"
@ -204,8 +170,8 @@
android:layout_width="150dp" android:layout_width="150dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginLeft="8dp" android:layout_marginLeft="20dp"
android:layout_marginRight="8dp" android:layout_marginRight="20dp"
android:layout_weight="1" android:layout_weight="1"
android:background="@drawable/gradient_purpure" android:background="@drawable/gradient_purpure"
android:text="Сохранить" android:text="Сохранить"

View File

@ -1,66 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/gradient_purpure"
tools:context=".History">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewHistory"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<TextView
android:id="@+id/textView4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="История тренировок"
android:textAlignment="center"
android:textSize="34sp"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginBottom="35dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/btn_on_main"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_weight="1"
android:background="@drawable/green_gradient"
android:text="на главную"
android:textAlignment="center"
android:textColor="@color/white" />
<Button
android:id="@+id/btn_save"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_weight="1"
android:background="@drawable/green_gradient"
android:text="Выбрать"
android:textAlignment="center"
android:textColor="@color/white" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -8,29 +8,26 @@
tools:context=".MainActivity"> tools:context=".MainActivity">
<ImageView <ImageView
android:id="@+id/imageView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/background_imagemain" android:src="@drawable/background_imagemain"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintVertical_bias="1.0" />
<Button <Button
android:id="@+id/settingsButton" android:id="@+id/settingsButton"
android:layout_width="56dp" android:layout_width="48dp"
android:layout_height="56dp" android:layout_height="48dp"
android:background="@drawable/ic_settings"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:background="@android:drawable/ic_menu_info_details"
android:backgroundTint="@color/black"
android:contentDescription="Настройки" android:contentDescription="Настройки"
app:layout_constraintEnd_toEndOf="parent" android:backgroundTint="@color/black" />
app:layout_constraintTop_toTopOf="parent" />
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/startTrainingCardView" android:id="@+id/startTrainingCardView"
@ -72,7 +69,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@android:color/transparent" android:background="@android:color/transparent"
android:text="Создать новую тренировку" android:text="Редактировать тренировку"
android:textColor="@android:color/white" /> android:textColor="@android:color/white" />
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
@ -96,19 +93,6 @@
android:background="@android:color/transparent" android:background="@android:color/transparent"
android:text="История тренировок" android:text="История тренировок"
android:textColor="@android:color/white" /> android:textColor="@android:color/white" />
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/workout"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/newTemplateCardView"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,106 +1,65 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:padding="16dp" android:padding="16dp"
android:background="@drawable/background_image2"> <!-- Добавили background --> android:background="@drawable/background_image2"> <!-- Добавили background -->
<androidx.constraintlayout.widget.ConstraintLayout <TextView
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="match_parent"> android:layout_height="wrap_content"
android:text="Настройки"
<LinearLayout android:textSize="24sp"
android:id="@+id/about_progr_layout" android:textStyle="bold"
android:layout_width="match_parent" android:layout_marginBottom="16dp"/>
android:layout_height="450dp"
android:layout_marginTop="35dp"
android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="0dp">
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:text="Таймер для тренировок"
android:layout_marginBottom="16dp" android:textSize="18sp"
android:text="О программе" android:layout_marginBottom="8dp"/>
android:textAlignment="center"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="Название приложения: Таймер для тренировок"
android:textSize="18sp" />
<TextView
android:id="@+id/textView7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="Данное приложение поможет пользователю в организации своих тренировок."
android:textSize="18sp" />
<TextView
android:id="@+id/textView9"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="Оно поможет задавать количество подходов и упражнений, устанавливать время работы и отдыха, запускать последние 3 тренировки."
android:textSize="18sp" />
<TextView
android:id="@+id/textView12"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="Можно задавать как интервалы для всех упражнений, так и для каждого отдельно, добавляя названия упражнений."
android:textSize="18sp" />
<TextView
android:id="@+id/versionTextView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="При возникновении проблем обращаться на почту: stud179277@vyatsu.ru" />
<TextView <TextView
android:id="@+id/versionTextView" android:id="@+id/versionTextView"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="16dp" android:text="Версия: 1.0"
android:text="Версия: 1.0" /> android:layout_marginBottom="16dp"/>
</LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/btn_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="100dp" android:layout_height="wrap_content"
android:layout_marginBottom="16dp" android:orientation="horizontal"
android:orientation="vertical" android:gravity="center_vertical"
app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="8dp">
tools:layout_editor_absoluteX="0dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Темная тема"
android:textSize="16sp"/>
<Switch
android:id="@+id/darkModeSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<Button
android:id="@+id/aboutButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="О программе"
android:layout_marginBottom="8dp"/>
<Button <Button
android:id="@+id/developersButton" android:id="@+id/developersButton"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/blue_gradient" android:text="Разработчики"/>
android:text="Разработчики" />
<Button
android:id="@+id/btn_on_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:background="@drawable/blue_gradient"
android:text="На главную" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout> </LinearLayout>

View File

@ -69,9 +69,9 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:gravity="center" android:gravity="center"
android:text="Подход № " android:text="Подход №"
android:textAlignment="textEnd" android:textAlignment="textEnd"
android:textColor="@color/black" android:textColor="#D0CBCB"
android:textSize="34sp" /> android:textSize="34sp" />
<TextView <TextView
@ -82,7 +82,7 @@
android:gravity="center" android:gravity="center"
android:text=" 1" android:text=" 1"
android:textAlignment="viewStart" android:textAlignment="viewStart"
android:textColor="@color/black" android:textColor="#D0CBCB"
android:textSize="34sp" /> android:textSize="34sp" />
</LinearLayout> </LinearLayout>
@ -96,9 +96,9 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:text="Упражнение " android:text="Упражнение"
android:textAlignment="textEnd" android:textAlignment="textEnd"
android:textColor="@color/black" android:textColor="#D0CBCB"
android:textSize="34sp" /> android:textSize="34sp" />
<TextView <TextView
@ -108,12 +108,12 @@
android:layout_weight="1" android:layout_weight="1"
android:text=" 1" android:text=" 1"
android:textAlignment="viewStart" android:textAlignment="viewStart"
android:textColor="@color/black" android:textColor="#D0CBCB"
android:textSize="34sp" /> android:textSize="34sp" />
</LinearLayout> </LinearLayout>
<TextView <TextView
android:id="@+id/timerText" android:id="@+id/time"
android:layout_width="163dp" android:layout_width="163dp"
android:layout_height="153dp" android:layout_height="153dp"
android:layout_gravity="center" android:layout_gravity="center"
@ -123,13 +123,13 @@
android:textSize="60sp" /> android:textSize="60sp" />
<TextView <TextView
android:id="@+id/statusText" android:id="@+id/work"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="70dp" android:layout_height="70dp"
android:gravity="center" android:gravity="center"
android:text="Работа" android:text="Работа"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/black" android:textColor="#D0CBCB"
android:textSize="34sp" /> android:textSize="34sp" />
</LinearLayout> </LinearLayout>

View File

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp">
<LinearLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#410F3FED"
android:orientation="horizontal"
android:paddingTop="8dp"
android:paddingBottom="8dp">
<TextView
android:id="@+id/textView13"
android:layout_width="353dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="Название упражнения"
android:textColor="#000000"
android:textSize="18sp" />
<ImageButton
android:id="@+id/deleteButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="#00FFFFFF"
app:srcCompat="@android:drawable/ic_menu_delete" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp">
<LinearLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/green_rectangle"
android:gravity="center"
android:orientation="horizontal"
android:paddingTop="8dp"
android:paddingBottom="8dp">
<TextView
android:id="@+id/training_text"
android:layout_width="353dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="Тренировка"
android:textColor="#000000"
android:textSize="18sp" />
<ImageButton
android:id="@+id/deleteButtonTraining"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@android:drawable/ic_menu_delete" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -21,4 +21,3 @@ kotlin.code.style=official
# resources declared in the library itself and none from the library's dependencies, # resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library # thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true android.nonTransitiveRClass=true
kapt.compiler.jvmtarget=11

View File

@ -1,5 +1,5 @@
[versions] [versions]
agp = "8.10.0" agp = "8.9.2"
kotlin = "2.0.21" kotlin = "2.0.21"
coreKtx = "1.16.0" coreKtx = "1.16.0"
junit = "4.13.2" junit = "4.13.2"

View File

@ -10,12 +10,6 @@ pluginManagement {
mavenCentral() mavenCentral()
gradlePluginPortal() gradlePluginPortal()
} }
plugins {
id("com.android.application") version "8.3.2" apply false // Замените на вашу версию
id("org.jetbrains.kotlin.android") version "1.9.0" apply false // Замените на вашу версию Kotlin
id("org.jetbrains.kotlin.kapt") version "1.9.0" apply false // замените на вашу версию Kotlin
id("androidx.room") version "2.7.1" apply false // Добавьте эту строку, заменив на вашу версию Room
}
} }
dependencyResolutionManagement { dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
@ -27,3 +21,4 @@ dependencyResolutionManagement {
rootProject.name = "TimerT" rootProject.name = "TimerT"
include(":app") include(":app")