OSDN Git Service

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