X-Git-Url: http://git.osdn.net/view?p=gokigen%2FJoggingTimer.git;a=blobdiff_plain;f=wear%2Fsrc%2Fmain%2Fjava%2Fnet%2Fosdn%2Fgokigen%2Fjoggingtimer%2Frecorddetail%2FRecordDetailSetup.kt;fp=wear%2Fsrc%2Fmain%2Fjava%2Fnet%2Fosdn%2Fgokigen%2Fjoggingtimer%2Frecorddetail%2FRecordDetailSetup.kt;h=0b48a50869c24669d188449e60f6df13ffb2e778;hp=0000000000000000000000000000000000000000;hb=305cfdf70c6724534acf355d6d9ae48fa76d526d;hpb=43654d46993a33a820e1b38dcbf225ac2e964e93 diff --git a/wear/src/main/java/net/osdn/gokigen/joggingtimer/recorddetail/RecordDetailSetup.kt b/wear/src/main/java/net/osdn/gokigen/joggingtimer/recorddetail/RecordDetailSetup.kt new file mode 100644 index 0000000..0b48a50 --- /dev/null +++ b/wear/src/main/java/net/osdn/gokigen/joggingtimer/recorddetail/RecordDetailSetup.kt @@ -0,0 +1,349 @@ +package net.osdn.gokigen.joggingtimer.recorddetail + +import android.annotation.SuppressLint +import android.content.Intent +import android.provider.BaseColumns +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import net.osdn.gokigen.joggingtimer.R +import net.osdn.gokigen.joggingtimer.storage.ITimeEntryDatabase +import net.osdn.gokigen.joggingtimer.storage.ITimeEntryDatabaseCallback +import net.osdn.gokigen.joggingtimer.storage.ITimeEntryDatabaseCallback.OperationType +import net.osdn.gokigen.joggingtimer.storage.TimeEntryDatabaseFactory +import net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryData +import net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryIndex.EntryIndex +import net.osdn.gokigen.joggingtimer.utilities.CreateModelData +import net.osdn.gokigen.joggingtimer.utilities.CreateModelData.IEditedModelDataCallback +import net.osdn.gokigen.joggingtimer.utilities.CreateModelDataDialog +import net.osdn.gokigen.joggingtimer.utilities.TimeStringConvert + + +class RecordDetailSetup internal constructor( + private val activity: AppCompatActivity, + private val indexId: Long, + private val callback: IDatabaseReadyNotify, + private val operation: IRecordOperation?, + private val editCallback: IEditedModelDataCallback +) : ITimeEntryDatabaseCallback, IDetailEditor +{ + private var database: ITimeEntryDatabase? = null + fun setup() + { + Log.v(TAG, "setup()") + database = TimeEntryDatabaseFactory(activity, this).entryDatabase + val thread = Thread { + try + { + database?.prepare() + } + catch (e: Exception) + { + e.printStackTrace() + } + } + thread.start() + } + + override fun prepareFinished(isReady: Boolean) + { + if (!isReady) + { + callback.databaseSetupFinished(false) + return + } + val editor: IDetailEditor = this + val thread = Thread { + var ret = false + try + { + operation?.clearRecord() + val cursor = database?.getAllDetailData(indexId) + var index = 0 + var startTime: Long = 0 + var previousLapTime: Long = 0 + var morePreviousTime: Long = 0 + while (cursor?.moveToNext() == true) + { + val dataIdIndex = cursor.getColumnIndex(BaseColumns._ID) + val dataId = cursor.getLong(dataIdIndex) + + val indexIdIndex = cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_INDEX_ID) + val indexId = cursor.getLong(indexIdIndex) + + val entryTimeIndex = cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY) + val entryTime = cursor.getLong(entryTimeIndex) + + val recordTypeIndex = cursor.getColumnIndex(TimeEntryData.EntryData.COLUMN_NAME_RECORD_TYPE) + val recordType = cursor.getInt(recordTypeIndex) + if (index == 0) + { + // first record + startTime = entryTime + previousLapTime = entryTime + morePreviousTime = entryTime + } + else + { + val lapTime = entryTime - previousLapTime + val overallTime = entryTime - startTime + val differenceTime = + lapTime - (previousLapTime - morePreviousTime) + operation?.addRecord( + DetailRecord( + indexId, + dataId, + recordType, + index, + lapTime, + overallTime, + differenceTime, + editor + ) + ) + morePreviousTime = previousLapTime + previousLapTime = entryTime + } + index++ + } + activity.runOnUiThread { operation?.dataSetChangeFinished() } + ret = true + } + catch (e: Exception) + { + e.printStackTrace() + } + callback.databaseSetupFinished(ret) + } + thread.start() + } + + fun setEditIndexData(title: String, icon: Int) + { + val data = EditIndexData(title, icon) + val thread = Thread { + database?.updateIndexData(indexId, data.title(), data.icon()) + callback.updatedIndexData(false) + } + thread.start() + } + + fun getEditIndexData(): EditIndexData? + { + var title = "" + var iconId: Int = R.drawable.ic_android_black_24dp + try + { + val cursor = database?.getIndexdata(indexId) + while (cursor?.moveToNext() == true) + { + val titleIndex = cursor.getColumnIndex(EntryIndex.COLUMN_NAME_TITLE) + title = cursor.getString(titleIndex) + + val iconIdIndex = cursor.getColumnIndex(EntryIndex.COLUMN_NAME_ICON_ID) + iconId = cursor.getInt(iconIdIndex) + } + return EditIndexData(title, iconId) + } + catch (e: java.lang.Exception) + { + e.printStackTrace() + } + return (null) + } + + fun setReferenceData(id: Int) + { + val thread = Thread { + database?.setReferenceIndexData(id, indexId) + callback.updatedIndexData(true) + } + thread.start() + } + + override fun dataEntryFinished(operationType: OperationType, result: Boolean, id: Long, title: String) { } + override fun timeEntryFinished(operationType: OperationType, result: Boolean, indexId: Long, dataId: Long) { } + override fun modelDataEntryFinished(operationType: OperationType, result: Boolean, indexId: Long, title: String) + { + Log.v(TAG, "modelDataEntryFinished : $result $title $indexId") + } + + fun closeDatabase() + { + try + { + database?.close() + } + catch (e: Exception) + { + e.printStackTrace() + } + } + + /** + * IDetailEditor.editDetailData() + */ + override fun editDetailData(indexId: Long, dataId: Long, count: Int, defaultMillis: Long) + { + activity.runOnUiThread { + val dialog2 = CreateModelDataDialog.newInstance( + false, + activity.getString(R.string.information_modify_time), + count, + CreateModelData( + database, + editCallback, null, indexId, dataId + ), + defaultMillis + ) + dialog2.showNow(activity.supportFragmentManager, "dialog2") + } + } + + fun updateDatabaseRecord(adapter: RecordDetailAdapter) + { + try + { + val count = adapter.itemCount + if (count > 1) + { + for (index in 0 until count) + { + val record = adapter.getRecord(index) + val id = record.dataId + val time = record.totalTime + database!!.updateTimeEntryData(id, time) + } + } + } + catch (e: Exception) + { + e.printStackTrace() + } + } + + /** + * 現在のデータを共有する + * + */ + fun shareTheData(adapter: RecordDetailAdapter?) + { + Log.v(TAG, "shareTheData()") + if (adapter == null || adapter.itemCount <= 0 ) + { + // データがない場合は、何もしない + Log.v(TAG, "DATA IS NONE, NOT EXPORTED") + return + } + shareDetailIntent(adapter) + } + + @SuppressLint("Range") + private fun shareDetailIntent(adapter: RecordDetailAdapter) + { + var title = "" + val dataCount = adapter.itemCount + val dataToExport = StringBuilder() + dataToExport.append("; ") + dataToExport.append(activity.getString(R.string.app_name)) + dataToExport.append("\r\n") + try + { + val cursor = database?.getIndexdata(indexId) + while (cursor?.moveToNext() == true) { + dataToExport.append("; ") + title = cursor.getString(cursor.getColumnIndex(EntryIndex.COLUMN_NAME_TITLE)) + dataToExport.append(title) + dataToExport.append(",") + dataToExport.append( + TimeStringConvert.getTimeString( + cursor.getLong( + cursor.getColumnIndex( + EntryIndex.COLUMN_NAME_TIME_DURATION + ) + ) + ) + ) + dataToExport.append(",") + dataToExport.append(cursor.getLong(cursor.getColumnIndex(EntryIndex.COLUMN_NAME_START_TIME))) + dataToExport.append(",") + dataToExport.append(cursor.getString(cursor.getColumnIndex(EntryIndex.COLUMN_NAME_MEMO))) + dataToExport.append(",") + dataToExport.append("\r\n") + } + } + catch (e: Exception) + { + e.printStackTrace() + dataToExport.append("\r\n") + } + dataToExport.append("; \r\n") + dataToExport.append("; LapCount,LapTime,TotalTime,LapTime(ms),TotalTime(ms),;\r\n") + for (index in 0 until dataCount) + { + try + { + val record = adapter.getRecord(index) + dataToExport.append(record.lapCount) + dataToExport.append(",") + dataToExport.append(record.title) + dataToExport.append(",") + dataToExport.append(record.overallTime) + dataToExport.append(",") + dataToExport.append(record.lapTime) + dataToExport.append(",") + dataToExport.append(record.totalTime) + dataToExport.append(",") + dataToExport.append(";") + } + catch (e: Exception) + { + e.printStackTrace() + dataToExport.append(";;\r\n") + break + } + dataToExport.append("\r\n") + } + + // Intent発行(ACTION_SEND) + try + { + val sendIntent = Intent().apply { + action = Intent.ACTION_SEND // NoteIntents.ACTION_CREATE_NOTE + type = "text/plain" + putExtra(Intent.EXTRA_SUBJECT, title) + putExtra(Intent.EXTRA_TEXT, dataToExport.toString()) + } + //val shareIntent = Intent.createChooser(sendIntent, null) + //activity.startActivity(shareIntent) + activity.startActivity(sendIntent) + Log.v(TAG, "<<< SEND INTENT >>> : $title") + } + catch (e: Exception) + { + e.printStackTrace() + } + } + + class EditIndexData(val title: String, val icon: Int) + { + fun title(): String + { + return (title) + } + + fun icon(): Int + { + return (icon) + } + } + + internal interface IDatabaseReadyNotify + { + fun databaseSetupFinished(result: Boolean) + fun updatedIndexData(isIconOnly: Boolean) + } + + companion object { + private val TAG = RecordDetailSetup::class.java.simpleName + } +}