diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/StopwatchFragment.kt b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/StopwatchFragment.kt
index 23eaf076..08db8211 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/StopwatchFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/StopwatchFragment.kt
@@ -5,7 +5,6 @@ import android.graphics.Color
import android.graphics.Matrix
import android.os.Bundle
import android.os.Handler
-import android.os.Looper
import android.os.SystemClock
import android.support.v4.app.Fragment
import android.view.LayoutInflater
@@ -28,7 +27,6 @@ class StopwatchFragment : Fragment() {
private val UPDATE_INTERVAL = 10L
private val updateHandler = Handler()
- private val mainLooper = Looper.getMainLooper()
private var uptimeAtStart = 0L
private var totalTicks = 0
private var currentTicks = 0 // ticks that reset at pause
@@ -97,7 +95,7 @@ class StopwatchFragment : Fragment() {
override fun onResume() {
super.onResume()
- setupStopwatch()
+ setupViews()
}
override fun onDestroy() {
@@ -106,10 +104,6 @@ class StopwatchFragment : Fragment() {
updateHandler.removeCallbacks(updateRunnable)
}
- private fun setupStopwatch() {
- setupViews()
- }
-
private fun setupViews() {
val adjustedPrimaryColor = context!!.getAdjustedPrimaryColor()
view.apply {
@@ -221,9 +215,7 @@ class StopwatchFragment : Fragment() {
override fun run() {
if (isRunning) {
if (totalTicks % 10 == 0) {
- mainLooper.run {
- updateDisplayedText()
- }
+ updateDisplayedText()
}
totalTicks++
currentTicks++
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt
index 5f060c4b..7a96a29d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt
@@ -1,24 +1,47 @@
package com.simplemobiletools.clock.fragments
+import android.graphics.Color
import android.os.Bundle
+import android.os.Handler
+import android.os.SystemClock
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.simplemobiletools.clock.R
import com.simplemobiletools.clock.extensions.config
-import com.simplemobiletools.commons.extensions.getFormattedDuration
-import com.simplemobiletools.commons.extensions.updateTextColors
+import com.simplemobiletools.commons.extensions.*
import kotlinx.android.synthetic.main.fragment_timer.view.*
class TimerFragment : Fragment() {
+ private val UPDATE_INTERVAL = 1000L
+
+ private var isRunning = false
+ private var uptimeAtStart = 0L
+ private var initialSecs = 0
+ private var totalTicks = 0
+ private var currentTicks = 0
+ private var updateHandler = Handler()
+
lateinit var view: ViewGroup
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
view = (inflater.inflate(R.layout.fragment_timer, container, false) as ViewGroup).apply {
- timer_time.text = context!!.config.lastTimerSeconds.getFormattedDuration()
+ timer_time.setOnClickListener {
+ togglePlayPause()
+ }
+
+ timer_play_pause.setOnClickListener {
+ togglePlayPause()
+ }
+
+ timer_reset.setOnClickListener {
+ resetTimer()
+ }
}
+ initialSecs = context!!.config.lastTimerSeconds
+ updateDisplayedText()
return view
}
@@ -27,14 +50,67 @@ class TimerFragment : Fragment() {
setupViews()
}
+ override fun onDestroy() {
+ super.onDestroy()
+ isRunning = false
+ updateHandler.removeCallbacks(updateRunnable)
+ }
+
private fun setupViews() {
view.apply {
context!!.updateTextColors(timer_fragment)
+ timer_play_pause.background = resources.getColoredDrawableWithColor(R.drawable.circle_background_filled, context!!.getAdjustedPrimaryColor())
+ timer_reset.applyColorFilter(context!!.config.textColor)
}
- setupTimer()
+
+ updateIcons()
+ updateDisplayedText()
}
- private fun setupTimer() {
+ private fun togglePlayPause() {
+ isRunning = !isRunning
+ updateIcons()
+ if (isRunning) {
+ updateHandler.post(updateRunnable)
+ uptimeAtStart = SystemClock.uptimeMillis()
+ view.timer_reset.beVisible()
+ } else {
+ updateHandler.removeCallbacksAndMessages(null)
+ currentTicks = 0
+ totalTicks--
+ }
+ }
+
+ private fun updateIcons() {
+ val drawableId = if (isRunning) R.drawable.ic_pause else R.drawable.ic_play
+ val iconColor = if (context!!.getAdjustedPrimaryColor() == Color.WHITE) Color.BLACK else context!!.config.textColor
+ view.timer_play_pause.setImageDrawable(resources.getColoredDrawableWithColor(drawableId, iconColor))
+ }
+
+ private fun resetTimer() {
+ updateHandler.removeCallbacksAndMessages(null)
+ isRunning = false
+ currentTicks = 0
+ totalTicks = 0
+ initialSecs = context!!.config.lastTimerSeconds
+ updateDisplayedText()
+ updateIcons()
+ view.timer_reset.beGone()
+ }
+
+ private fun updateDisplayedText() {
+ view.timer_time.text = (initialSecs - totalTicks).getFormattedDuration()
+ }
+
+ private val updateRunnable = object : Runnable {
+ override fun run() {
+ if (isRunning) {
+ updateDisplayedText()
+ currentTicks++
+ totalTicks++
+ updateHandler.postAtTime(this, uptimeAtStart + currentTicks * UPDATE_INTERVAL)
+ }
+ }
}
}
diff --git a/app/src/main/res/layout/fragment_timer.xml b/app/src/main/res/layout/fragment_timer.xml
index f79bf54a..e832c0c1 100644
--- a/app/src/main/res/layout/fragment_timer.xml
+++ b/app/src/main/res/layout/fragment_timer.xml
@@ -1,5 +1,5 @@
-
-
+
+
+
+
+