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