OSDN Git Service

データ送信時のintentの変更(強化)検討中。
[gokigen/JoggingTimer.git] / wear / src / main / java / net / osdn / gokigen / joggingtimer / recorddetail / RecordDetailSetup.kt
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 (file)
index 0000000..0b48a50
--- /dev/null
@@ -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
+    }
+}