diff --git a/app/build.gradle b/app/build.gradle index 5ad72cd..8beadf1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { defaultConfig { applicationId "iam.thevoid.epic.timeapp" - minSdk 21 + minSdk 26 targetSdk 31 versionCode 1 versionName "1.0" diff --git a/app/src/main/java/iam/thevoid/epic/timeapp/MainActivity.kt b/app/src/main/java/iam/thevoid/epic/timeapp/MainActivity.kt index d08be6e..390160a 100644 --- a/app/src/main/java/iam/thevoid/epic/timeapp/MainActivity.kt +++ b/app/src/main/java/iam/thevoid/epic/timeapp/MainActivity.kt @@ -1,10 +1,23 @@ package iam.thevoid.epic.timeapp -import androidx.appcompat.app.AppCompatActivity +import android.annotation.SuppressLint +import android.graphics.Color import android.os.Bundle +import android.util.Log import android.widget.Button import android.widget.EditText +import android.widget.FrameLayout import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.disposables.Disposable +import io.reactivex.rxjava3.schedulers.Schedulers +import java.text.SimpleDateFormat +import java.time.LocalTime +import java.time.format.DateTimeFormatter +import java.util.* +import java.util.concurrent.TimeUnit // Дан экран с готовой разметкой // Реализовать при помощи RxJava @@ -35,26 +48,149 @@ class MainActivity : AppCompatActivity() { private lateinit var countdownText: TextView private lateinit var countdownSecondsEditText: EditText private lateinit var countdownStartButton: Button + private lateinit var timerLayoutEdit: FrameLayout // Секундомер private lateinit var stopwatchText: TextView private lateinit var stopwatchMillisText: TextView - private lateinit var stopwatchStartButton: EditText - private lateinit var stopwatchEndButton: EditText + private lateinit var stopwatchStartButton: Button + private lateinit var stopwatchEndButton: Button + + @SuppressLint("SimpleDateFormat") + val dateFormat = SimpleDateFormat("HH:mm:ss") + val formatTimer = DateTimeFormatter.ofPattern("mm:ss") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) clockText = findViewById(R.id.clockText) + getNowTime() countdownText = findViewById(R.id.countdownText) countdownSecondsEditText = findViewById(R.id.countdownEditText) countdownStartButton = findViewById(R.id.countdownStartButton) + timerLayoutEdit = findViewById(R.id.timerLayout) + + countdownStartButton.setOnClickListener { + var secondText = countdownSecondsEditText.text.toString() + if (!secondText.isEmpty()) { + countdownStartButton.isEnabled = false + countdownSecondsEditText.isEnabled = false + val secondEdit = secondText.toLong() + var ofSecondOfDay = LocalTime.ofSecondOfDay(secondEdit) + countdownText.setText( + ofSecondOfDay.format(formatTimer) + ) + timer(ofSecondOfDay) + } + } stopwatchText = findViewById(R.id.stopwatchText) stopwatchMillisText = findViewById(R.id.stopwatchMillisText) stopwatchStartButton = findViewById(R.id.stopwatchStartButton) stopwatchEndButton = findViewById(R.id.stopwatchEndButton) + stopwatchText.setText("00:00:00") + stopwatchMillisText.setText("00") + var subscribe: Disposable? = null + + var stopwatchState = StopwatchState.STOP + var millisecondsPassed = 0L + stopwatchStartButton.setOnClickListener { + when (stopwatchState) { + StopwatchState.STOP, StopwatchState.PAUSE -> { + stopwatchState = StopwatchState.RUN + stopwatchEndButton.text = "PAUSE" + stopwatchStartButton.text = "START" + stopwatchStartButton.isEnabled = false + } + StopwatchState.RUN -> { + millisecondsPassed = 0L + subscribe?.dispose() + } + } + + subscribe = Observable.interval(1, TimeUnit.MILLISECONDS, Schedulers.computation()) + .takeWhile { stopwatchState == StopwatchState.RUN } + .map { millisecondsPassed + it } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + var secondNow = LocalTime.ofSecondOfDay(it / 1000) + stopwatchText.setText(secondNow.format(DateTimeFormatter.ofPattern("HH:mm:ss"))) + stopwatchMillisText.setText((it % 1000).toString()) + } + } + + stopwatchEndButton.setOnClickListener { + when (stopwatchState) { + StopwatchState.RUN -> { + stopwatchState = StopwatchState.PAUSE + stopwatchStartButton.isEnabled = true + stopwatchStartButton.text = "CONTINUE" + stopwatchEndButton.text = "RESET" + millisecondsPassed = LocalTime.parse(stopwatchText.text, DateTimeFormatter.ofPattern("HH:mm:ss")).toSecondOfDay() * 1000L + } + StopwatchState.PAUSE -> { + stopwatchState = StopwatchState.STOP + millisecondsPassed = 0L + stopwatchText.setText("00:00:00") + stopwatchMillisText.setText("00") + stopwatchStartButton.text = "START" + subscribe?.dispose() + } + } + } + } -} \ No newline at end of file + + fun getNowTime() { + Observable.interval(1, TimeUnit.SECONDS, Schedulers.computation()) + .map { + dateFormat.format(Date()) + } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { clockText.setText(it) } + } + + private fun timer(ofSecondOfDay: LocalTime) { + var ofSecondOfDay1 = ofSecondOfDay + Observable.interval(1, TimeUnit.SECONDS, Schedulers.computation()) + .takeWhile { ofSecondOfDay1.toSecondOfDay() > 0 } + .map { ofSecondOfDay1 = ofSecondOfDay1.minusSeconds(1) } + .observeOn(AndroidSchedulers.mainThread()) + .doOnDispose { } + .subscribe( + { countdownText.setText(ofSecondOfDay1.format(formatTimer)) }, + { Log.d(LOG_TAG, it.message.orEmpty()) }, + { + Observable.intervalRange( + 0L, + 3, + 100L, + 200L, + TimeUnit.MILLISECONDS, + Schedulers.computation() + ) + .map { + if (it % 2L != 0L) + Color.GREEN + else Color.YELLOW + } + .observeOn(AndroidSchedulers.mainThread()) + .doOnComplete { + countdownStartButton.isEnabled = true + countdownSecondsEditText.isEnabled = true + timerLayoutEdit.setBackgroundColor(Color.WHITE) + } + .subscribe { + timerLayoutEdit.setBackgroundColor(it) + } + }) + } + + companion object { + private val LOG_TAG = MainActivity::class.simpleName + } + + enum class StopwatchState { RUN, PAUSE, STOP } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 81ade1e..e635009 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -30,6 +30,7 @@ android:background="#ccc" /> @@ -59,12 +60,12 @@ tools:text="[02:37]" />