add some Timer fragment functionality

This commit is contained in:
tibbi
2018-03-08 21:02:19 +01:00
parent a7c915b4fd
commit 7ef63b76e4
3 changed files with 114 additions and 17 deletions

View File

@ -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++

View File

@ -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)
}
}
}
}