From da208ccb61c4e5a38ef8a1d08060575196e39c80 Mon Sep 17 00:00:00 2001 From: Nathaniel Wesley Filardo Date: Sat, 21 Oct 2017 03:09:30 -0400 Subject: [PATCH] Initial stab at stun timers --- .../ctfwstimer/CtFwSDisplayLocal.java | 81 +++++++++++++++++++ .../ctfwstimer/MainActivity.java | 14 ++++ mobile/src/main/res/layout/activity_main.xml | 65 +++++++++++++++ mobile/src/main/res/values/strings.xml | 3 + 4 files changed, 163 insertions(+) diff --git a/mobile/src/main/java/com/acmetensortoys/ctfwstimer/CtFwSDisplayLocal.java b/mobile/src/main/java/com/acmetensortoys/ctfwstimer/CtFwSDisplayLocal.java index c89e8fe..f2f9f86 100644 --- a/mobile/src/main/java/com/acmetensortoys/ctfwstimer/CtFwSDisplayLocal.java +++ b/mobile/src/main/java/com/acmetensortoys/ctfwstimer/CtFwSDisplayLocal.java @@ -3,10 +3,12 @@ package com.acmetensortoys.ctfwstimer; import android.app.Activity; import android.graphics.Color; import android.os.Build; +import android.os.Bundle; import android.os.SystemClock; import android.text.format.DateUtils; import android.util.Log; import android.view.View; +import android.widget.Button; import android.widget.Chronometer; import android.widget.ProgressBar; import android.widget.TextView; @@ -22,9 +24,43 @@ class CtFwSDisplayLocal implements CtFwSGameState.Observer { final private Activity mAct; String gameStateLabelText; + private StunTimer stun_short, stun_long; + CtFwSDisplayLocal(Activity a) { mAct = a; gameStateLabelText = mAct.getResources().getString(R.string.header_gamestate0); + + stun_short = new StunTimer( + (Chronometer)mAct.findViewById(R.id.ch_wait_short), + (ProgressBar)mAct.findViewById(R.id.pb_wait_short), + 10000); + wireTimer(R.id.btn_wait_short, stun_short); + + stun_long = new StunTimer( + (Chronometer)mAct.findViewById(R.id.ch_wait_long), + (ProgressBar)mAct.findViewById(R.id.pb_wait_long), + 60000); + wireTimer(R.id.btn_wait_long, stun_long); + } + + private void wireTimer(int vid, final StunTimer st) { + ((Button)mAct.findViewById(vid)) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startTimer(st, System.currentTimeMillis()); + } + }); + } + + public void timersToBundle(Bundle out, String key) { + out.putLongArray(key, new long[]{ stun_short.wallEndMS, stun_long.wallEndMS }); + } + public void timersFromBundle(Bundle in, String key) { + long[] es = in.getLongArray(key); + if(es == null) { return; } + if(es.length > 0) { resumeTimer(stun_short, es[0]); } + if(es.length > 1) { resumeTimer(stun_long, es[1]); } } private void doSetGameStateLabelText(final CtFwSGameState gs, String rationale) { @@ -289,4 +325,49 @@ class CtFwSDisplayLocal implements CtFwSGameState.Observer { }); } } + + // Stun timers + private class StunTimer { + final Chronometer ch; + final ProgressBar pb; + final int ms; + long wallEndMS = 0; + + StunTimer(Chronometer ch, ProgressBar pb, int ms) { + this.ch = ch; + this.pb = pb; + this.ms = ms; + } + } + + private void startTimer(StunTimer st, long wallStart) { + resumeTimer(st, wallStart + st.ms); + } + + private void resumeTimer(final StunTimer st, final long wallEnd) { + final long nowWall = System.currentTimeMillis(); + if (nowWall < wallEnd) { + st.ch.setOnChronometerTickListener(null); + st.ch.setVisibility(View.INVISIBLE); + st.pb.setVisibility(View.INVISIBLE); + return; + } + + final long nowEla = SystemClock.elapsedRealtime(); + final long tbcf = nowWall - nowEla; + + st.ch.setBase(wallEnd - st.ms - tbcf); + st.ch.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() { + @Override + public void onChronometerTick(Chronometer chronometer) { + final long nowAbsCB = System.currentTimeMillis(); + st.pb.setProgress((int) (wallEnd - nowAbsCB)); + } + }); + + st.pb.setProgress((int) (wallEnd - nowWall)); + st.ch.start(); + st.ch.setVisibility(View.VISIBLE); + st.pb.setVisibility(View.VISIBLE); + } } \ No newline at end of file diff --git a/mobile/src/main/java/com/acmetensortoys/ctfwstimer/MainActivity.java b/mobile/src/main/java/com/acmetensortoys/ctfwstimer/MainActivity.java index bc0fbda..677ba89 100644 --- a/mobile/src/main/java/com/acmetensortoys/ctfwstimer/MainActivity.java +++ b/mobile/src/main/java/com/acmetensortoys/ctfwstimer/MainActivity.java @@ -108,6 +108,20 @@ public class MainActivity extends AppCompatActivity { } } + private final String SIS_KEY_TMR_FINI = "tmr-ends"; + + @Override + public void onRestoreInstanceState(Bundle in) { + super.onRestoreInstanceState(in); + mCdl.timersFromBundle(in, SIS_KEY_TMR_FINI); + } + + @Override + public void onSaveInstanceState(Bundle out) { + super.onSaveInstanceState(out); + mCdl.timersToBundle(out, SIS_KEY_TMR_FINI); + } + @Override protected void onStop() { Log.d("CtFwS", "onStop"); diff --git a/mobile/src/main/res/layout/activity_main.xml b/mobile/src/main/res/layout/activity_main.xml index e64831d..4f5d77b 100644 --- a/mobile/src/main/res/layout/activity_main.xml +++ b/mobile/src/main/res/layout/activity_main.xml @@ -132,6 +132,71 @@ android:lines="10" android:scrollbars="vertical" android:gravity="bottom" /> + + + + + +