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 androidx.appcompat.app.AppCompatActivity;
30 import androidx.core.app.ActivityCompat;
31 import androidx.core.content.ContextCompat;
38 class WearableActivityController implements IWearableActivityControl, ITimeEntryDatabaseCallback, IDataEntry
40 private final String TAG = toString();
41 private final String PREF_KEY_TIMER_STARTED = "TMR_START";
42 private final String PREF_KEY_TIMER_INDEXID = "TMR_INDEX";
43 private final String PREF_KEY_DISPLAY_LAPGRAPHIC = "DISP_LAPGRPH";
44 private final String PREF_KEY_REFERENCE_TIME_SELECTION = "REF_TIME_SEL";
46 private SharedPreferences preferences = null;
47 private final ButtonClickListener clickListener = new ButtonClickListener();
48 private ITimeEntryDatabase database = null;
49 private IDatabaseReloadCallback dbCallback = null;
50 private boolean isReadyDatabase = false;
51 private boolean pendingLoadReference = false;
52 private long recordingIndexId = -1;
53 private ILapTimeHolder lapTimeHolder = null;
55 private Vibrator vibrator = null;
56 //private PowerManager powerManager = null;
59 WearableActivityController() {
60 Log.v(TAG, "WearableActivityController()");
64 public void setup(AppCompatActivity activity, IClickCallback callback, IDatabaseReloadCallback dbCallback)
66 this.preferences = PreferenceManager.getDefaultSharedPreferences(activity);
67 this.dbCallback = dbCallback;
68 setupPermissions(activity);
69 setupHardwares(activity);
70 setupScreen(activity);
71 //setupDatabase(activity, false); // chhange true if when databaese file should be cleared.
72 setupListeners(activity, callback);
79 private void setupPermissions(AppCompatActivity activity)
81 if ((ContextCompat.checkSelfPermission(activity, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED) ||
82 (ContextCompat.checkSelfPermission(activity, Manifest.permission.WAKE_LOCK) != PackageManager.PERMISSION_GRANTED)) {
83 ActivityCompat.requestPermissions(activity,
85 Manifest.permission.VIBRATE,
86 Manifest.permission.WAKE_LOCK,
96 private void setupHardwares(AppCompatActivity activity)
99 vibrator = (Vibrator) activity.getSystemService(VIBRATOR_SERVICE);
102 //powerManager = (PowerManager) activity.getSystemService(POWER_SERVICE);
109 private void setupScreen(AppCompatActivity activity)
111 TextView mTextView = activity.findViewById(R.id.text);
112 if (mTextView != null)
114 mTextView.setText(R.string.app_name);
117 LapTimeArrayAdapter adapter = new LapTimeArrayAdapter(activity.getApplicationContext(), R.layout.column_laptime);
118 adapter.clearLapTime();
119 lapTimeHolder = adapter;
120 ListView lapTimeArea = activity.findViewById(R.id.laptime_list_area);
121 lapTimeArea.setAdapter(adapter);
128 public void setupDatabase(final AppCompatActivity activity, final boolean isInitialize)
130 database = new TimeEntryDatabaseFactory(activity, this).getEntryDatabase();
131 Thread thread = new Thread(() -> {
136 // 既存のデータベースを消去する場合、、、
137 TimeEntryDatabaseFactory.deleteDatabase(activity);
152 private void setupListeners(AppCompatActivity activity, IClickCallback callback)
156 clickListener.setCallback(callback);
157 ImageButton btn1 = activity.findViewById(R.id.btn1);
158 btn1.setOnClickListener(clickListener);
159 btn1.setOnLongClickListener(clickListener);
161 ImageButton btn2 = activity.findViewById(R.id.btn2);
162 btn2.setOnClickListener(clickListener);
163 btn2.setOnLongClickListener(clickListener);
165 ImageButton btn3 = activity.findViewById(R.id.btn3);
166 btn3.setOnClickListener(clickListener);
167 btn3.setOnLongClickListener(clickListener);
169 TextView main = activity.findViewById(R.id.main_counter);
170 main.setOnClickListener(clickListener);
171 main.setOnLongClickListener(clickListener);
173 TextView sub1 = activity.findViewById(R.id.sub_counter1);
174 sub1.setOnClickListener(clickListener);
175 sub1.setOnLongClickListener(clickListener);
177 ListView lap = activity.findViewById(R.id.laptime_list_area);
178 //lap.setOnClickListener(clickListener);
179 lap.setOnLongClickListener(clickListener);
181 LapTimeGraphView graphView = activity.findViewById(R.id.graph_area);
182 graphView.setOnTouchListener(clickListener);
183 graphView.setOnClickListener(clickListener);
184 graphView.setOnLongClickListener(clickListener);
196 private void closeDatabase()
198 Log.v(TAG, "closeDatabase()");
199 Thread thread = new Thread(() -> {
203 isReadyDatabase = false;
206 Log.v(TAG, "closeDatabase() EXECUTE...");
223 public void exitApplication(AppCompatActivity activity)
225 Log.v(TAG, "exitApplication()");
230 public void vibrate(final int duration)
234 if ((vibrator == null) || (!vibrator.hasVibrator()))
239 Thread thread = new Thread(() -> vibrator.vibrate(duration));
249 public IDataEntry getDataEntry() {
254 public boolean getDisplayMode()
258 return (preferences.getBoolean(PREF_KEY_DISPLAY_LAPGRAPHIC, false));
268 public void timerStarted(boolean isStarted)
272 SharedPreferences.Editor editor = preferences.edit();
273 editor.putBoolean(PREF_KEY_TIMER_STARTED, isStarted);
283 public void setDisplayMode(boolean displayLapTime)
287 SharedPreferences.Editor editor = preferences.edit();
288 editor.putBoolean(PREF_KEY_DISPLAY_LAPGRAPHIC, displayLapTime);
299 public void addTimeStamp(long count, long lapTime, long diffTime)
301 if (lapTimeHolder != null)
303 lapTimeHolder.addLapTime(new LapTimeItems(count, lapTime, diffTime));
308 public void clearTimeStamp()
310 if (lapTimeHolder != null)
312 lapTimeHolder.clearLapTime();
317 public int getLapTimeCount()
320 if (lapTimeHolder != null)
322 count = lapTimeHolder.getLapTimeCount();
328 public int getReferenceTimerSelection()
332 return (preferences.getInt(PREF_KEY_REFERENCE_TIME_SELECTION, 0));
342 public void setReferenceTimerSelection(int id)
346 SharedPreferences.Editor editor = preferences.edit();
347 editor.putInt(PREF_KEY_REFERENCE_TIME_SELECTION, id);
357 public void setupReferenceData()
364 pendingLoadReference = false;
368 pendingLoadReference = true;
377 @SuppressLint("Range")
379 public void prepareFinished(boolean isReady)
381 Log.v(TAG, "database prepareFinished() : " + isReady);
382 isReadyDatabase = isReady;
386 boolean isStarted = preferences.getBoolean(PREF_KEY_TIMER_STARTED, false);
387 recordingIndexId = preferences.getLong(PREF_KEY_TIMER_INDEXID, -1);
389 Log.v(TAG, "isStarted : " + isStarted + " indexId : " + recordingIndexId);
391 // load reference data
392 if (pendingLoadReference)
395 pendingLoadReference = false;
398 // load current lap time list
399 if ((isStarted) && (recordingIndexId >= 0) && (isReadyDatabase))
401 ArrayList<Long> list = new ArrayList<>();
402 Cursor cursor = database.getAllDetailData(recordingIndexId);
403 while (cursor.moveToNext())
405 list.add(cursor.getLong(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY)));
407 dbCallback.dataIsReloaded(list);
416 @SuppressLint("Range")
417 private void loadReferenceData()
419 // load reference data
422 int id = getReferenceTimerSelection();
423 ArrayList<Long> refList = null;
424 Cursor cursor = database.getAllReferenceDetailData(id);
427 refList = new ArrayList<>();
428 while (cursor.moveToNext())
430 refList.add(cursor.getLong(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY)));
433 dbCallback.referenceDataIsReloaded(id, refList);
442 public void timeEntryFinished(OperationType operationType, boolean result, long indexId, long dataId)
444 Log.v(TAG, "database timeEntryFinished() : " + result + " [" + indexId + "] " + dataId);
448 public void modelDataEntryFinished(OperationType operationType, boolean result, long indexId, String title)
454 public void dataEntryFinished(OperationType operationType, boolean result, long id, String title)
456 Log.v(TAG, "database dataEntryFinished() : " + result + " [" + id + "] " + title);
457 if ((result)&&(operationType == OperationType.CREATED))
463 private void setIndexId(long id)
467 recordingIndexId = id;
468 SharedPreferences.Editor editor = preferences.edit();
469 editor.putLong(PREF_KEY_TIMER_INDEXID, recordingIndexId);
480 public void createIndex(final String title, final long startTime)
482 final String memo = "";
484 Log.v(TAG, "createIndex() " + title + " " + startTime);
485 Thread thread = new Thread(() -> {
490 database.createIndexData(title, memo, icon, startTime);
502 public void appendTimeData(final long elapsedTime)
504 Log.v(TAG, "appendTimeData() " + " " + elapsedTime);
505 Thread thread = new Thread(() -> {
510 database.appendTimeData(recordingIndexId, elapsedTime);
522 public void finishTimeData(final long startTime, final long endTime)
524 Log.v(TAG, "finishTimeData() " + startTime + " " + endTime);
525 Thread thread = new Thread(() -> {
530 database.finishTimeData(recordingIndexId, startTime, endTime);