OSDN Git Service

新UI搭載に向けて準備。
[gokigen/JoggingTimer.git] / wear / src / main / java / net / osdn / gokigen / joggingtimer / stopwatch / timer / MyTimerCounter.kt
diff --git a/wear/src/main/java/net/osdn/gokigen/joggingtimer/stopwatch/timer/MyTimerCounter.kt b/wear/src/main/java/net/osdn/gokigen/joggingtimer/stopwatch/timer/MyTimerCounter.kt
new file mode 100644 (file)
index 0000000..fced02b
--- /dev/null
@@ -0,0 +1,327 @@
+package net.osdn.gokigen.joggingtimer.stopwatch.timer
+
+import android.util.Log
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.mutableLongStateOf
+import androidx.compose.runtime.mutableStateOf
+import net.osdn.gokigen.joggingtimer.stopwatch.IDatabaseReloadCallback
+
+/**
+ * My Timer counter
+ *
+ */
+class MyTimerCounter internal constructor() : ITimerCounter, ITimeoutReceiver, IDatabaseReloadCallback
+{
+    private var startTime = 0L
+    private var stopTime = 0L
+    private var currentTimer = mutableLongStateOf(0)
+    private var currentLapCount = mutableIntStateOf(0)
+    private var referenceTimeId = 0
+    private var elapsedTime: MutableList<Long>
+    private var referenceTimeA: List<Long>? = null
+    private var referenceTimeB: List<Long>? = null
+    private var referenceTimeC: List<Long>? = null
+    private var callback: ICounterStatusNotify? = null
+    private var counterMode = mutableStateOf(false)
+    private val myTimer = MyTimerTrigger(this, 100)
+    private var counterStatus = mutableStateOf(ICounterStatus.STOP)
+
+    init
+    {
+        elapsedTime = ArrayList()
+        currentLapCount.intValue = 0
+        currentTimer.longValue = 0L
+    }
+
+    /**
+     * Is my timer running?
+     *
+     * @return  true : running, false : stopped
+     */
+    override fun isStarted(): Boolean
+    {
+        return (counterStatus.value == ICounterStatus.START)
+    }
+
+    override fun isReset(): Boolean
+    {
+        return (counterStatus.value == ICounterStatus.STOP)
+    }
+
+    override fun toggleCounterMode()
+    {
+        counterMode.value = !(counterMode.value)
+        Log.v(TAG, "toggleCounterMode : ${counterMode.value}")
+    }
+
+    override fun getCounterMode() : Boolean
+    {
+        return (counterMode.value)
+    }
+
+    override fun getCurrentCountStatus(): ICounterStatus
+    {
+        return (counterStatus.value)
+    }
+
+    /**
+     * Start Timer
+     *
+     */
+    override fun start()
+    {
+        if (counterStatus.value != ICounterStatus.START)
+        {
+            startTime = System.currentTimeMillis()
+            stopTime = 0L
+            elapsedTime.clear()
+            elapsedTime.add(startTime)
+            currentTimer.longValue = startTime
+            currentLapCount.intValue = 1
+            counterStatus.value = ICounterStatus.START
+            myTimer.startTimer()
+            Log.v(TAG, "start() startTime : ${startTime}")
+        }
+    }
+
+    override fun timeStamp(): Long
+    {
+        var timeToSet: Long = 0
+        if (counterStatus.value == ICounterStatus.START)
+        {
+            timeToSet = System.currentTimeMillis()
+            elapsedTime.add(timeToSet)
+            ++(currentLapCount.intValue)
+        }
+        return timeToSet
+    }
+
+    override fun stop()
+    {
+        if (counterStatus.value == ICounterStatus.START)
+        {
+            stopTime = System.currentTimeMillis()
+            elapsedTime.add(stopTime)
+            ++(currentLapCount.intValue)
+            counterStatus.value = ICounterStatus.FINISHED
+        }
+        myTimer.forceStop()
+    }
+
+    override fun reset()
+    {
+        if (counterStatus.value == ICounterStatus.FINISHED)
+        {
+            startTime = 0L
+            stopTime = 0L
+            currentTimer.longValue = 0L
+            currentLapCount.intValue = 0
+            elapsedTime.clear()
+            counterStatus.value = ICounterStatus.STOP
+        }
+        myTimer.forceStop()
+    }
+
+    override fun getElapsedCount(): Int
+    {
+        return (currentLapCount.intValue)
+    }
+
+    override fun getPastTime(): Long
+    {
+        return when (getCurrentCountStatus()) {
+            ICounterStatus.START -> {
+                // 実行中...タイマースタートからの時間を返す
+                (currentTimer.longValue - startTime)
+            }
+            ICounterStatus.STOP -> {
+                // カウンタリセット時
+                0L
+            }
+            ICounterStatus.FINISHED -> {
+                // カウンタ終了時
+                (stopTime - startTime)
+            }
+        }
+    }
+
+    override fun getElapsedTime(lapCount: Int): Long
+    {
+        try
+        {
+            return if (lapCount < 0) 0 else elapsedTime[lapCount] - startTime
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+        return getLastElapsedTime()
+    }
+
+    override fun getLastElapsedTime(): Long
+    {
+        try
+        {
+            if (elapsedTime.size > 0)
+            {
+                return (elapsedTime[elapsedTime.size - 1] - startTime)
+            }
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+        return 0L
+    }
+
+    override fun getCurrentElapsedTime(): Long
+    {
+        val currentTime = System.currentTimeMillis()
+        try
+        {
+            if (elapsedTime.size > 0)
+            {
+                return currentTime - elapsedTime[elapsedTime.size - 1]
+            }
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+        return currentTime - startTime
+    }
+
+    override fun getStartTime(): Long
+    {
+        return startTime
+    }
+
+    override fun getStopTime(): Long
+    {
+        return stopTime
+    }
+
+    override fun getReferenceLapTimeList(): List<Long>?
+    {
+        if (referenceTimeId == 0) {
+            return referenceTimeA
+        } else if (referenceTimeId == 1) {
+            return referenceTimeB
+        }
+        return referenceTimeC
+    }
+    override fun getLapTimeList(): List<Long>
+    {
+        return elapsedTime
+    }
+
+    override fun setCallback(callback: ICounterStatusNotify)
+    {
+        this.callback = callback
+    }
+
+    override fun dataIsReloaded(timelist: ArrayList<Long>)
+    {
+        Log.v(TAG, "dataIsReloaded() : lap ${timelist.size}")
+        try
+        {
+            val startTime = timelist[0]
+            val pastTime = System.currentTimeMillis() - startTime
+            myTimer.startTimer()
+            Log.v(TAG, "pastTime : $pastTime")
+            this.startTime = startTime
+            elapsedTime = ArrayList(timelist)
+            stopTime = 0L
+            currentLapCount.intValue = elapsedTime.size
+            counterStatus.value = ICounterStatus.START
+            callback?.counterStatusChanged(true)
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun referenceDataIsReloaded(id: Int, timelist: ArrayList<Long>)
+    {
+        try
+        {
+            val size: Int
+            selectReferenceLapTime(id)
+            when (referenceTimeId) {
+                0 -> {
+                    referenceTimeA = null
+                    referenceTimeA = ArrayList(timelist)
+                    size = referenceTimeA?.size ?: 0
+                }
+                1 -> {
+                    referenceTimeB = null
+                    referenceTimeB = ArrayList(timelist)
+                    size = referenceTimeB?.size ?: 0
+                }
+                else -> {
+                    referenceTimeC = null
+                    referenceTimeC = ArrayList(timelist)
+                    size = referenceTimeC?.size ?: 0
+                }
+            }
+            callback?.counterStatusChanged(false)
+            Log.v(TAG, "reference lap time : $size")
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun getReferenceLapTime(position: Int): Long {
+        try
+        {
+            val referenceTime: List<Long>? = when (referenceTimeId) {
+                0 -> {
+                    referenceTimeA
+                }
+                1 -> {
+                    referenceTimeB
+                }
+                else -> {
+                    referenceTimeC
+                }
+            }
+            val location = position + 1
+            if (referenceTime == null || location < 1 || referenceTime.size < location) {
+                return 0
+            }
+            return if (location == 1) {
+                referenceTime[0]
+            } else referenceTime[location - 1] - referenceTime[location - 2]
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+        return 0
+    }
+
+    override fun selectReferenceLapTime(id: Int)
+    {
+        referenceTimeId = id
+    }
+
+    override fun timeout()
+    {
+        try
+        {
+            currentTimer.longValue = System.currentTimeMillis()
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    companion object
+    {
+        private val TAG = MyTimerCounter::class.java.simpleName
+    }
+}