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.graphics.Matrix
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper
import android.os.SystemClock import android.os.SystemClock
import android.support.v4.app.Fragment import android.support.v4.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
@ -28,7 +27,6 @@ class StopwatchFragment : Fragment() {
private val UPDATE_INTERVAL = 10L private val UPDATE_INTERVAL = 10L
private val updateHandler = Handler() private val updateHandler = Handler()
private val mainLooper = Looper.getMainLooper()
private var uptimeAtStart = 0L private var uptimeAtStart = 0L
private var totalTicks = 0 private var totalTicks = 0
private var currentTicks = 0 // ticks that reset at pause private var currentTicks = 0 // ticks that reset at pause
@ -97,7 +95,7 @@ class StopwatchFragment : Fragment() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupStopwatch() setupViews()
} }
override fun onDestroy() { override fun onDestroy() {
@ -106,10 +104,6 @@ class StopwatchFragment : Fragment() {
updateHandler.removeCallbacks(updateRunnable) updateHandler.removeCallbacks(updateRunnable)
} }
private fun setupStopwatch() {
setupViews()
}
private fun setupViews() { private fun setupViews() {
val adjustedPrimaryColor = context!!.getAdjustedPrimaryColor() val adjustedPrimaryColor = context!!.getAdjustedPrimaryColor()
view.apply { view.apply {
@ -221,9 +215,7 @@ class StopwatchFragment : Fragment() {
override fun run() { override fun run() {
if (isRunning) { if (isRunning) {
if (totalTicks % 10 == 0) { if (totalTicks % 10 == 0) {
mainLooper.run { updateDisplayedText()
updateDisplayedText()
}
} }
totalTicks++ totalTicks++
currentTicks++ currentTicks++

View File

@ -1,24 +1,47 @@
package com.simplemobiletools.clock.fragments package com.simplemobiletools.clock.fragments
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.os.SystemClock
import android.support.v4.app.Fragment import android.support.v4.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.simplemobiletools.clock.R import com.simplemobiletools.clock.R
import com.simplemobiletools.clock.extensions.config import com.simplemobiletools.clock.extensions.config
import com.simplemobiletools.commons.extensions.getFormattedDuration import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.extensions.updateTextColors
import kotlinx.android.synthetic.main.fragment_timer.view.* import kotlinx.android.synthetic.main.fragment_timer.view.*
class TimerFragment : Fragment() { 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 lateinit var view: ViewGroup
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
view = (inflater.inflate(R.layout.fragment_timer, container, false) as ViewGroup).apply { 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 return view
} }
@ -27,14 +50,67 @@ class TimerFragment : Fragment() {
setupViews() setupViews()
} }
override fun onDestroy() {
super.onDestroy()
isRunning = false
updateHandler.removeCallbacks(updateRunnable)
}
private fun setupViews() { private fun setupViews() {
view.apply { view.apply {
context!!.updateTextColors(timer_fragment) 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)
}
}
} }
} }

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout <android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
@ -21,4 +21,33 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:text="00:00"/> tools:text="00:00"/>
</android.support.design.widget.CoordinatorLayout> <ImageView
android:id="@+id/timer_reset"
style="@style/MyBorderlessBackgroundStyle"
android:layout_width="@dimen/stopwatch_button_small_size"
android:layout_height="@dimen/stopwatch_button_small_size"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@+id/timer_play_pause"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_reset"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/timer_play_pause"
app:layout_constraintEnd_toStartOf="@+id/timer_play_pause"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/timer_play_pause"/>
<ImageView
android:id="@+id/timer_play_pause"
android:layout_width="@dimen/stopwatch_button_size"
android:layout_height="@dimen/stopwatch_button_size"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="@dimen/big_margin"
android:padding="@dimen/normal_margin"
android:src="@drawable/ic_play"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
</android.support.constraint.ConstraintLayout>