OSDN Git Service

a91856641e48ce46eab497d71e4cd846d05cbb36
[gokigen/JoggingTimer.git] / wear / src / main / java / net / osdn / gokigen / joggingtimer / stopwatch / WearableActivityController.java
1 package net.osdn.gokigen.joggingtimer.stopwatch;
2
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;
14
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;
24
25 import java.util.ArrayList;
26
27 import static android.content.Context.VIBRATOR_SERVICE;
28
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;
31
32 import androidx.appcompat.app.AppCompatActivity;
33 import androidx.core.app.ActivityCompat;
34 import androidx.core.content.ContextCompat;
35
36 /**
37  *
38  *
39  *
40  */
41 class WearableActivityController implements IWearableActivityControl, ITimeEntryDatabaseCallback, IDataEntry
42 {
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";
46
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;
55
56     private Vibrator vibrator = null;
57     //private PowerManager powerManager = null;
58
59
60     WearableActivityController() {
61         Log.v(TAG, "WearableActivityController()");
62     }
63
64     @Override
65     public void setup(AppCompatActivity activity, IClickCallback callback, IDatabaseReloadCallback dbCallback)
66     {
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);
74     }
75
76     /**
77      *
78      *
79      */
80     private void setupPermissions(AppCompatActivity activity)
81     {
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,
85                     new String[]{
86                             Manifest.permission.VIBRATE,
87                             Manifest.permission.WAKE_LOCK,
88                     },
89                     100);
90         }
91     }
92
93     /**
94      *
95      *
96      */
97     private void setupHardwares(AppCompatActivity activity)
98     {
99         // バイブレータをつかまえる
100         vibrator = (Vibrator) activity.getSystemService(VIBRATOR_SERVICE);
101
102         //// パワーマネージャをつかまえる
103         //powerManager = (PowerManager) activity.getSystemService(POWER_SERVICE);
104     }
105
106     /**
107      *
108      *
109      */
110     private void setupScreen(AppCompatActivity activity)
111     {
112         TextView mTextView = activity.findViewById(R.id.text);
113         if (mTextView != null)
114         {
115             mTextView.setText(R.string.app_name);
116         }
117
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);
123     }
124
125     /**
126      * データベースのセットアップ
127      */
128     @Override
129     public void setupDatabase(final AppCompatActivity activity, final boolean isInitialize)
130     {
131         database = new TimeEntryDatabaseFactory(activity, this).getEntryDatabase();
132         Thread thread = new Thread(() -> {
133             try
134             {
135                 if (isInitialize)
136                 {
137                     // 既存のデータベースを消去する場合、、、
138                     TimeEntryDatabaseFactory.deleteDatabase(activity);
139                 }
140                 database.prepare();
141             }
142             catch (Exception e)
143             {
144                 e.printStackTrace();
145             }
146         });
147         thread.start();
148     }
149
150     /**
151      * リスナのセットアップ
152      */
153     private void setupListeners(AppCompatActivity activity, IClickCallback callback)
154     {
155         try
156         {
157             clickListener.setCallback(callback);
158             ImageButton btn1 = activity.findViewById(R.id.btn1);
159             btn1.setOnClickListener(clickListener);
160             btn1.setOnLongClickListener(clickListener);
161
162             ImageButton btn2 = activity.findViewById(R.id.btn2);
163             btn2.setOnClickListener(clickListener);
164             btn2.setOnLongClickListener(clickListener);
165
166             ImageButton btn3 = activity.findViewById(R.id.btn3);
167             btn3.setOnClickListener(clickListener);
168             btn3.setOnLongClickListener(clickListener);
169
170             TextView main = activity.findViewById(R.id.main_counter);
171             main.setOnClickListener(clickListener);
172             main.setOnLongClickListener(clickListener);
173
174             TextView sub1 = activity.findViewById(R.id.sub_counter1);
175             sub1.setOnClickListener(clickListener);
176             sub1.setOnLongClickListener(clickListener);
177
178             ListView lap = activity.findViewById(R.id.laptime_list_area);
179             //lap.setOnClickListener(clickListener);
180             lap.setOnLongClickListener(clickListener);
181
182             LapTimeGraphView graphView = activity.findViewById(R.id.graph_area);
183             graphView.setOnTouchListener(clickListener);
184             graphView.setOnClickListener(clickListener);
185             graphView.setOnLongClickListener(clickListener);
186         }
187         catch (Exception e)
188         {
189             e.printStackTrace();
190         }
191     }
192
193     /**
194      *
195      *
196      */
197     private void closeDatabase()
198     {
199         Log.v(TAG, "closeDatabase()");
200         Thread thread = new Thread(() -> {
201             // DBのクローズ実行
202             if (isReadyDatabase)
203             {
204                 isReadyDatabase = false;
205                 try
206                 {
207                     Log.v(TAG, "closeDatabase() EXECUTE...");
208                     database.close();
209                 }
210                 catch (Exception e)
211                 {
212                     e.printStackTrace();
213                 }
214             }
215         });
216         thread.start();
217     }
218
219     /**
220      *
221      *
222      */
223     @Override
224     public void exitApplication(AppCompatActivity activity)
225     {
226         Log.v(TAG, "exitApplication()");
227         closeDatabase();
228     }
229
230     @Override
231     public void vibrate(final int duration)
232     {
233         try
234         {
235             if ((vibrator == null) || (!vibrator.hasVibrator()))
236             {
237                 return;
238             }
239
240             Thread thread = new Thread(() -> vibrator.vibrate(duration));
241             thread.start();
242         }
243         catch (Exception e)
244         {
245             e.printStackTrace();
246         }
247     }
248
249     @Override
250     public IDataEntry getDataEntry() {
251         return (this);
252     }
253
254     @Override
255     public boolean getDisplayMode()
256     {
257         try
258         {
259             return (preferences.getBoolean(PREF_KEY_DISPLAY_LAPGRAPHIC, false));
260         }
261         catch (Exception e)
262         {
263             e.printStackTrace();
264         }
265         return (false);
266     }
267
268     @Override
269     public void timerStarted(boolean isStarted)
270     {
271         try
272         {
273             SharedPreferences.Editor editor = preferences.edit();
274             editor.putBoolean(PREF_KEY_TIMER_STARTED, isStarted);
275             editor.apply();
276         }
277         catch (Exception e)
278         {
279             e.printStackTrace();
280         }
281     }
282
283     @Override
284     public void setDisplayMode(boolean displayLapTime)
285     {
286         try
287         {
288             SharedPreferences.Editor editor = preferences.edit();
289             editor.putBoolean(PREF_KEY_DISPLAY_LAPGRAPHIC, displayLapTime);
290             editor.apply();
291         }
292         catch (Exception e)
293         {
294             e.printStackTrace();
295         }
296     }
297
298
299     @Override
300     public void addTimeStamp(long count, long lapTime, long diffTime)
301     {
302         if (lapTimeHolder != null)
303         {
304             lapTimeHolder.addLapTime(new LapTimeItems(count, lapTime, diffTime));
305         }
306     }
307
308     @Override
309     public void clearTimeStamp()
310     {
311         if (lapTimeHolder != null)
312         {
313             lapTimeHolder.clearLapTime();
314         }
315     }
316
317     @Override
318     public int getLapTimeCount()
319     {
320         int count = 0;
321         if (lapTimeHolder != null)
322         {
323             count = lapTimeHolder.getLapTimeCount();
324         }
325         return (count);
326     }
327
328     @Override
329     public int getReferenceTimerSelection()
330     {
331         try
332         {
333             return (preferences.getInt(PREF_KEY_REFERENCE_TIME_SELECTION, 0));
334         }
335         catch (Exception e)
336         {
337             e.printStackTrace();
338         }
339         return (0);
340     }
341
342     @Override
343     public void setReferenceTimerSelection(int id)
344     {
345         try
346         {
347             SharedPreferences.Editor editor = preferences.edit();
348             editor.putInt(PREF_KEY_REFERENCE_TIME_SELECTION, id);
349             editor.apply();
350         }
351         catch (Exception e)
352         {
353             e.printStackTrace();
354         }
355     }
356
357     @Override
358     public void setupReferenceData()
359     {
360         try
361         {
362             if (isReadyDatabase)
363             {
364                 loadReferenceData();
365                 pendingLoadReference = false;
366             }
367             else
368             {
369                 pendingLoadReference = true;
370             }
371         }
372         catch (Exception e)
373         {
374             e.printStackTrace();
375         }
376     }
377
378     @SuppressLint("Range")
379     @Override
380     public void prepareFinished(boolean isReady)
381     {
382         Log.v(TAG, "database prepareFinished() : " + isReady);
383         isReadyDatabase = isReady;
384
385         try
386         {
387             boolean isStarted = preferences.getBoolean(PREF_KEY_TIMER_STARTED, false);
388             recordingIndexId = preferences.getLong(PREF_KEY_TIMER_INDEXID, -1);
389
390             Log.v(TAG, "isStarted : " + isStarted + "  indexId : " + recordingIndexId);
391
392             // load reference data
393             if (pendingLoadReference)
394             {
395                 loadReferenceData();
396                 pendingLoadReference = false;
397             }
398
399             // load current lap time list
400             if ((isStarted) && (recordingIndexId >= 0) && (isReadyDatabase))
401             {
402                 ArrayList<Long> list = new ArrayList<>();
403                 Cursor cursor = database.getAllDetailData(recordingIndexId);
404                 while (cursor.moveToNext())
405                 {
406                     list.add(cursor.getLong(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY)));
407                 }
408                 dbCallback.dataIsReloaded(list);
409             }
410         }
411         catch (Exception e)
412         {
413             e.printStackTrace();
414         }
415     }
416
417     @SuppressLint("Range")
418     private void loadReferenceData()
419     {
420         // load reference data
421         try
422         {
423             int id = getReferenceTimerSelection();
424             ArrayList<Long> refList = null;
425             Cursor cursor = database.getAllReferenceDetailData(id);
426             if (cursor != null)
427             {
428                 refList = new ArrayList<>();
429                 while (cursor.moveToNext())
430                 {
431                     refList.add(cursor.getLong(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY)));
432                 }
433             }
434             dbCallback.referenceDataIsReloaded(id, refList);
435         }
436         catch (Exception e)
437         {
438             e.printStackTrace();
439         }
440     }
441
442     @Override
443     public void timeEntryFinished(OperationType operationType, boolean result, long indexId, long dataId)
444     {
445         Log.v(TAG, "database timeEntryFinished() : " + result + "  [" + indexId + "] " + dataId);
446     }
447
448     @Override
449     public void modelDataEntryFinished(OperationType operationType, boolean result, long indexId, String title)
450     {
451         //
452     }
453
454     @Override
455     public void dataEntryFinished(OperationType operationType, boolean result, long id, String title)
456     {
457         Log.v(TAG, "database dataEntryFinished() : " + result + "  [" + id + "] " + title);
458         if ((result)&&(operationType == OperationType.CREATED))
459         {
460             setIndexId(id);
461         }
462     }
463
464     private void setIndexId(long id)
465     {
466         try
467         {
468             recordingIndexId = id;
469             SharedPreferences.Editor editor = preferences.edit();
470             editor.putLong(PREF_KEY_TIMER_INDEXID, recordingIndexId);
471             editor.apply();
472         }
473         catch (Exception e)
474         {
475             e.printStackTrace();
476         }
477     }
478
479
480     @Override
481     public void createIndex(final String title, final long startTime)
482     {
483         final String memo = "";
484         final int icon = 0;
485         Log.v(TAG, "createIndex() " + title + " " + startTime);
486         Thread thread = new Thread(() -> {
487             if (isReadyDatabase)
488             {
489                 try
490                 {
491                     database.createIndexData(title, memo, icon, startTime);
492                 }
493                 catch (Exception e)
494                 {
495                     e.printStackTrace();
496                 }
497             }
498         });
499         thread.start();
500     }
501
502     @Override
503     public void appendTimeData(final long elapsedTime)
504     {
505         Log.v(TAG, "appendTimeData() " + " " + elapsedTime);
506         Thread thread = new Thread(() -> {
507             if (isReadyDatabase)
508             {
509                 try
510                 {
511                     database.appendTimeData(recordingIndexId, elapsedTime);
512                 }
513                 catch (Exception e)
514                 {
515                     e.printStackTrace();
516                 }
517             }
518         });
519         thread.start();
520     }
521
522     @Override
523     public void finishTimeData(final long startTime, final long endTime)
524     {
525         Log.v(TAG, "finishTimeData() " + startTime + " " + endTime);
526         Thread thread = new Thread(() -> {
527             if (isReadyDatabase)
528             {
529                 try
530                 {
531                     database.finishTimeData(recordingIndexId, startTime, endTime);
532                 }
533                 catch (Exception e)
534                 {
535                     e.printStackTrace();
536                 }
537             }
538         });
539         thread.start();
540     }
541 }