import net.osdn.gokigen.joggingtimer.R;
-import java.util.ArrayList;
-
/**
*
*
return (ret);
}
- /**
- * 中継...格好悪い...
- *
- */
- void dataIsReloaded(ArrayList<Long> list)
- {
- callback.dataIsReloaded(list);
- }
-
@Override
public int describeContents()
{
package net.osdn.gokigen.joggingtimer.stopwatch;
-import java.util.ArrayList;
-
public interface IClickCallback
{
void clickedCounter();
boolean pushedBtn2();
boolean pushedBtn3();
- void dataIsReloaded(ArrayList<Long> list);
-
}
{
//void entryData(String title, String memo, int icon, long startTime, long endTime, List<Long> elapsedTime);
- void createIndex(String title, String memo, int icon, long startTime);
+ void createIndex(String title, long startTime);
void appendTimeData(long elapsedTime);
void finishTimeData(long startTime, long endTime);
--- /dev/null
+package net.osdn.gokigen.joggingtimer.stopwatch;
+
+import java.util.ArrayList;
+
+/**
+ *
+ *
+ */
+public interface IDatabaseReloadCallback
+{
+ void dataIsReloaded(ArrayList<Long> list);
+ void referenceDataIsReloaded(ArrayList<Long> list);
+}
package net.osdn.gokigen.joggingtimer.stopwatch;
-import java.util.ArrayList;
import java.util.List;
public interface ITimerCounter
void reset();
List<Long> getTimerList();
+ List<Long> getReferenceTimeList();
int getElapsedCount();
long getPastTime();
long getLastElapsedTime();
long getStartTime();
long getStopTime();
- void reloadTimerCounter(long startTime, ArrayList<Long> timelist);
+ void setCallback(MyTimerCounter.ICounterStatusNotify callback);
}
*/
public interface IWearableActivityControl
{
- void setup(WearableActivity activity, IClickCallback callback);
+ void setup(WearableActivity activity, IClickCallback callback, IDatabaseReloadCallback dbCallback);
void setupDatabase(WearableActivity activity, boolean isReset);
void exitApplication(WearableActivity activity);
IDataEntry getDataEntry();
void timerStarted(boolean isStarted);
+ void setupReferenceData();
}
*
*
*/
-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();
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();
}
}
}
+ controller.setupReferenceData();
+
if (isStartTimer)
{
// start a timer!
{
super.onStart();
Log.v(TAG, "onStart()");
+
+ // データベースのセットアップ
+ counter.setCallback(this);
controller.setupDatabase(this, false);
}
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());
+ controller.getDataEntry().createIndex(title, timerCounter.getStartTime());
}
updateTimerLabel();
}
return (false);
}
- @Override
- public void dataIsReloaded(ArrayList<Long> list)
- {
- ITimerCounter timerCounter = counter;
- if ((timerCounter != null)&&(list != null))
- {
- try
- {
- timerCounter.reloadTimerCounter(list.get(0), list);
-
- MyTimerTrigger trigger = new MyTimerTrigger(this, 100, timerCounter);
- trigger.startTimer();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
-
- runOnUiThread(new Runnable()
- {
- @Override
- public void run()
- {
- updateTimerLabel();
- }
- });
- }
-
/**
*
*
return (super.onKeyDown(keyCode, event));
}
+ @Override
+ public void counterStatusChanged(boolean forceStartTimer)
+ {
+ if (forceStartTimer)
+ {
+ try
+ {
+ ITimerCounter timerCounter = counter;
+ if (timerCounter != null)
+ {
+ MyTimerTrigger trigger = new MyTimerTrigger(this, 100, timerCounter);
+ trigger.startTimer();
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ runOnUiThread(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ updateTimerLabel();
+ }
+ });
+ }
+
/*
*
*
import java.util.ArrayList;
import java.util.List;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.SystemClock;
+import android.support.annotation.NonNull;
+import android.util.Log;
/**
* My Timer counter
*
*/
-public class MyTimerCounter implements Parcelable, ITimerCounter
+public class MyTimerCounter implements ITimerCounter, IDatabaseReloadCallback
{
+ private final String TAG = toString();
+ //private static final long COUNTER_UPPERLIMIT = (80 / (1000 * 60 * 60)); // 80h
private boolean isTimerStopped = true;
+ private ICounterStatusNotify callback = null;
private long startTime = 0;
private long stopTime = 0;
private List<Long> elapsedTime = null;
+ private List<Long> referenceTime = null;
MyTimerCounter()
{
{
if (isTimerStopped)
{
- startTime = SystemClock.elapsedRealtime();
+ startTime = System.currentTimeMillis();
stopTime = 0;
elapsedTime.clear();
elapsedTime.add(startTime);
isTimerStopped = false;
+ Log.v(TAG, "start() startTime : " + startTime);
}
}
long timeToSet = 0;
if (!isTimerStopped)
{
- timeToSet = SystemClock.elapsedRealtime();
+ timeToSet = System.currentTimeMillis();
elapsedTime.add(timeToSet);
}
return (timeToSet);
{
if (!isTimerStopped)
{
- stopTime = SystemClock.elapsedRealtime();
+ stopTime = System.currentTimeMillis();
elapsedTime.add(stopTime);
isTimerStopped = true;
}
}
@Override
+ public List<Long> getReferenceTimeList()
+ {
+ return (referenceTime);
+ }
+
+ @Override
public int getElapsedCount()
{
return (elapsedTime.size());
@Override
public long getPastTime()
{
- long currentTime = SystemClock.elapsedRealtime();
+ long currentTime = System.currentTimeMillis();
if (isTimerStopped)
{
if (elapsedTime.size() == 0)
@Override
public long getCurrentElapsedTime()
{
- long currentTime = SystemClock.elapsedRealtime();
+ long currentTime = System.currentTimeMillis();
try
{
return (currentTime - (elapsedTime.get(elapsedTime.size() - 1)));
}
@Override
- public int describeContents()
+ public void setCallback(ICounterStatusNotify callback)
{
- return 0;
+ this.callback = callback;
}
@Override
- public void writeToParcel(Parcel dest, int flags)
- {
- dest.writeInt(isTimerStopped ? 1 : 0);
- dest.writeLong(startTime);
- dest.writeLong(stopTime);
- dest.writeList(elapsedTime);
- }
-
- public static final Parcelable.Creator<MyTimerCounter> CREATOR = new Parcelable.Creator<MyTimerCounter>()
+ public void dataIsReloaded(@NonNull ArrayList<Long> timelist)
{
- public MyTimerCounter createFromParcel(Parcel in)
+ try
{
- return (new MyTimerCounter(in));
+ long startTime = timelist.get(0);
+ long pastTime = System.currentTimeMillis() - startTime;
+ Log.v(TAG, "pastTime : " + pastTime);
+ this.startTime = startTime;
+ elapsedTime = null;
+ elapsedTime = new ArrayList<>(timelist);
+ stopTime = 0;
+ isTimerStopped = false;
+ if (callback != null)
+ {
+ callback.counterStatusChanged(true);
+ }
}
-
- public MyTimerCounter[] newArray(int size)
+ catch (Exception e)
{
- return (new MyTimerCounter[size]);
+ e.printStackTrace();
}
- };
+ }
- private MyTimerCounter(Parcel in)
+ @Override
+ public void referenceDataIsReloaded(ArrayList<Long> timelist)
{
try
{
- isTimerStopped = (in.readInt() == 1);
- startTime = in.readLong();
- stopTime = in.readLong();
- in.readList(elapsedTime, Long.class.getClassLoader());
+ referenceTime = null;
+ if (timelist != null)
+ {
+ referenceTime = new ArrayList<>(timelist);
+ if (callback != null)
+ {
+ callback.counterStatusChanged(false);
+ }
+ Log.v(TAG, "reference lap time : " + referenceTime.size());
+ }
}
catch (Exception e)
{
}
}
- /**
- *
- *
- */
- public void reloadTimerCounter(long startTime, ArrayList<Long> timelist)
+ public interface ICounterStatusNotify
{
- this.startTime = startTime;
- elapsedTime = null;
- elapsedTime = new ArrayList<>(timelist);
- stopTime = 0;
- isTimerStopped = false;
+ void counterStatusChanged(boolean forceStartTimer);
}
}
private SharedPreferences preferences = null;
private final ButtonClickListener clickListener = new ButtonClickListener();
private ITimeEntryDatabase database = null;
+ private IDatabaseReloadCallback dbCallback = null;
private boolean isReadyDatabase = false;
+ private boolean pendingLoadReference = false;
private long recordingIndexId = -1;
private Vibrator vibrator = null;
//private PowerManager powerManager = null;
- WearableActivityController()
- {
+ WearableActivityController() {
Log.v(TAG, "WearableActivityController()");
}
@Override
- public void setup(WearableActivity activity, IClickCallback callback)
- {
+ public void setup(WearableActivity activity, IClickCallback callback, IDatabaseReloadCallback dbCallback) {
this.preferences = PreferenceManager.getDefaultSharedPreferences(activity);
+ this.dbCallback = dbCallback;
setupPermissions(activity);
setupHardwares(activity);
setupScreen(activity);
*
*
*/
- private void setupPermissions(WearableActivity activity)
- {
- if ((ContextCompat.checkSelfPermission(activity, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED)||
- (ContextCompat.checkSelfPermission(activity, Manifest.permission.WAKE_LOCK) != PackageManager.PERMISSION_GRANTED))
- {
+ private void setupPermissions(WearableActivity activity) {
+ if ((ContextCompat.checkSelfPermission(activity, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED) ||
+ (ContextCompat.checkSelfPermission(activity, Manifest.permission.WAKE_LOCK) != PackageManager.PERMISSION_GRANTED)) {
ActivityCompat.requestPermissions(activity,
new String[]{
Manifest.permission.VIBRATE,
*
*
*/
- private void setupHardwares(WearableActivity activity)
- {
+ private void setupHardwares(WearableActivity activity) {
// バイブレータをつかまえる
vibrator = (Vibrator) activity.getSystemService(VIBRATOR_SERVICE);
*
*
*/
- private void setupScreen(WearableActivity activity)
- {
+ private void setupScreen(WearableActivity activity) {
TextView mTextView = activity.findViewById(R.id.text);
- if (mTextView != null)
- {
+ if (mTextView != null) {
mTextView.setText(R.string.app_name);
}
}
/**
- * データベースのセットアップ
- *
+ * データベースのセットアップ
*/
@Override
- public void setupDatabase(final WearableActivity activity, final boolean isInitialize)
- {
+ public void setupDatabase(final WearableActivity activity, final boolean isInitialize) {
database = new TimeEntryDatabaseFactory(activity, this).getEntryDatabase();
Thread thread = new Thread(new Runnable() {
@Override
- public void run()
- {
- try
- {
- if (isInitialize)
- {
+ public void run() {
+ try {
+ if (isInitialize) {
// 既存のデータベースを消去する場合、、、
TimeEntryDatabaseFactory.deleteDatabase(activity);
}
database.prepare();
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
e.printStackTrace();
}
}
}
/**
- * リスナのセットアップ
- *
+ * リスナのセットアップ
*/
- private void setupListeners(WearableActivity activity, IClickCallback callback)
- {
- try
- {
+ private void setupListeners(WearableActivity activity, IClickCallback callback) {
+ try {
clickListener.setCallback(callback);
ImageButton btn1 = activity.findViewById(R.id.btn1);
btn1.setOnClickListener(clickListener);
TextView main = activity.findViewById(R.id.main_counter);
main.setOnClickListener(clickListener);
main.setOnLongClickListener(clickListener);
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
e.printStackTrace();
}
}
*
*
*/
- private void closeDatabase()
- {
+ private void closeDatabase() {
Log.v(TAG, "closeDatabase()");
Thread thread = new Thread(new Runnable() {
@Override
- public void run()
- {
+ public void run() {
// DBのクローズ実行
- if (isReadyDatabase)
- {
+ if (isReadyDatabase) {
isReadyDatabase = false;
- try
- {
+ try {
Log.v(TAG, "closeDatabase() EXECUTE...");
database.close();
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
e.printStackTrace();
}
}
thread.start();
}
- private int convertIconId(int iconId)
- {
- return (iconId);
- }
-
/**
*
*
*/
@Override
- public void exitApplication(WearableActivity activity)
- {
+ public void exitApplication(WearableActivity activity) {
Log.v(TAG, "exitApplication()");
closeDatabase();
}
@Override
- public void vibrate(final int duration)
- {
- try
- {
- if ((vibrator == null)||(!vibrator.hasVibrator()))
- {
+ public void vibrate(final int duration) {
+ try {
+ if ((vibrator == null) || (!vibrator.hasVibrator())) {
return;
}
}
});
thread.start();
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
e.printStackTrace();
}
}
@Override
- public IDataEntry getDataEntry()
- {
+ public IDataEntry getDataEntry() {
return (this);
}
@Override
- public void timerStarted(boolean isStarted)
- {
- try
- {
+ public void timerStarted(boolean isStarted) {
+ try {
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(PREF_KEY_TIMER_STARTED, isStarted);
editor.apply();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void setupReferenceData()
+ {
+ try
+ {
+ if (isReadyDatabase)
+ {
+ loadReferenceData();
+ pendingLoadReference = false;
+ }
+ else
+ {
+ pendingLoadReference = true;
+ }
}
catch (Exception e)
{
Log.v(TAG, "database prepareFinished() : " + isReady);
isReadyDatabase = isReady;
- try
- {
+ try {
boolean isStarted = preferences.getBoolean(PREF_KEY_TIMER_STARTED, false);
recordingIndexId = preferences.getLong(PREF_KEY_TIMER_INDEXID, -1);
- if ((isStarted)&&(recordingIndexId >= 0)&&(isReadyDatabase))
+
+ Log.v(TAG, "isStarted : " + isStarted + " indexId : " + recordingIndexId);
+
+ // load reference data
+ if (pendingLoadReference)
+ {
+ loadReferenceData();
+ pendingLoadReference = false;
+ }
+
+ // load current lap time list
+ if ((isStarted) && (recordingIndexId >= 0) && (isReadyDatabase))
{
ArrayList<Long> list = new ArrayList<>();
Cursor cursor = database.getAllDetailData(recordingIndexId);
{
list.add(cursor.getLong(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY)));
}
- clickListener.dataIsReloaded(list);
+ dbCallback.dataIsReloaded(list);
}
}
catch (Exception e)
}
}
+ private void loadReferenceData()
+ {
+ // load reference data
+ try
+ {
+ ArrayList<Long> refList = null;
+ Cursor cursor = database.getAllReferenceDetailData();
+ if (cursor != null) {
+ refList = new ArrayList<>();
+ while (cursor.moveToNext())
+ {
+ refList.add(cursor.getLong(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY)));
+ }
+ }
+ dbCallback.referenceDataIsReloaded(refList);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
@Override
public void timeEntryFinished(OperationType operationType, boolean result, long indexId, long dataId)
@Override
- public void createIndex(final String title, final String memo, final int icon, final long startTime)
+ public void createIndex(final String title, final long startTime)
{
+ final String memo = "";
+ final int icon = 0;
Log.v(TAG, "createIndex() " + title + " " + startTime);
Thread thread = new Thread(new Runnable() {
@Override
{
try
{
- database.createIndexData(title, memo, convertIconId(icon), startTime);
+ database.createIndexData(title, memo, icon, startTime);
}
catch (Exception e)
{
Cursor getAllIndexData();
Cursor getAllDetailData(long indexId);
+ Cursor getAllReferenceDetailData();
void deleteTimeEntryData(long indexId);
@Override
public Cursor getAllIndexData()
{
- return (db.rawQuery("SELECT * FROM " + TimeEntryIndex.EntryIndex.TABLE_NAME + " ORDER BY " + TimeEntryIndex.EntryIndex.COLUMN_NAME_START_TIME, null));
+ return (db.rawQuery("SELECT * FROM " + TimeEntryIndex.EntryIndex.TABLE_NAME + " ORDER BY " + TimeEntryIndex.EntryIndex.COLUMN_NAME_START_TIME + " DESC", null));
}
@Override
}
@Override
+ public Cursor getAllReferenceDetailData()
+ {
+ String queryString = "SELECT * FROM " + TimeEntryIndex.EntryIndex.TABLE_NAME + " INNER JOIN " + TimeEntryData.EntryData.TABLE_NAME +
+ " ON " + TimeEntryIndex.EntryIndex.TABLE_NAME + "." + TimeEntryIndex.EntryIndex._ID + " = " + TimeEntryData.EntryData.TABLE_NAME+ "." + TimeEntryData.EntryData.COLUMN_NAME_INDEX_ID +
+ " WHERE " + TimeEntryIndex.EntryIndex.TABLE_NAME+ "." + TimeEntryIndex.EntryIndex.COLUMN_NAME_ICON_ID + " = " + REFERENCE_ICON_ID +
+ " ORDER BY " + TimeEntryData.EntryData.TABLE_NAME+ "." + TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY;
+ //Log.v(TAG, "Query : " + queryString);
+ return (db.rawQuery(queryString, null));
+ }
+
+ @Override
public void deleteTimeEntryData(long indexId)
{
int delRecord = db.delete(TimeEntryData.EntryData.TABLE_NAME, TimeEntryData.EntryData.COLUMN_NAME_INDEX_ID + " = " + indexId, null);