import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageButton;
+import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import net.osdn.gokigen.joggingtimer.R;
import net.osdn.gokigen.joggingtimer.recordlist.ListActivity;
+import net.osdn.gokigen.joggingtimer.stopwatch.graphview.LapTimeGraphView;
import net.osdn.gokigen.joggingtimer.utilities.TimeStringConvert;
-
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
*
*
*/
-public class MainActivity extends WearableActivity implements IClickCallback, MyTimerTrigger.ITimeoutReceiver
+public class MainActivity extends WearableActivity implements IClickCallback, MyTimerTrigger.ITimeoutReceiver, MyTimerCounter.ICounterStatusNotify
{
private final String TAG = toString();
private final IWearableActivityControl controller = new WearableActivityController();
private MyTimerCounter counter = new MyTimerCounter();
- private boolean isCounterLapTime = false;
+ private boolean isCounterLapTime = true;
+ private boolean isLaptimeView = true;
+ private boolean pendingStart = false;
+ private int currentLapCount = 0;
+ private ITimerStopTrigger stopTrigger = null;
/**
*
setContentView(R.layout.activity_main);
- controller.setup(this, this);
+ controller.setup(this, this, counter);
// Enables Always-on
setAmbientEnabled();
*
*/
@Override
- protected void onSaveInstanceState(Bundle outState)
- {
- super.onSaveInstanceState(outState);
-
- /* ここで状態を保存 */
- outState.putParcelable("timerCounter", counter);
- }
-
- /**
- *
- */
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState)
- {
- super.onRestoreInstanceState(savedInstanceState);
-
- /* ここで保存した状態を読み出して設定 */
- counter = savedInstanceState.getParcelable("timerCounter");
- }
-
- /**
- *
- */
- @Override
protected void onResume()
{
super.onResume();
}
}
}
+ isLaptimeView = controller.getDisplayMode();
+ //Log.v(TAG, "isLaptimeView " + isLaptimeView);
+
+ controller.setupReferenceData();
+
if (isStartTimer)
{
// start a timer!
- startTimer();
+ //startTimer();
+ pendingStart = true;
}
}
{
super.onStart();
Log.v(TAG, "onStart()");
+
+ // データベースのセットアップ
+ counter.setCallback(this);
+ controller.setupDatabase(this, false);
}
/**
{
super.onStop();
Log.v(TAG, "onStop()");
+ if (stopTrigger != null)
+ {
+ stopTrigger.forceStop();
+ }
controller.exitApplication(this);
}
{
super.onExitAmbient();
Log.v(TAG, "onExitAmbient()");
- updateTimerLabel();
+ //updateTimerLabel();
}
/**
/**
*
*/
- public void updateTimerLabel()
+ private void updateTimerLabel()
{
ITimerCounter timerCounter = counter;
- if (timerCounter != null)
+ if (timerCounter == null)
{
- int bgColor;
- BoxInsetLayout insetLayout = findViewById(R.id.box_inset_layout);
- RelativeLayout layout = findViewById(R.id.relative_main_layout);
-
- ImageButton btn1 = findViewById(R.id.btn1);
- ImageButton btn2 = findViewById(R.id.btn2);
- ImageButton btn3 = findViewById(R.id.btn3);
-
- updateMainSubCounter();
-
- if (timerCounter.isStarted())
- {
- bgColor = Color.BLACK;
- insetLayout.setBackgroundColor(bgColor);
- insetLayout.invalidate();
-
- layout.setBackgroundColor(bgColor);
- layout.invalidate();
-
- btn1.setImageResource(R.drawable.ic_flag_black_24dp);
- btn1.setBackgroundColor(bgColor);
- btn1.setVisibility(View.VISIBLE);
- btn1.invalidate();
-
- btn2.setImageResource(R.drawable.ic_stop_black_24dp);
- btn2.setBackgroundColor(bgColor);
- btn2.setVisibility(View.VISIBLE);
- btn2.invalidate();
-
- btn3.setImageResource(R.drawable.ic_block_black_24dp);
- btn3.setBackgroundColor(bgColor);
- btn3.setVisibility(View.INVISIBLE);
- btn3.invalidate();
-
- updateElapsedTimes();
- }
- else if (timerCounter.isReset())
- {
- bgColor = Color.BLACK;
- insetLayout.setBackgroundColor(bgColor);
- insetLayout.invalidate();
-
- layout.setBackgroundColor(bgColor);
- layout.invalidate();
-
- btn1.setImageResource(R.drawable.ic_play_arrow_black_24dp);
- btn1.setBackgroundColor(bgColor);
- btn1.setVisibility(View.VISIBLE);
- btn1.invalidate();
-
- btn2.setImageResource(R.drawable.ic_format_list_bulleted_black_24dp);
- btn2.setBackgroundColor(bgColor);
- btn2.setVisibility(View.VISIBLE);
- btn2.invalidate();
-
- btn3.setImageResource(R.drawable.ic_refresh_black_24dp);
- btn3.setBackgroundColor(bgColor);
- btn3.setVisibility(View.INVISIBLE);
- btn3.invalidate();
-
- updateElapsedTimes();
- }
- else
- {
- bgColor = Color.BLACK;
- insetLayout.setBackgroundColor(bgColor);
- insetLayout.invalidate();
-
- layout.setBackgroundColor(bgColor);
- layout.invalidate();
+ return;
+ }
- btn1.setImageResource(R.drawable.ic_play_arrow_black_24dp);
- btn1.setVisibility(View.VISIBLE);
- btn1.setBackgroundColor(bgColor);
- btn1.invalidate();
+ int bgColor;
+ BoxInsetLayout insetLayout = findViewById(R.id.box_inset_layout);
+ RelativeLayout layout = findViewById(R.id.relative_main_layout);
- btn2.setImageResource(R.drawable.ic_format_list_bulleted_black_24dp);
- btn2.setVisibility(View.VISIBLE);
- btn2.setBackgroundColor(bgColor);
- btn2.invalidate();
+ ImageButton btn1 = findViewById(R.id.btn1);
+ ImageButton btn2 = findViewById(R.id.btn2);
+ ImageButton btn3 = findViewById(R.id.btn3);
- btn3.setImageResource(R.drawable.ic_refresh_black_24dp);
- btn3.setVisibility(View.VISIBLE);
- btn3.setBackgroundColor(bgColor);
- btn3.invalidate();
+ updateMainSubCounter();
- updateElapsedTimes();
- }
+ if (timerCounter.isStarted())
+ {
+ bgColor = Color.BLACK;
+ insetLayout.setBackgroundColor(bgColor);
+ insetLayout.invalidate();
+
+ layout.setBackgroundColor(bgColor);
+ layout.invalidate();
+
+ btn1.setImageResource(R.drawable.ic_flag_black_24dp);
+ btn1.setBackgroundColor(bgColor);
+
+ // チャタリング防止(ラップタイムとして、3秒以内は記録しないようボタンを消しておく)
+ long currentElapsedTime = timerCounter.getCurrentElapsedTime();
+ btn1.setVisibility((currentElapsedTime > 3000) ? View.VISIBLE : View.INVISIBLE);
+ btn1.invalidate();
+
+ btn2.setImageResource(R.drawable.ic_stop_black_24dp);
+ btn2.setBackgroundColor(bgColor);
+ btn2.setVisibility(View.VISIBLE);
+ btn2.invalidate();
+
+ btn3.setImageResource(R.drawable.ic_block_black_24dp);
+ btn3.setBackgroundColor(bgColor);
+ btn3.setVisibility(View.INVISIBLE);
+ btn3.invalidate();
+ }
+ else if (timerCounter.isReset())
+ {
+ bgColor = Color.BLACK;
+ insetLayout.setBackgroundColor(bgColor);
+ insetLayout.invalidate();
+
+ layout.setBackgroundColor(bgColor);
+ layout.invalidate();
+
+ btn1.setImageResource(R.drawable.ic_play_arrow_black_24dp);
+ btn1.setBackgroundColor(bgColor);
+ btn1.setVisibility(View.VISIBLE);
+ btn1.invalidate();
+
+ btn2.setImageResource(R.drawable.ic_format_list_bulleted_black_24dp);
+ btn2.setBackgroundColor(bgColor);
+ btn2.setVisibility(View.VISIBLE);
+ btn2.invalidate();
+
+ btn3.setImageResource(R.drawable.ic_refresh_black_24dp);
+ btn3.setBackgroundColor(bgColor);
+ btn3.setVisibility(View.INVISIBLE);
+ btn3.invalidate();
}
+ else
+ {
+ bgColor = Color.BLACK;
+ insetLayout.setBackgroundColor(bgColor);
+ insetLayout.invalidate();
+
+ layout.setBackgroundColor(bgColor);
+ layout.invalidate();
+
+ btn1.setImageResource(R.drawable.ic_play_arrow_black_24dp);
+ btn1.setVisibility(View.VISIBLE);
+ btn1.setBackgroundColor(bgColor);
+ btn1.invalidate();
+
+ btn2.setImageResource(R.drawable.ic_format_list_bulleted_black_24dp);
+ btn2.setVisibility(View.VISIBLE);
+ btn2.setBackgroundColor(bgColor);
+ btn2.invalidate();
+
+ btn3.setImageResource(R.drawable.ic_refresh_black_24dp);
+ btn3.setVisibility(View.VISIBLE);
+ btn3.setBackgroundColor(bgColor);
+ btn3.invalidate();
+ }
+ updateElapsedTimes();
}
@Override
ITimerCounter timerCounter = counter;
if (timerCounter != null)
{
+ LapTimeGraphView graphView = findViewById(R.id.graph_area);
if (timerCounter.isStarted())
{
Log.v(TAG, "startTimer() LAP TIME");
- // チャタリング防止(ラップタイムとして、3秒以内は記録しないようにする)
- if (timerCounter.getCurrentElapsedTime() > 3000)
+ long currentElapsedTime = timerCounter.getCurrentElapsedTime();
+ if (currentElapsedTime > 3000) // チャタリング防止(ラップタイムとして、3秒以内は記録しないようにする)
{
+ currentLapCount++;
long lapTime = timerCounter.timeStamp();
+ long refLapTime = timerCounter.getReferenceLapTime(currentLapCount);
+ long diffTime = (refLapTime == 0) ? 0 : (currentElapsedTime - refLapTime);
controller.vibrate(50);
controller.getDataEntry().appendTimeData(lapTime);
+ controller.addTimeStamp(currentLapCount, currentElapsedTime, diffTime);
+ //Log.v(TAG, " [[[ " + currentLapCount + " lap: " + currentElapsedTime + " diff:" + diffTime + " (" + refLapTime + ") ]]]");
+
+ if (graphView != null)
+ {
+ graphView.notifyLapTime();
+ }
}
}
else
{
Log.v(TAG, "startTimer() START");
+ controller.clearTimeStamp();
timerCounter.start();
MyTimerTrigger trigger = new MyTimerTrigger(this, 100, timerCounter);
trigger.startTimer();
+ currentLapCount = 0;
+ stopTrigger = trigger;
+ controller.timerStarted(true);
controller.vibrate(120);
Date date = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
String title = sdf1.format(date);
- controller.getDataEntry().createIndex(title, "", 0, timerCounter.getStartTime());
+ long startTime = timerCounter.getStartTime();
+ controller.getDataEntry().createIndex(title, startTime);
+
+ if (graphView != null)
+ {
+ graphView.notifyStarted(startTime);
+ }
+
}
updateTimerLabel();
}
if (timerCounter.isStarted())
{
timerCounter.stop();
+ controller.timerStarted(false);
controller.vibrate(120);
controller.getDataEntry().finishTimeData(timerCounter.getStartTime(), timerCounter.getStopTime());
+
+ int lapCount = currentLapCount + 1;
+ long currentElapsedTime = timerCounter.getLastElapsedTime() - timerCounter.getElapsedTime(currentLapCount);
+ long refLapTime = timerCounter.getReferenceLapTime(lapCount);
+ long diffTime = (refLapTime == 0) ? 0 : (currentElapsedTime - refLapTime);
+ controller.addTimeStamp(lapCount, currentElapsedTime, diffTime);
ret = true;
+
+ LapTimeGraphView graphView = findViewById(R.id.graph_area);
+ if (graphView != null)
+ {
+ graphView.notifyStopped();
+ }
}
updateTimerLabel();
}
{
timerCounter.reset();
controller.vibrate(50);
+ controller.clearTimeStamp();
+ currentLapCount = 0;
+ LapTimeGraphView graphView = findViewById(R.id.graph_area);
+ if (graphView != null)
+ {
+ graphView.notifyReset();
+ }
}
updateTimerLabel();
}
}
@Override
+ public void clickedArea()
+ {
+ Log.v(TAG, "clickedArea()");
+
+ }
+
+ @Override
public boolean pushedBtn1()
{
return (false);
return (false);
}
+ @Override
+ public boolean pushedArea()
+ {
+ isLaptimeView = !isLaptimeView;
+ controller.setDisplayMode(isLaptimeView);
+ Log.v(TAG, "pushedArea() : " + isLaptimeView);
+ changeGraphicView(isLaptimeView);
+ updateTimerLabel();
+ return (true);
+ }
+
/**
*
*
{
long time1 = timerCounter.getPastTime();
CharSequence str1 = TimeStringConvert.getTimeString(time1);
-
CharSequence str2 = "";
if (timerCounter.isStarted())
{
*/
private void updateElapsedTimes()
{
- String dummy = "";
- TextView area1 = findViewById(R.id.sub_counter2);
- TextView area2 = findViewById(R.id.sub_counter3);
- TextView area3 = findViewById(R.id.sub_counter4);
-
- ITimerCounter timerCounter = counter;
- if (timerCounter != null)
+ if (isLaptimeView)
{
- List<Long> elapsedTimes = timerCounter.getTimerList();
- int indexSize = elapsedTimes.size();
- if (indexSize <= 1)
- {
- // ラップの記録がないので表示しません
- area1.setText(dummy);
- area1.invalidate();
- area2.setText(dummy);
- area2.invalidate();
- area3.setText(dummy);
- area3.invalidate();
- return;
- }
- if (indexSize <= 2)
- {
- // ラップが1つとれた場合
- long time = (elapsedTimes.get(indexSize - 1) - elapsedTimes.get(indexSize - 2));
- String elapsedTime = "[" + (timerCounter.getElapsedCount() - 1) + "] " + TimeStringConvert.getTimeString(time);
- area1.setText(elapsedTime);
- area1.invalidate();
- area2.setText(dummy);
- area2.invalidate();
- area3.setText(dummy);
- area3.invalidate();
- return;
- }
- if (indexSize <= 3)
- {
- // ラップが3つとれた場合
- long time1 = (elapsedTimes.get(indexSize - 2) - elapsedTimes.get(indexSize - 3));
- long time2 = (elapsedTimes.get(indexSize - 1) - elapsedTimes.get(indexSize - 2));
- String elapsedTime1 = "[" + (timerCounter.getElapsedCount() - 2) + "] " + TimeStringConvert.getTimeString(time1);
- String elapsedTime2 = "[" + (timerCounter.getElapsedCount() - 1) + "] " + TimeStringConvert.getTimeString(time2);
- area1.setText(elapsedTime1);
- area1.invalidate();
- area2.setText(elapsedTime2);
- area2.invalidate();
- area3.setText(dummy);
- area3.invalidate();
- return;
- }
-
- // ラップが4つ以上ある場合
- long time1 = (elapsedTimes.get(indexSize - 3) - elapsedTimes.get(indexSize - 4));
- long time2 = (elapsedTimes.get(indexSize - 2) - elapsedTimes.get(indexSize - 3));
- long time3 = (elapsedTimes.get(indexSize - 1) - elapsedTimes.get(indexSize - 2));
- String elapsedTime1 = "[" + (timerCounter.getElapsedCount() - 3) + "] " + TimeStringConvert.getTimeString(time1);
- String elapsedTime2 = "[" + (timerCounter.getElapsedCount() - 2) + "] " + TimeStringConvert.getTimeString(time2);
- String elapsedTime3 = "[" + (timerCounter.getElapsedCount() - 1) + "] " + TimeStringConvert.getTimeString(time3);
- area1.setText(elapsedTime1);
- area1.invalidate();
- area2.setText(elapsedTime2);
- area2.invalidate();
- area3.setText(elapsedTime3);
- area3.invalidate();
+ updateElapsedTimesGraph();
+ }
+ else
+ {
+ updateElapsedTimesText();
}
}
/**
+ *
+ *
+ */
+ private void updateElapsedTimesGraph()
+ {
+ //Log.v(TAG, "updateElapsedTimesGraph()");
+ LapTimeGraphView view = findViewById(R.id.graph_area);
+ view.invalidate();
+ }
+
+ /**
+ *
+ *
+ */
+ private void updateElapsedTimesText()
+ {
+ // Log.v(TAG, "updateElapsedTimesText()");
+ }
+
+ /**
* Launch ListActivity
*
*/
}
}
- /*
+ /**
+ *
+ *
+ */
+ @Override
+ protected void onUserLeaveHint()
+ {
+ Log.v(TAG, "onUserLeaveHint() " );
+ // ハードキー(ホームボタン)が押されたとき、これがひろえるが...
+ }
+
+ /**
*
*
*/
@Override
- public boolean dispatchKeyEvent(KeyEvent e)
+ public boolean dispatchKeyEvent(KeyEvent event)
{
- Log.v(TAG, "dispatchKeyEvent() : " + e.getAction() + " " + e.getKeyCode());
+ Log.v(TAG, "dispatchKeyEvent() : " + event.getAction() + " (" + event.getKeyCode() + ")");
- // DOWNとUPが取得できるのでログの2重表示防止のため
- if (e.getAction() == KeyEvent.ACTION_DOWN)
+ return (super.dispatchKeyEvent(event));
+ }
+
+ /**
+ *
+ *
+ */
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event)
+ {
+ Log.v(TAG, "onKeyDown() : " + event.getAction() + " (" + event.getKeyCode() + ")" + keyCode);
+ if (event.getRepeatCount() == 0)
{
- //キーコード表示
- Log.d("KeyCode","KeyCode:"+ e.getKeyCode());
+ if (keyCode == KeyEvent.KEYCODE_STEM_1)
+ {
+ startTimer();
+ return (true);
+ }
+ else if (keyCode == KeyEvent.KEYCODE_STEM_2)
+ {
+ startTimer();
+ return (true);
+ }
+ else if (keyCode == KeyEvent.KEYCODE_STEM_3)
+ {
+ startTimer();
+ return (true);
+ }
}
- return (super.dispatchKeyEvent(e));
+ return (super.onKeyDown(keyCode, event));
}
- /*
+ /**
*
*
*/
-/*
- private String getElapsedTime()
+ @Override
+ public void counterStatusChanged(final boolean forceStartTimer)
{
- String elapsedTime = "";
ITimerCounter timerCounter = counter;
- if (timerCounter != null)
+ if (forceStartTimer)
+ {
+ try
+ {
+ LapTimeGraphView graphView = findViewById(R.id.graph_area);
+ if (timerCounter != null)
+ {
+ MyTimerTrigger trigger = new MyTimerTrigger(this, 100, timerCounter);
+ trigger.startTimer();
+ stopTrigger = trigger;
+ }
+ if (graphView != null)
+ {
+ graphView.notifyLapTime();
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ runOnUiThread(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+
+ // 自動スタート時の処理。。
+ if (pendingStart)
+ {
+ startTimer();
+ pendingStart = false;
+ }
+
+ // ラップタイム表示状態の更新
+ reloadLapTimeList(forceStartTimer);
+
+ // 表示ビューの切り替え
+ changeGraphicView(isLaptimeView);
+
+ // 表示のボタン状態を変更
+ updateTimerLabel();
+ }
+ });
+ }
+
+ /**
+ *
+ *
+ */
+ private void reloadLapTimeList(final boolean forceStartTimer)
+ {
+ ITimerCounter timerCounter = counter;
+ if ((!forceStartTimer)||(timerCounter == null))
+ {
+ return;
+ }
+
+ // Adapter と TimerCounterの整合性を確認
+ try
{
- int count = timerCounter.getElapsedCount();
- if (count > 0)
+ List<Long> lapTimeList = timerCounter.getLapTimeList();
+ int lapCount = lapTimeList.size();
+ int listCount = controller.getLapTimeCount();
+ if (lapCount != listCount)
{
- elapsedTime = "[" + timerCounter.getElapsedCount() + "] " + MyTimerCounter.getTimeString(timerCounter.getCurrentElapsedTime());
+ Log.v(TAG, "LAP COUNT IS MISMATCH!!! lap:" + lapCount + " vs list:" + listCount);
+ int index = 0;
+ controller.clearTimeStamp();
+ long prevTime = lapTimeList.get(0);
+ for (long lapTime : lapTimeList)
+ {
+ index++;
+ if (prevTime != lapTime)
+ {
+ long refLapTime = counter.getReferenceLapTime(index - 1);
+ long curLapTime = lapTime - prevTime;
+ long calcRefLapTime = (refLapTime == 0) ? 0 : (curLapTime - refLapTime);
+ controller.addTimeStamp((index - 1), curLapTime, calcRefLapTime);
+ }
+ prevTime = lapTime;
+ }
+ currentLapCount = lapCount - 1;
}
}
- return (elapsedTime);
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ *
+ *
+ */
+ private void changeGraphicView(boolean isGraphics)
+ {
+ try
+ {
+ LapTimeGraphView graphView = findViewById(R.id.graph_area);
+ ListView listView = findViewById(R.id.laptime_list_area);
+ if (isGraphics)
+ {
+ graphView.setITimerCounter(counter);
+ graphView.setVisibility(View.VISIBLE);
+ listView.setVisibility(View.GONE);
+ }
+ else
+ {
+ graphView.setVisibility(View.GONE);
+ listView.setVisibility(View.VISIBLE);
+ }
+ //controller.vibrate(30);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
}
-*/
}