1 package net.osdn.gokigen.joggingtimer.recorddetail;
3 import android.annotation.SuppressLint;
4 import android.content.Intent;
5 import android.database.Cursor;
6 import android.util.Log;
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;
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;
24 import androidx.annotation.NonNull;
25 import androidx.appcompat.app.AppCompatActivity;
31 public class RecordDetailSetup implements ITimeEntryDatabaseCallback, IDetailEditor
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;
45 RecordDetailSetup(AppCompatActivity activity, long indexId, IDatabaseReadyNotify callback, IRecordOperation operation, CreateModelData.IEditedModelDataCallback editCallback)
47 this.activity = activity;
48 this.indexId = indexId;
49 this.callback = callback;
50 this.operation = operation;
51 this.editCallback = editCallback;
60 Log.v(TAG, "setup()");
61 database = new TimeEntryDatabaseFactory(activity, this).getEntryDatabase();
62 Thread thread = new Thread(() -> {
80 public void prepareFinished(boolean isReady)
84 callback.databaseSetupFinished(false);
87 final IDetailEditor editor = this;
88 Thread thread = new Thread(() -> {
92 operation.clearRecord();
93 Cursor cursor = database.getAllDetailData(indexId);
96 long previousLapTime = 0;
97 long morePreviousTime = 0;
98 while (cursor.moveToNext())
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));
108 startTime = entryTime;
109 previousLapTime = entryTime;
110 morePreviousTime = entryTime;
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;
123 activity.runOnUiThread(operation::dataSetChangeFinished);
130 callback.databaseSetupFinished(ret);
139 void setEditIndexData(@NonNull final String title, final int icon)
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);
153 @SuppressLint("Range")
154 EditIndexData getEditIndexData()
157 int iconId = R.drawable.ic_android_black_24dp;
160 Cursor cursor = database.getIndexdata(indexId);
161 while (cursor.moveToNext())
163 title = cursor.getString(cursor.getColumnIndex(TimeEntryIndex.EntryIndex.COLUMN_NAME_TITLE));
164 iconId = cursor.getInt(cursor.getColumnIndex(TimeEntryIndex.EntryIndex.COLUMN_NAME_ICON_ID));
166 return (new EditIndexData(title, iconId));
179 void setReferenceData()
181 Thread thread = new Thread(() -> {
182 database.setReferenceIndexData(indexId);
183 callback.updatedIndexData(true);
193 public void dataEntryFinished(OperationType operationType, boolean result, long id, String title)
203 public void timeEntryFinished(OperationType operationType, boolean result, long indexId, long dataId)
209 public void modelDataEntryFinished(OperationType operationType, boolean result, long indexId, String title)
212 Log.v(TAG, "modelDataEntryFinished : " + result + " " + title + " " + indexId);
231 * IDetailEditor.editDetailData()
234 public void editDetailData(final long indexId, final long dataId, final int count, final long defaultMillis)
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");
245 public void updateDatabaseRecord(@NonNull RecordDetailAdapter adapter)
249 int count = adapter.getItemCount();
252 for (int index = 0; index < count; index++)
254 DetailRecord record = adapter.getRecord(index);
255 long id = record.getDataId();
256 long time = record.getTotalTime();
257 database.updateTimeEntryData(id, time);
271 public void shareTheData(final RecordDetailAdapter adapter)
273 Log.v(TAG, "shareTheData()");
274 if ((adapter == null) || (adapter.getItemCount() <= 0) || (activity == null))
279 shareDetailIntent(adapter);
287 @SuppressLint("Range")
288 private void shareDetailIntent(RecordDetailAdapter adapter)
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");
298 Cursor cursor = database.getIndexdata(indexId);
299 while (cursor.moveToNext())
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");
317 dataToExport.append("\r\n");
319 dataToExport.append("; \r\n");
320 dataToExport.append("; LapCount,LapTime,TotalTime,LapTime(ms),TotalTime(ms),;\r\n");
322 for (int index = 0; index < dataCount; index++)
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(";");
342 dataToExport.append(";;\r\n");
345 dataToExport.append("\r\n");
348 // Intent発行(ACTION_SEND)
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);
357 Log.v(TAG, "<<< SEND INTENT >>> : " + title);
365 static class EditIndexData
370 EditIndexData(String title, int icon)
391 interface IDatabaseReadyNotify
393 void databaseSetupFinished(boolean result);
394 void updatedIndexData(boolean isIconOnly);