1 package net.osdn.gokigen.joggingtimer.stopwatch;
3 import android.Manifest;
4 import android.annotation.SuppressLint;
5 import android.content.SharedPreferences;
6 import android.content.pm.PackageManager;
7 import android.database.Cursor;
8 import android.os.Vibrator;
9 import android.preference.PreferenceManager;
10 import android.util.Log;
11 import android.widget.ImageButton;
12 import android.widget.ListView;
13 import android.widget.TextView;
15 import net.osdn.gokigen.joggingtimer.R;
16 import net.osdn.gokigen.joggingtimer.stopwatch.graphview.LapTimeGraphView;
17 import net.osdn.gokigen.joggingtimer.stopwatch.listview.ILapTimeHolder;
18 import net.osdn.gokigen.joggingtimer.stopwatch.listview.LapTimeArrayAdapter;
19 import net.osdn.gokigen.joggingtimer.stopwatch.listview.LapTimeItems;
20 import net.osdn.gokigen.joggingtimer.storage.ITimeEntryDatabase;
21 import net.osdn.gokigen.joggingtimer.storage.ITimeEntryDatabaseCallback;
22 import net.osdn.gokigen.joggingtimer.storage.TimeEntryDatabaseFactory;
23 import net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryData;
25 import java.util.ArrayList;
27 import static android.content.Context.VIBRATOR_SERVICE;
29 import static net.osdn.gokigen.joggingtimer.utilities.SelectReferenceViewModeDialog.PREF_KEY_DISPLAY_LAPGRAPHIC;
30 import static net.osdn.gokigen.joggingtimer.utilities.SelectReferenceViewModeDialog.PREF_KEY_REFERENCE_TIME_SELECTION;
32 import androidx.appcompat.app.AppCompatActivity;
33 import androidx.core.app.ActivityCompat;
34 import androidx.core.content.ContextCompat;
41 class WearableActivityController implements IWearableActivityControl, ITimeEntryDatabaseCallback, IDataEntry
43 private final String TAG = toString();
44 private final String PREF_KEY_TIMER_STARTED = "TMR_START";
45 private final String PREF_KEY_TIMER_INDEXID = "TMR_INDEX";
47 private SharedPreferences preferences = null;
48 private final ButtonClickListener clickListener = new ButtonClickListener();
49 private ITimeEntryDatabase database = null;
50 private IDatabaseReloadCallback dbCallback = null;
51 private boolean isReadyDatabase = false;
52 private boolean pendingLoadReference = false;
53 private long recordingIndexId = -1;
54 private ILapTimeHolder lapTimeHolder = null;
56 private Vibrator vibrator = null;
57 //private PowerManager powerManager = null;
60 WearableActivityController() {
61 Log.v(TAG, "WearableActivityController()");
65 public void setup(AppCompatActivity activity, IClickCallback callback, IDatabaseReloadCallback dbCallback)
67 this.preferences = PreferenceManager.getDefaultSharedPreferences(activity);
68 this.dbCallback = dbCallback;
69 setupPermissions(activity);
70 setupHardwares(activity);
71 setupScreen(activity);
72 //setupDatabase(activity, false); // chhange true if when databaese file should be cleared.
73 setupListeners(activity, callback);
80 private void setupPermissions(AppCompatActivity activity)
82 if ((ContextCompat.checkSelfPermission(activity, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED) ||
83 (ContextCompat.checkSelfPermission(activity, Manifest.permission.WAKE_LOCK) != PackageManager.PERMISSION_GRANTED)) {
84 ActivityCompat.requestPermissions(activity,
86 Manifest.permission.VIBRATE,
87 Manifest.permission.WAKE_LOCK,
97 private void setupHardwares(AppCompatActivity activity)
100 vibrator = (Vibrator) activity.getSystemService(VIBRATOR_SERVICE);
103 //powerManager = (PowerManager) activity.getSystemService(POWER_SERVICE);
110 private void setupScreen(AppCompatActivity activity)
112 TextView mTextView = activity.findViewById(R.id.text);
113 if (mTextView != null)
115 mTextView.setText(R.string.app_name);
118 LapTimeArrayAdapter adapter = new LapTimeArrayAdapter(activity.getApplicationContext(), R.layout.column_laptime);
119 adapter.clearLapTime();
120 lapTimeHolder = adapter;
121 ListView lapTimeArea = activity.findViewById(R.id.laptime_list_area);
122 lapTimeArea.setAdapter(adapter);
129 public void setupDatabase(final AppCompatActivity activity, final boolean isInitialize)
131 database = new TimeEntryDatabaseFactory(activity, this).getEntryDatabase();
132 Thread thread = new Thread(() -> {
137 // 既存のデータベースを消去する場合、、、
138 TimeEntryDatabaseFactory.deleteDatabase(activity);
153 private void setupListeners(AppCompatActivity activity, IClickCallback callback)
157 clickListener.setCallback(callback);
158 ImageButton btn1 = activity.findViewById(R.id.btn1);
159 btn1.setOnClickListener(clickListener);
160 btn1.setOnLongClickListener(clickListener);
162 ImageButton btn2 = activity.findViewById(R.id.btn2);
163 btn2.setOnClickListener(clickListener);
164 btn2.setOnLongClickListener(clickListener);
166 ImageButton btn3 = activity.findViewById(R.id.btn3);
167 btn3.setOnClickListener(clickListener);
168 btn3.setOnLongClickListener(clickListener);
170 TextView main = activity.findViewById(R.id.main_counter);
171 main.setOnClickListener(clickListener);
172 main.setOnLongClickListener(clickListener);
174 TextView sub1 = activity.findViewById(R.id.sub_counter1);
175 sub1.setOnClickListener(clickListener);
176 sub1.setOnLongClickListener(clickListener);
178 ListView lap = activity.findViewById(R.id.laptime_list_area);
179 //lap.setOnClickListener(clickListener);
180 lap.setOnLongClickListener(clickListener);
182 LapTimeGraphView graphView = activity.findViewById(R.id.graph_area);
183 graphView.setOnTouchListener(clickListener);
184 graphView.setOnClickListener(clickListener);
185 graphView.setOnLongClickListener(clickListener);
197 private void closeDatabase()
199 Log.v(TAG, "closeDatabase()");
200 Thread thread = new Thread(() -> {
204 isReadyDatabase = false;
207 Log.v(TAG, "closeDatabase() EXECUTE...");
224 public void exitApplication(AppCompatActivity activity)
226 Log.v(TAG, "exitApplication()");
231 public void vibrate(final int duration)
235 if ((vibrator == null) || (!vibrator.hasVibrator()))
240 Thread thread = new Thread(() -> vibrator.vibrate(duration));
250 public IDataEntry getDataEntry() {
255 public boolean getDisplayMode()
259 return (preferences.getBoolean(PREF_KEY_DISPLAY_LAPGRAPHIC, false));
269 public void timerStarted(boolean isStarted)
273 SharedPreferences.Editor editor = preferences.edit();
274 editor.putBoolean(PREF_KEY_TIMER_STARTED, isStarted);
284 public void setDisplayMode(boolean displayLapTime)
288 SharedPreferences.Editor editor = preferences.edit();
289 editor.putBoolean(PREF_KEY_DISPLAY_LAPGRAPHIC, displayLapTime);
300 public void addTimeStamp(long count, long lapTime, long diffTime)
302 if (lapTimeHolder != null)
304 lapTimeHolder.addLapTime(new LapTimeItems(count, lapTime, diffTime));
309 public void clearTimeStamp()
311 if (lapTimeHolder != null)
313 lapTimeHolder.clearLapTime();
318 public int getLapTimeCount()
321 if (lapTimeHolder != null)
323 count = lapTimeHolder.getLapTimeCount();
329 public int getReferenceTimerSelection()
333 return (preferences.getInt(PREF_KEY_REFERENCE_TIME_SELECTION, 0));
343 public void setReferenceTimerSelection(int id)
347 SharedPreferences.Editor editor = preferences.edit();
348 editor.putInt(PREF_KEY_REFERENCE_TIME_SELECTION, id);
358 public void setupReferenceData()
365 pendingLoadReference = false;
369 pendingLoadReference = true;
378 @SuppressLint("Range")
380 public void prepareFinished(boolean isReady)
382 Log.v(TAG, "database prepareFinished() : " + isReady);
383 isReadyDatabase = isReady;
387 boolean isStarted = preferences.getBoolean(PREF_KEY_TIMER_STARTED, false);
388 recordingIndexId = preferences.getLong(PREF_KEY_TIMER_INDEXID, -1);
390 Log.v(TAG, "isStarted : " + isStarted + " indexId : " + recordingIndexId);
392 // load reference data
393 if (pendingLoadReference)
396 pendingLoadReference = false;
399 // load current lap time list
400 if ((isStarted) && (recordingIndexId >= 0) && (isReadyDatabase))
402 ArrayList<Long> list = new ArrayList<>();
403 Cursor cursor = database.getAllDetailData(recordingIndexId);
404 while (cursor.moveToNext())
406 list.add(cursor.getLong(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY)));
408 dbCallback.dataIsReloaded(list);
417 @SuppressLint("Range")
418 private void loadReferenceData()
420 // load reference data
423 int id = getReferenceTimerSelection();
424 ArrayList<Long> refList = null;
425 Cursor cursor = database.getAllReferenceDetailData(id);
428 refList = new ArrayList<>();
429 while (cursor.moveToNext())
431 refList.add(cursor.getLong(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY)));
434 dbCallback.referenceDataIsReloaded(id, refList);
443 public void timeEntryFinished(OperationType operationType, boolean result, long indexId, long dataId)
445 Log.v(TAG, "database timeEntryFinished() : " + result + " [" + indexId + "] " + dataId);
449 public void modelDataEntryFinished(OperationType operationType, boolean result, long indexId, String title)
455 public void dataEntryFinished(OperationType operationType, boolean result, long id, String title)
457 Log.v(TAG, "database dataEntryFinished() : " + result + " [" + id + "] " + title);
458 if ((result)&&(operationType == OperationType.CREATED))
464 private void setIndexId(long id)
468 recordingIndexId = id;
469 SharedPreferences.Editor editor = preferences.edit();
470 editor.putLong(PREF_KEY_TIMER_INDEXID, recordingIndexId);
481 public void createIndex(final String title, final long startTime)
483 final String memo = "";
485 Log.v(TAG, "createIndex() " + title + " " + startTime);
486 Thread thread = new Thread(() -> {
491 database.createIndexData(title, memo, icon, startTime);
503 public void appendTimeData(final long elapsedTime)
505 Log.v(TAG, "appendTimeData() " + " " + elapsedTime);
506 Thread thread = new Thread(() -> {
511 database.appendTimeData(recordingIndexId, elapsedTime);
523 public void finishTimeData(final long startTime, final long endTime)
525 Log.v(TAG, "finishTimeData() " + startTime + " " + endTime);
526 Thread thread = new Thread(() -> {
531 database.finishTimeData(recordingIndexId, startTime, endTime);