OSDN Git Service

WearableActivity廃止に伴う修正を入れたつもり。
[gokigen/JoggingTimer.git] / wear / src / main / java / net / osdn / gokigen / joggingtimer / recorddetail / RecordDetailSetup.java
1 package net.osdn.gokigen.joggingtimer.recorddetail;
2
3 import android.annotation.SuppressLint;
4 import android.content.Intent;
5 import android.database.Cursor;
6 import android.util.Log;
7
8 import net.osdn.gokigen.joggingtimer.R;
9 import net.osdn.gokigen.joggingtimer.storage.ITimeEntryDatabase;
10 import net.osdn.gokigen.joggingtimer.storage.ITimeEntryDatabaseCallback;
11 import net.osdn.gokigen.joggingtimer.storage.TimeEntryDatabaseFactory;
12 import net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryData;
13 import net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryIndex;
14 import net.osdn.gokigen.joggingtimer.utilities.CreateModelData;
15 import net.osdn.gokigen.joggingtimer.utilities.CreateModelDataDialog;
16 import net.osdn.gokigen.joggingtimer.utilities.TimeStringConvert;
17
18 import static android.provider.BaseColumns._ID;
19 import static net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryIndex.EntryIndex.COLUMN_NAME_MEMO;
20 import static net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryIndex.EntryIndex.COLUMN_NAME_START_TIME;
21 import static net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryIndex.EntryIndex.COLUMN_NAME_TIME_DURATION;
22 import static net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryIndex.EntryIndex.COLUMN_NAME_TITLE;
23
24 import androidx.annotation.NonNull;
25 import androidx.appcompat.app.AppCompatActivity;
26
27 /**
28  *
29  *
30  */
31 public class RecordDetailSetup  implements ITimeEntryDatabaseCallback, IDetailEditor
32 {
33     private final String TAG = toString();
34     private final AppCompatActivity activity;
35     private final long indexId;
36     private final IDatabaseReadyNotify callback;
37     private final IRecordOperation operation;
38     private final CreateModelData.IEditedModelDataCallback editCallback;
39     private ITimeEntryDatabase database = null;
40
41     /**
42      *
43      *
44      */
45     RecordDetailSetup(AppCompatActivity activity, long indexId, IDatabaseReadyNotify callback, IRecordOperation operation, CreateModelData.IEditedModelDataCallback  editCallback)
46     {
47         this.activity = activity;
48         this.indexId = indexId;
49         this.callback = callback;
50         this.operation = operation;
51         this.editCallback = editCallback;
52     }
53
54     /**
55      *
56      *
57      */
58     void setup()
59     {
60         Log.v(TAG, "setup()");
61         database = new TimeEntryDatabaseFactory(activity, this).getEntryDatabase();
62         Thread thread = new Thread(() -> {
63             try
64             {
65                 database.prepare();
66             }
67             catch (Exception e)
68             {
69                 e.printStackTrace();
70             }
71         });
72         thread.start();
73     }
74
75     /**
76      *
77      *
78      */
79     @Override
80     public void prepareFinished(boolean isReady)
81     {
82         if (!isReady)
83         {
84             callback.databaseSetupFinished(false);
85             return;
86         }
87         final IDetailEditor editor = this;
88         Thread thread = new Thread(() -> {
89             boolean ret = false;
90             try
91             {
92                 operation.clearRecord();
93                 Cursor cursor = database.getAllDetailData(indexId);
94                 int index = 0;
95                 long startTime = 0;
96                 long previousLapTime = 0;
97                 long morePreviousTime = 0;
98                 while (cursor.moveToNext())
99                 {
100                     @SuppressLint("Range") long dataId = cursor.getLong(cursor.getColumnIndex(_ID));
101                     @SuppressLint("Range") long indexId = cursor.getLong(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_INDEX_ID));
102                     @SuppressLint("Range") long entryTime = cursor.getLong(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY));
103                     @SuppressLint("Range") int recordType = cursor.getInt(cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_RECORD_TYPE));
104
105                     if (index == 0)
106                     {
107                         // first record
108                         startTime = entryTime;
109                         previousLapTime = entryTime;
110                         morePreviousTime = entryTime;
111                     }
112                     else
113                     {
114                         long lapTime = entryTime - previousLapTime;
115                         long overallTime = entryTime - startTime;
116                         long differenceTime = (lapTime) - (previousLapTime - morePreviousTime);
117                         operation.addRecord(new DetailRecord(indexId, dataId, recordType, index, lapTime, overallTime, differenceTime,  editor));
118                         morePreviousTime = previousLapTime;
119                         previousLapTime = entryTime;
120                     }
121                     index++;
122                 }
123                 activity.runOnUiThread(operation::dataSetChangeFinished);
124                 ret = true;
125             }
126             catch (Exception e)
127             {
128                 e.printStackTrace();
129             }
130             callback.databaseSetupFinished(ret);
131         });
132         thread.start();
133     }
134
135     /**
136      *
137      *
138      */
139     void setEditIndexData(@NonNull final String title, final int icon)
140     {
141         final EditIndexData data = new EditIndexData(title, icon);
142         Thread thread = new Thread(() -> {
143             database.updateIndexData(indexId, data.getTitle(), data.getIcon());
144             callback.updatedIndexData(false);
145         });
146         thread.start();
147     }
148
149     /**
150      *
151      *
152      */
153     @SuppressLint("Range")
154     EditIndexData getEditIndexData()
155     {
156         String title = "";
157         int iconId = R.drawable.ic_android_black_24dp;
158         try
159         {
160             Cursor cursor = database.getIndexdata(indexId);
161             while (cursor.moveToNext())
162             {
163                 title = cursor.getString(cursor.getColumnIndex(TimeEntryIndex.EntryIndex.COLUMN_NAME_TITLE));
164                 iconId = cursor.getInt(cursor.getColumnIndex(TimeEntryIndex.EntryIndex.COLUMN_NAME_ICON_ID));
165             }
166             return (new EditIndexData(title, iconId));
167         }
168         catch (Exception e)
169         {
170             e.printStackTrace();
171         }
172         return (null);
173     }
174
175     /**
176      *
177      *
178      */
179     void setReferenceData()
180     {
181         Thread thread = new Thread(() -> {
182             database.setReferenceIndexData(indexId);
183             callback.updatedIndexData(true);
184         });
185         thread.start();
186     }
187
188     /**
189      *
190      *
191      */
192     @Override
193     public void dataEntryFinished(OperationType operationType, boolean result, long id, String title)
194     {
195          //
196     }
197
198     /**
199      *
200      *
201      */
202     @Override
203     public void timeEntryFinished(OperationType operationType, boolean result, long indexId, long dataId)
204     {
205         //
206     }
207
208     @Override
209     public void modelDataEntryFinished(OperationType operationType, boolean result, long indexId, String title)
210     {
211         //
212         Log.v(TAG, "modelDataEntryFinished : " + result + " " + title + " " + indexId);
213     }
214
215     /**
216      *
217      */
218     void closeDatabase()
219     {
220         try
221         {
222             database.close();
223         }
224         catch (Exception e)
225         {
226             e.printStackTrace();
227         }
228     }
229
230     /**
231      *    IDetailEditor.editDetailData()
232      */
233     @Override
234     public void editDetailData(final long indexId, final long dataId, final int count, final long defaultMillis)
235     {
236         activity.runOnUiThread(() -> {
237             CreateModelDataDialog dialog2 = CreateModelDataDialog.newInstance(false, activity.getString(R.string.information_modify_time), count, new CreateModelData(database, editCallback, null, indexId, dataId), defaultMillis);
238             dialog2.showNow(activity.getSupportFragmentManager(), "dialog2");
239         });
240     }
241
242     /**
243      *
244      */
245     public void updateDatabaseRecord(@NonNull RecordDetailAdapter adapter)
246     {
247         try
248         {
249             int count = adapter.getItemCount();
250             if (count > 1)
251             {
252                 for (int index = 0; index < count; index++)
253                 {
254                     DetailRecord record = adapter.getRecord(index);
255                     long id = record.getDataId();
256                     long time = record.getTotalTime();
257                     database.updateTimeEntryData(id, time);
258                 }
259             }
260         }
261         catch (Exception e)
262         {
263             e.printStackTrace();
264         }
265     }
266
267     /**
268      *   現在のデータを共有する
269      *
270      */
271     public void shareTheData(final RecordDetailAdapter adapter)
272     {
273         Log.v(TAG, "shareTheData()");
274         if ((adapter == null) || (adapter.getItemCount() <= 0) || (activity == null))
275         {
276             // データがない場合は、何もしない
277             return;
278         }
279         shareDetailIntent(adapter);
280     }
281
282
283     /**
284      *
285      *
286      */
287     @SuppressLint("Range")
288     private void shareDetailIntent(RecordDetailAdapter adapter)
289     {
290         String title = "";
291         int dataCount = adapter.getItemCount();
292         StringBuilder dataToExport = new StringBuilder();
293         dataToExport.append("; ");
294         dataToExport.append(activity.getString(R.string.app_name));
295         dataToExport.append("\r\n");
296         try
297         {
298             Cursor cursor = database.getIndexdata(indexId);
299             while (cursor.moveToNext())
300             {
301                 dataToExport.append("; ");
302                 title = cursor.getString(cursor.getColumnIndex(COLUMN_NAME_TITLE));
303                 dataToExport.append(title);
304                 dataToExport.append(",");
305                 dataToExport.append(TimeStringConvert.getTimeString(cursor.getLong(cursor.getColumnIndex(COLUMN_NAME_TIME_DURATION))));
306                 dataToExport.append(",");
307                 dataToExport.append(cursor.getLong(cursor.getColumnIndex(COLUMN_NAME_START_TIME)));
308                 dataToExport.append(",");
309                 dataToExport.append(cursor.getString(cursor.getColumnIndex(COLUMN_NAME_MEMO)));
310                 dataToExport.append(",");
311                 dataToExport.append("\r\n");
312             }
313         }
314         catch (Exception e)
315         {
316             e.printStackTrace();
317             dataToExport.append("\r\n");
318         }
319         dataToExport.append("; \r\n");
320         dataToExport.append("; LapCount,LapTime,TotalTime,LapTime(ms),TotalTime(ms),;\r\n");
321
322         for (int index = 0; index < dataCount; index++)
323         {
324             try
325             {
326                 DetailRecord record = adapter.getRecord(index);
327                 dataToExport.append(record.getLapCount());
328                 dataToExport.append(",");
329                 dataToExport.append(record.getTitle());
330                 dataToExport.append(",");
331                 dataToExport.append(record.getOverallTime());
332                 dataToExport.append(",");
333                 dataToExport.append(record.getLapTime());
334                 dataToExport.append(",");
335                 dataToExport.append(record.getTotalTime());
336                 dataToExport.append(",");
337                 dataToExport.append(";");
338             }
339             catch (Exception e)
340             {
341                 e.printStackTrace();
342                 dataToExport.append(";;\r\n");
343                 break;
344             }
345             dataToExport.append("\r\n");
346         }
347
348         // Intent発行(ACTION_SEND)
349         try
350         {
351             Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);
352             sendIntent.putExtra(Intent.EXTRA_SUBJECT, title);
353             sendIntent.setType("text/plain");
354             sendIntent.putExtra(Intent.EXTRA_TEXT, dataToExport.toString());
355             activity.startActivity(sendIntent);
356
357             Log.v(TAG, "<<< SEND INTENT >>> : " + title);
358         }
359         catch (Exception e)
360         {
361             e.printStackTrace();
362         }
363     }
364
365     static class EditIndexData
366     {
367         final String title;
368         final int icon;
369
370         EditIndexData(String title, int icon)
371         {
372             this.title = title;
373             this.icon = icon;
374         }
375
376         String getTitle()
377         {
378             return (title);
379         }
380
381         int getIcon()
382         {
383             return (icon);
384         }
385     }
386
387
388     /**
389      *
390      */
391     interface IDatabaseReadyNotify
392     {
393         void databaseSetupFinished(boolean result);
394         void updatedIndexData(boolean isIconOnly);
395     }
396 }