OSDN Git Service

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