From e965691eda3ebce2d11febf504163efae5114c67 Mon Sep 17 00:00:00 2001 From: AlxTsaregorodtsev <101584665+AlxTsaregorodtsev@users.noreply.github.com> Date: Thu, 12 May 2022 14:30:28 +0700 Subject: [PATCH 1/2] Add files via upload --- .../iam/thevoid/epic/timeapp/MainActivity.kt | 148 +++++++++++++++++- 1 file changed, 146 insertions(+), 2 deletions(-) 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..924a617 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,20 @@ package iam.thevoid.epic.timeapp +import android.graphics.Color import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.text.format.DateUtils import android.widget.Button import android.widget.EditText +import android.widget.FrameLayout import android.widget.TextView +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.util.* +import java.util.concurrent.TimeUnit // Дан экран с готовой разметкой // Реализовать при помощи RxJava @@ -35,13 +45,25 @@ class MainActivity : AppCompatActivity() { private lateinit var countdownText: TextView private lateinit var countdownSecondsEditText: EditText private lateinit var countdownStartButton: Button + private lateinit var countdownFrameLayout: 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 + private var disposableTimer: Disposable? = null + private var disposableStopwatch: Disposable? = null + + enum class StopwatchState { + IS_RUNNING, IS_PAUSED, IS_STOPPED + } + + private var stopwatchState: StopwatchState = StopwatchState.IS_STOPPED + private var stopwatchTime = 0L + + //@SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -51,10 +73,132 @@ class MainActivity : AppCompatActivity() { countdownText = findViewById(R.id.countdownText) countdownSecondsEditText = findViewById(R.id.countdownEditText) countdownStartButton = findViewById(R.id.countdownStartButton) + countdownFrameLayout = findViewById(R.id.countdownFrameLayout) stopwatchText = findViewById(R.id.stopwatchText) stopwatchMillisText = findViewById(R.id.stopwatchMillisText) stopwatchStartButton = findViewById(R.id.stopwatchStartButton) stopwatchEndButton = findViewById(R.id.stopwatchEndButton) + + // Часы + getTime() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { item -> + clockText.text = item + } + + //Таймер + countdownStartButton.setOnClickListener { + disposableTimer?.dispose() + val inputSeconds = countdownSecondsEditText.text.toString().toLongOrNull() ?: 0L + disposableTimer = timer(inputSeconds) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { item -> + countdownText.text = item + }, + { + + }, + { + frameBlink() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { item -> countdownFrameLayout.setBackgroundColor(item) } + } + ) + + } + + //Секундомер + stopwatchStartButton.setOnClickListener { + when (stopwatchState) { + StopwatchState.IS_STOPPED, StopwatchState.IS_PAUSED -> { + stopwatchState = StopwatchState.IS_RUNNING + stopwatchStartButton.text = "START" + stopwatchEndButton.text = "PAUSE" + } + StopwatchState.IS_RUNNING -> { + stopwatchTime = 0 + } + } + disposableStopwatch?.dispose() + disposableStopwatch = getStopwatch(stopwatchTime) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + stopwatchText.text = it + + } + + } + + stopwatchEndButton.setOnClickListener { + disposableStopwatch?.dispose() + when (stopwatchState) { + StopwatchState.IS_RUNNING -> { + stopwatchState = StopwatchState.IS_PAUSED + stopwatchStartButton.text = "RESUME" + stopwatchEndButton.text = "STOP" + + } + StopwatchState.IS_PAUSED -> { + stopwatchState = StopwatchState.IS_STOPPED + stopwatchTime = 0L + stopwatchText.text = "" + stopwatchStartButton.text = "START" + + } + else -> {} + } + } + } + + private fun getTime(): Observable { + return Observable.interval(1000, TimeUnit.MILLISECONDS) + .map { getTimeStr() } } + + private fun getTimeStr(): String { + val date = Calendar.getInstance().time + val timeFormat = SimpleDateFormat.getTimeInstance() + return timeFormat.format(date) + } + + private fun timer(time: Long): Observable { + return Observable.interval(1000, TimeUnit.MILLISECONDS) + .takeWhile { it <= time } + .map { timerCountdown(time, it) } + } + + private fun timerCountdown(time: Long, tick: Long): String { + return DateUtils.formatElapsedTime(time - tick) + } + + private fun frameBlink(): Observable { + return Observable.interval(200, TimeUnit.MILLISECONDS) + .takeWhile { it < 5 } + .map { t -> getColorByNum(t.toInt()) } + + } + + private fun getColorByNum(num: Int): Int { + return if (num % 2 == 0) Color.GRAY else Color.GREEN + } + + private fun getStopwatch(curTime: Long): Observable { + return Observable.interval(1L, TimeUnit.MILLISECONDS) + .map { t -> getStopwatchTime(t + curTime) } + } + + private fun getStopwatchTime(time: Long): String { + stopwatchTime = time + val sdf = SimpleDateFormat("HH:mm:ss:SS", Locale.getDefault()) + sdf.timeZone = TimeZone.getTimeZone("3") + val timeMain = sdf.format(time) + return timeMain.toString() + } + } \ No newline at end of file From 0ffe42089c603f618fc40ff9454bf4b03043a976 Mon Sep 17 00:00:00 2001 From: AlxTsaregorodtsev <101584665+AlxTsaregorodtsev@users.noreply.github.com> Date: Thu, 12 May 2022 14:32:10 +0700 Subject: [PATCH 2/2] Add files via upload --- app/src/main/res/layout/activity_main.xml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 81ade1e..dbadf51 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" /> @@ -50,7 +51,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:importantForAutofill="no" - android:inputType="number" /> + android:inputType="number" + tools:ignore="SpeakableTextPresentCheck" />