1 package net.osdn.gokigen.joggingtimer.stopwatch;
3 import android.content.Intent;
4 import android.graphics.Color;
5 import android.os.Bundle;
6 import android.support.wear.widget.BoxInsetLayout;
7 import android.support.wearable.activity.WearableActivity;
8 import android.util.Log;
9 import android.view.KeyEvent;
10 import android.view.View;
11 import android.widget.ImageButton;
12 import android.widget.LinearLayout;
13 import android.widget.ListView;
14 import android.widget.RelativeLayout;
15 import android.widget.ScrollView;
16 import android.widget.TextView;
18 import net.osdn.gokigen.joggingtimer.R;
19 import net.osdn.gokigen.joggingtimer.recordlist.ListActivity;
20 import net.osdn.gokigen.joggingtimer.utilities.TimeStringConvert;
22 import java.text.SimpleDateFormat;
23 import java.util.Date;
24 import java.util.List;
25 import java.util.Locale;
31 public class MainActivity extends WearableActivity implements IClickCallback, MyTimerTrigger.ITimeoutReceiver, MyTimerCounter.ICounterStatusNotify
33 private final String TAG = toString();
34 private final IWearableActivityControl controller = new WearableActivityController();
35 private MyTimerCounter counter = new MyTimerCounter();
36 private boolean isCounterLapTime = false;
37 private boolean isLaptimeView = true;
38 private ITimerStopTrigger stopTrigger = null;
44 protected void onCreate(Bundle savedInstanceState)
46 super.onCreate(savedInstanceState);
47 Log.v(TAG, "onCreate()");
49 setContentView(R.layout.activity_main);
51 controller.setup(this, this, counter);
61 protected void onResume()
66 Intent intent = getIntent();
67 String action = intent.getAction();
68 Log.v(TAG, "onResume() : " + action);
70 boolean isStartTimer = false;
73 if (action.equals("com.google.android.wearable.action.STOPWATCH"))
77 else if (action.equals("vnd.google.fitness.TRACK"))
79 String activity = intent.getStringExtra("actionStatus");
80 if ((activity != null)&&(activity.equals("ActiveActionStatus")))
86 controller.setupReferenceData();
95 changeGraphicView(isLaptimeView);
102 protected void onPause()
105 Log.v(TAG, "onPause()");
113 public void onStart()
116 Log.v(TAG, "onStart()");
119 counter.setCallback(this);
120 controller.setupDatabase(this, false);
131 Log.v(TAG, "onStop()");
132 if (stopTrigger != null)
134 stopTrigger.forceStop();
136 controller.exitApplication(this);
144 public void onEnterAmbient(Bundle ambientDetails)
146 super.onEnterAmbient(ambientDetails);
147 Log.v(TAG, "onEnterAmbient()");
155 public void onExitAmbient()
157 super.onExitAmbient();
158 Log.v(TAG, "onExitAmbient()");
159 //updateTimerLabel();
167 public void onUpdateAmbient()
169 super.onUpdateAmbient();
170 Log.v(TAG, "onUpdateAmbient()");
176 private void updateTimerLabel()
178 ITimerCounter timerCounter = counter;
179 if (timerCounter == null)
185 BoxInsetLayout insetLayout = findViewById(R.id.box_inset_layout);
186 RelativeLayout layout = findViewById(R.id.relative_main_layout);
188 ImageButton btn1 = findViewById(R.id.btn1);
189 ImageButton btn2 = findViewById(R.id.btn2);
190 ImageButton btn3 = findViewById(R.id.btn3);
192 updateMainSubCounter();
194 if (timerCounter.isStarted())
196 bgColor = Color.BLACK;
197 insetLayout.setBackgroundColor(bgColor);
198 insetLayout.invalidate();
200 layout.setBackgroundColor(bgColor);
203 btn1.setImageResource(R.drawable.ic_flag_black_24dp);
204 btn1.setBackgroundColor(bgColor);
205 btn1.setVisibility(View.VISIBLE);
208 btn2.setImageResource(R.drawable.ic_stop_black_24dp);
209 btn2.setBackgroundColor(bgColor);
210 btn2.setVisibility(View.VISIBLE);
213 btn3.setImageResource(R.drawable.ic_block_black_24dp);
214 btn3.setBackgroundColor(bgColor);
215 btn3.setVisibility(View.INVISIBLE);
218 else if (timerCounter.isReset())
220 bgColor = Color.BLACK;
221 insetLayout.setBackgroundColor(bgColor);
222 insetLayout.invalidate();
224 layout.setBackgroundColor(bgColor);
227 btn1.setImageResource(R.drawable.ic_play_arrow_black_24dp);
228 btn1.setBackgroundColor(bgColor);
229 btn1.setVisibility(View.VISIBLE);
232 btn2.setImageResource(R.drawable.ic_format_list_bulleted_black_24dp);
233 btn2.setBackgroundColor(bgColor);
234 btn2.setVisibility(View.VISIBLE);
237 btn3.setImageResource(R.drawable.ic_refresh_black_24dp);
238 btn3.setBackgroundColor(bgColor);
239 btn3.setVisibility(View.INVISIBLE);
244 bgColor = Color.BLACK;
245 insetLayout.setBackgroundColor(bgColor);
246 insetLayout.invalidate();
248 layout.setBackgroundColor(bgColor);
251 btn1.setImageResource(R.drawable.ic_play_arrow_black_24dp);
252 btn1.setVisibility(View.VISIBLE);
253 btn1.setBackgroundColor(bgColor);
256 btn2.setImageResource(R.drawable.ic_format_list_bulleted_black_24dp);
257 btn2.setVisibility(View.VISIBLE);
258 btn2.setBackgroundColor(bgColor);
261 btn3.setImageResource(R.drawable.ic_refresh_black_24dp);
262 btn3.setVisibility(View.VISIBLE);
263 btn3.setBackgroundColor(bgColor);
266 updateElapsedTimes();
270 public void clickedCounter()
273 isCounterLapTime = !isCounterLapTime;
280 public void clickedBtn1()
289 private void startTimer()
293 ITimerCounter timerCounter = counter;
294 if (timerCounter != null)
296 if (timerCounter.isStarted())
298 Log.v(TAG, "startTimer() LAP TIME");
299 // チャタリング防止(ラップタイムとして、3秒以内は記録しないようにする)
300 if (timerCounter.getCurrentElapsedTime() > 3000)
302 long lapTime = timerCounter.timeStamp();
303 controller.vibrate(50);
304 controller.getDataEntry().appendTimeData(lapTime);
309 Log.v(TAG, "startTimer() START");
310 timerCounter.start();
311 MyTimerTrigger trigger = new MyTimerTrigger(this, 100, timerCounter);
312 trigger.startTimer();
313 stopTrigger = trigger;
314 controller.timerStarted(true);
315 controller.vibrate(120);
317 Date date = new Date();
318 SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
319 String title = sdf1.format(date);
320 controller.getDataEntry().createIndex(title, timerCounter.getStartTime());
335 private boolean stopTimer()
340 ITimerCounter timerCounter = counter;
341 if (timerCounter != null)
343 if (timerCounter.isStarted())
346 controller.timerStarted(false);
347 controller.vibrate(120);
348 controller.getDataEntry().finishTimeData(timerCounter.getStartTime(), timerCounter.getStopTime());
365 public void clickedBtn2()
367 ITimerCounter timerCounter = counter;
368 if (timerCounter != null)
370 if (!timerCounter.isStarted())
373 launchListActivity();
376 controller.vibrate(35);
386 public void clickedBtn3()
388 ITimerCounter timerCounter = counter;
389 if (timerCounter != null)
391 if (!timerCounter.isStarted())
393 timerCounter.reset();
394 controller.vibrate(50);
401 public void clickedArea()
403 Log.v(TAG, "clickedArea()");
408 public boolean pushedBtn1()
414 public boolean pushedBtn2()
416 return (stopTimer());
420 public boolean pushedBtn3()
426 public boolean pushedArea()
428 isLaptimeView = !isLaptimeView;
429 Log.v(TAG, "pushedArea() : " + isLaptimeView);
430 changeGraphicView(isLaptimeView);
440 public void timeout()
444 runOnUiThread(new Runnable() {
461 private void updateMainSubCounter()
463 TextView main = findViewById(R.id.main_counter);
464 TextView sub = findViewById(R.id.sub_counter1);
466 ITimerCounter timerCounter = counter;
467 if (timerCounter != null)
469 long time1 = timerCounter.getPastTime();
470 CharSequence str1 = TimeStringConvert.getTimeString(time1);
471 CharSequence str2 = "";
472 if (timerCounter.isStarted())
474 long time2 = timerCounter.getCurrentElapsedTime();
475 int lapCount = timerCounter.getElapsedCount();
476 if ((time2 >= 100) && (lapCount > 1))
478 str2 = "[" + lapCount + "] " + TimeStringConvert.getTimeString(time2);
482 if ((str2.length() > 0)&&(isCounterLapTime))
502 private void updateElapsedTimes()
506 updateElapsedTimesGraph();
510 updateElapsedTimesText();
518 private void updateElapsedTimesGraph()
520 Log.v(TAG, "updateElapsedTimesGraph()");
522 LapTimeGraphView view = findViewById(R.id.graph_area);
530 private void updateElapsedTimesText()
534 TextView area1 = findViewById(R.id.sub_counter2);
535 TextView area2 = findViewById(R.id.sub_counter3);
536 TextView area3 = findViewById(R.id.sub_counter4);
537 TextView area4 = findViewById(R.id.sub_counter5);
538 TextView area5 = findViewById(R.id.sub_counter6);
540 ITimerCounter timerCounter = counter;
541 if (timerCounter != null)
543 List<Long> elapsedTimes = timerCounter.getTimerList();
544 List<Long> referenceTimes = timerCounter.getReferenceTimeList();
545 int indexSize = elapsedTimes.size();
546 int referenceSize = referenceTimes.size();
550 area1.setText(dummy);
552 area2.setText(dummy);
554 area3.setText(dummy);
556 area4.setText(dummy);
558 area5.setText(dummy);
565 long time = (elapsedTimes.get(indexSize - 1) - elapsedTimes.get(indexSize - 2));
566 long refTime = (referenceSize >= indexSize) ? (referenceTimes.get(indexSize - 1) - referenceTimes.get(indexSize - 2)) : 0;
567 String elapsedTime = "[" + (timerCounter.getElapsedCount() - 1) + "] " + TimeStringConvert.getTimeString(time);
570 elapsedTime = elapsedTime + " ( " + TimeStringConvert.getDiffTimeString( time - refTime) + " )";
572 area1.setText(elapsedTime);
574 area2.setText(dummy);
576 area3.setText(dummy);
578 area4.setText(dummy);
580 area5.setText(dummy);
588 long time1 = (elapsedTimes.get(indexSize - 2) - elapsedTimes.get(indexSize - 3));
589 long refTime1 = (referenceSize >= (indexSize - 1)) ? (referenceTimes.get(indexSize - 2) - referenceTimes.get(indexSize - 3)) : 0;
590 long time2 = (elapsedTimes.get(indexSize - 1) - elapsedTimes.get(indexSize - 2));
591 long refTime2 = (referenceSize >= indexSize) ? (referenceTimes.get(indexSize - 1) - referenceTimes.get(indexSize - 2)) : 0;
592 String elapsedTime1 = "[" + (timerCounter.getElapsedCount() - 2) + "] " + TimeStringConvert.getTimeString(time1);
595 elapsedTime1 = elapsedTime1 + " ( " + TimeStringConvert.getDiffTimeString( time1 - refTime1) + " )";
597 String elapsedTime2 = "[" + (timerCounter.getElapsedCount() - 1) + "] " + TimeStringConvert.getTimeString(time2);
600 elapsedTime2 = elapsedTime2 + " ( " + TimeStringConvert.getDiffTimeString( time2 - refTime2) + " )";
602 area1.setText(elapsedTime1);
604 area2.setText(elapsedTime2);
606 area3.setText(dummy);
608 area4.setText(dummy);
610 area5.setText(dummy);
618 long time1 = (elapsedTimes.get(indexSize - 3) - elapsedTimes.get(indexSize - 4));
619 long refTime1 = (referenceSize >= (indexSize - 2)) ? (referenceTimes.get(indexSize - 3) - referenceTimes.get(indexSize - 4)) : 0;
621 long time2 = (elapsedTimes.get(indexSize - 2) - elapsedTimes.get(indexSize - 3));
622 long refTime2 = (referenceSize >= (indexSize - 1)) ? (referenceTimes.get(indexSize - 2) - referenceTimes.get(indexSize - 3)) : 0;
624 long time3 = (elapsedTimes.get(indexSize - 1) - elapsedTimes.get(indexSize - 2));
625 long refTime3 = (referenceSize >= indexSize) ? (referenceTimes.get(indexSize - 1) - referenceTimes.get(indexSize - 2)) : 0;
627 String elapsedTime1 = "[" + (timerCounter.getElapsedCount() - 3) + "] " + TimeStringConvert.getTimeString(time1);
630 elapsedTime1 = elapsedTime1 + " ( " + TimeStringConvert.getDiffTimeString( time1 - refTime1) + " )";
633 String elapsedTime2 = "[" + (timerCounter.getElapsedCount() - 2) + "] " + TimeStringConvert.getTimeString(time2);
636 elapsedTime2 = elapsedTime2 + " ( " + TimeStringConvert.getDiffTimeString( time2 - refTime2) + " )";
639 String elapsedTime3 = "[" + (timerCounter.getElapsedCount() - 1) + "] " + TimeStringConvert.getTimeString(time3);
642 elapsedTime3 = elapsedTime3 + " ( " + TimeStringConvert.getDiffTimeString( time3 - refTime3) + " )";
644 area1.setText(elapsedTime1);
646 area2.setText(elapsedTime2);
648 area3.setText(elapsedTime3);
650 area4.setText(dummy);
652 area5.setText(dummy);
660 long time1 = (elapsedTimes.get(indexSize - 4) - elapsedTimes.get(indexSize - 5));
661 long refTime1 = (referenceSize >= (indexSize - 3)) ? (referenceTimes.get(indexSize - 4) - referenceTimes.get(indexSize - 5)) : 0;
663 long time2 = (elapsedTimes.get(indexSize - 3) - elapsedTimes.get(indexSize - 4));
664 long refTime2 = (referenceSize >= (indexSize - 2)) ? (referenceTimes.get(indexSize - 3) - referenceTimes.get(indexSize - 4)) : 0;
666 long time3 = (elapsedTimes.get(indexSize - 2) - elapsedTimes.get(indexSize - 3));
667 long refTime3 = (referenceSize >= indexSize) ? (referenceTimes.get(indexSize - 2) - referenceTimes.get(indexSize - 3)) : 0;
669 long time4 = (elapsedTimes.get(indexSize - 1) - elapsedTimes.get(indexSize - 2));
670 long refTime4 = (referenceSize >= indexSize) ? (referenceTimes.get(indexSize - 1) - referenceTimes.get(indexSize - 2)) : 0;
672 String elapsedTime1 = "[" + (timerCounter.getElapsedCount() - 4) + "] " + TimeStringConvert.getTimeString(time1);
675 elapsedTime1 = elapsedTime1 + " ( " + TimeStringConvert.getDiffTimeString( time1 - refTime1) + " )";
678 String elapsedTime2 = "[" + (timerCounter.getElapsedCount() - 3) + "] " + TimeStringConvert.getTimeString(time2);
681 elapsedTime2 = elapsedTime2 + " ( " + TimeStringConvert.getDiffTimeString( time2 - refTime2) + " )";
684 String elapsedTime3 = "[" + (timerCounter.getElapsedCount() - 2) + "] " + TimeStringConvert.getTimeString(time3);
687 elapsedTime3 = elapsedTime3 + " ( " + TimeStringConvert.getDiffTimeString( time3 - refTime3) + " )";
690 String elapsedTime4 = "[" + (timerCounter.getElapsedCount() - 1) + "] " + TimeStringConvert.getTimeString(time3);
693 elapsedTime4 = elapsedTime4 + " ( " + TimeStringConvert.getDiffTimeString( time4 - refTime4) + " )";
696 area1.setText(elapsedTime1);
698 area2.setText(elapsedTime2);
700 area3.setText(elapsedTime3);
702 area4.setText(elapsedTime4);
704 area5.setText(dummy);
710 long time1 = (elapsedTimes.get(indexSize - 5) - elapsedTimes.get(indexSize - 6));
711 long refTime1 = (referenceSize >= (indexSize - 4)) ? (referenceTimes.get(indexSize - 5) - referenceTimes.get(indexSize - 6)) : 0;
713 long time2 = (elapsedTimes.get(indexSize - 4) - elapsedTimes.get(indexSize - 5));
714 long refTime2 = (referenceSize >= (indexSize - 3)) ? (referenceTimes.get(indexSize - 4) - referenceTimes.get(indexSize - 5)) : 0;
716 long time3 = (elapsedTimes.get(indexSize - 3) - elapsedTimes.get(indexSize - 4));
717 long refTime3 = (referenceSize >= indexSize - 2) ? (referenceTimes.get(indexSize - 3) - referenceTimes.get(indexSize - 4)) : 0;
719 long time4 = (elapsedTimes.get(indexSize - 2) - elapsedTimes.get(indexSize - 3));
720 long refTime4 = (referenceSize >= indexSize - 1) ? (referenceTimes.get(indexSize - 2) - referenceTimes.get(indexSize - 3)) : 0;
722 long time5 = (elapsedTimes.get(indexSize - 1) - elapsedTimes.get(indexSize - 2));
723 long refTime5 = (referenceSize >= indexSize) ? (referenceTimes.get(indexSize - 1) - referenceTimes.get(indexSize - 2)) : 0;
725 String elapsedTime1 = "[" + (timerCounter.getElapsedCount() - 5) + "] " + TimeStringConvert.getTimeString(time1);
728 elapsedTime1 = elapsedTime1 + " ( " + TimeStringConvert.getDiffTimeString( time1 - refTime1) + " )";
731 String elapsedTime2 = "[" + (timerCounter.getElapsedCount() - 4) + "] " + TimeStringConvert.getTimeString(time2);
734 elapsedTime2 = elapsedTime2 + " ( " + TimeStringConvert.getDiffTimeString( time2 - refTime2) + " )";
737 String elapsedTime3 = "[" + (timerCounter.getElapsedCount() - 3) + "] " + TimeStringConvert.getTimeString(time3);
740 elapsedTime3 = elapsedTime3 + " ( " + TimeStringConvert.getDiffTimeString( time3 - refTime3) + " )";
743 String elapsedTime4 = "[" + (timerCounter.getElapsedCount() - 2) + "] " + TimeStringConvert.getTimeString(time4);
746 elapsedTime4 = elapsedTime4 + " ( " + TimeStringConvert.getDiffTimeString( time4 - refTime4) + " )";
749 String elapsedTime5 = "[" + (timerCounter.getElapsedCount() - 1) + "] " + TimeStringConvert.getTimeString(time5);
752 elapsedTime5 = elapsedTime5 + " ( " + TimeStringConvert.getDiffTimeString( time5 - refTime5) + " )";
755 area1.setText(elapsedTime1);
757 area2.setText(elapsedTime2);
759 area3.setText(elapsedTime3);
761 area4.setText(elapsedTime4);
763 area5.setText(elapsedTime5);
770 * Launch ListActivity
773 private void launchListActivity()
775 Log.v(TAG, "launchListActivity()");
778 Intent intent = new Intent(this, ListActivity.class);
779 startActivity(intent);
792 protected void onUserLeaveHint ()
794 Log.v(TAG, "onUserLeaveHint() " );
795 // ハードキー(ホームボタン)が押されたとき、これがひろえるが...
803 public boolean dispatchKeyEvent(KeyEvent event)
805 Log.v(TAG, "dispatchKeyEvent() : " + event.getAction() + " (" + event.getKeyCode() + ")");
807 return (super.dispatchKeyEvent(event));
815 public boolean onKeyDown(int keyCode, KeyEvent event)
817 Log.v(TAG, "onKeyDown() : " + event.getAction() + " (" + event.getKeyCode() + ")" + keyCode);
818 if (event.getRepeatCount() == 0)
820 if (keyCode == KeyEvent.KEYCODE_STEM_1)
825 else if (keyCode == KeyEvent.KEYCODE_STEM_2)
830 else if (keyCode == KeyEvent.KEYCODE_STEM_3)
836 return (super.onKeyDown(keyCode, event));
844 public void counterStatusChanged(boolean forceStartTimer)
850 ITimerCounter timerCounter = counter;
851 if (timerCounter != null)
853 MyTimerTrigger trigger = new MyTimerTrigger(this, 100, timerCounter);
854 trigger.startTimer();
855 stopTrigger = trigger;
864 runOnUiThread(new Runnable()
878 private void changeGraphicView(boolean isGraphics)
882 LapTimeGraphView graphView = findViewById(R.id.graph_area);
883 ListView listView = findViewById(R.id.laptime_list_area);
886 TextView area1 = findViewById(R.id.sub_counter2);
887 TextView area2 = findViewById(R.id.sub_counter3);
888 TextView area3 = findViewById(R.id.sub_counter4);
889 ScrollView scr = findViewById(R.id.scroll_area);
890 LinearLayout lap = findViewById(R.id.lap_time_area);
894 graphView.setITimerCounter(counter);
895 graphView.setVisibility(View.VISIBLE);
896 listView.setVisibility(View.GONE);
898 scr.setVisibility(View.GONE);
899 lap.setVisibility(View.GONE);
900 area1.setVisibility(View.GONE);
901 area2.setVisibility(View.GONE);
902 area3.setVisibility(View.GONE);
907 graphView.setVisibility(View.GONE);
908 listView.setVisibility(View.VISIBLE);
910 scr.setVisibility(View.VISIBLE);
911 lap.setVisibility(View.VISIBLE);
912 area1.setVisibility(View.VISIBLE);
913 area2.setVisibility(View.VISIBLE);
914 area3.setVisibility(View.VISIBLE);
917 controller.vibrate(30);
930 private String getElapsedTime()
932 String elapsedTime = "";
933 ITimerCounter timerCounter = counter;
934 if (timerCounter != null)
936 int count = timerCounter.getElapsedCount();
939 elapsedTime = "[" + timerCounter.getElapsedCount() + "] " + MyTimerCounter.getTimeString(timerCounter.getCurrentElapsedTime());
942 return (elapsedTime);