1 package net.osdn.gokigen.joggingtimer.recorddetail
3 import android.annotation.SuppressLint
4 import android.os.Bundle
5 import android.util.Log
6 import android.view.MenuItem
7 import android.view.MotionEvent
8 import android.view.ViewConfiguration
9 import android.widget.Toast
10 import androidx.appcompat.app.AppCompatActivity
11 import androidx.core.view.InputDeviceCompat
12 import androidx.core.view.MotionEventCompat
13 import androidx.core.view.ViewConfigurationCompat
14 import androidx.recyclerview.widget.DividerItemDecoration
15 import androidx.wear.ambient.AmbientModeSupport
16 import androidx.wear.widget.WearableLinearLayoutManager
17 import androidx.wear.widget.WearableRecyclerView
18 import androidx.wear.widget.drawer.WearableActionDrawerView
19 import androidx.wear.widget.drawer.WearableNavigationDrawerView
20 import net.osdn.gokigen.joggingtimer.R
21 import net.osdn.gokigen.joggingtimer.utilities.CreateModelData.IEditedModelDataCallback
22 import net.osdn.gokigen.joggingtimer.utilities.DataEditDialog
23 import net.osdn.gokigen.joggingtimer.utilities.SetReferenceDialog
24 import net.osdn.gokigen.joggingtimer.utilities.SetReferenceDialog.SetReferenceCallback
25 import kotlin.math.roundToInt
27 class DetailActivity : AppCompatActivity(),
28 RecordDetailSetup.IDatabaseReadyNotify, MenuItem.OnMenuItemClickListener,
29 DataEditDialog.Callback, IEditedModelDataCallback, DetailSelectionMenuAdapter.ISelectedMenu,
30 AmbientModeSupport.AmbientCallbackProvider, SetReferenceCallback
32 private var detailAdapter: RecordDetailAdapter? = null
33 private var setupper: RecordDetailSetup? = null
34 private var actionDrawerView: WearableActionDrawerView? = null
36 override fun onCreate(savedInstanceState: Bundle?)
38 super.onCreate(savedInstanceState)
39 Log.v(TAG, "onCreate()")
40 setContentView(R.layout.activity_detail)
44 val ambientController = AmbientModeSupport.attach(this)
45 ambientController.setAutoResumeEnabled(true)
54 val naviView = findViewById<WearableNavigationDrawerView>(R.id.top_navigation_drawer)
55 val menuAdapter = DetailSelectionMenuAdapter(this, this)
56 naviView.setAdapter(menuAdapter)
57 naviView.addOnItemSelectedListener(menuAdapter)
58 val view = findViewById<WearableRecyclerView>(R.id.recycler_detail_view)
59 detailAdapter = RecordDetailAdapter()
60 val layoutManager = WearableLinearLayoutManager(this)
62 view.isCircularScrollingGestureEnabled = false
63 val dividerDecoration = DividerItemDecoration(view.context, layoutManager.orientation)
64 view.addItemDecoration(dividerDecoration)
65 view.layoutManager = layoutManager
66 view.adapter = detailAdapter
76 // Bottom Action Drawer
77 actionDrawerView = findViewById(R.id.bottom_action_drawer)
78 actionDrawerView?.controller?.peekDrawer()
79 actionDrawerView?.setOnMenuItemClickListener(this)
87 override fun onResume()
90 Log.v(TAG, "onResume() ")
93 override fun onPause()
96 Log.v(TAG, "onPause()")
99 public override fun onStart()
104 val indexId = intent.getLongExtra(INTENT_EXTRA_DATA_ID, -1)
105 Log.v(TAG, "onResume() $indexId")
106 setupper = RecordDetailSetup(this, indexId, this, detailAdapter, this)
115 public override fun onStop()
118 Log.v(TAG, "onStop()")
121 setupper?.closeDatabase()
131 override fun onGenericMotionEvent(ev: MotionEvent?): Boolean
135 if ((ev?.action == MotionEvent.ACTION_SCROLL)&& (ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)))
138 // Log.v(TAG, "Rotary Encoder Input")
139 val view = findViewById<WearableRecyclerView>(R.id.recycler_detail_view)
140 val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
141 ViewConfigurationCompat.getScaledVerticalScrollFactor(ViewConfiguration.get(this), this)
142 view.scrollBy(0, delta.roundToInt())
150 return (super.onGenericMotionEvent(ev))
153 override fun databaseSetupFinished(result: Boolean)
155 Log.v(TAG, "databaseSetupFinished() : $result")
158 override fun updatedIndexData(isIconOnly: Boolean)
160 Log.v(TAG, "selectedReferenceData() : $isIconOnly")
164 val title: String = if (isIconOnly) {
165 getString(R.string.action_set_reference)
167 getString(R.string.action_edited_data)
170 Toast.makeText(applicationContext, title, Toast.LENGTH_SHORT)
180 override fun onMenuItemClick(item: MenuItem): Boolean
182 Log.v(TAG, "onMenuItemClick(): $item")
183 val itemId = item.itemId
186 actionDrawerView?.controller?.closeDrawer()
192 return (itemSelected(itemId))
195 private fun itemSelected(itemId: Int): Boolean
199 R.id.menu_edit_title -> {
202 var iconId = R.drawable.ic_android_black_24dp
203 val data = setupper?.getEditIndexData()
209 val dialog = DataEditDialog.newInstance(iconId, title, this)
210 val manager = supportFragmentManager
211 dialog.show(manager, "dialog")
212 true.also { ret = it }
214 R.id.menu_set_reference -> {
216 val callback: SetReferenceCallback = this
220 val dialog = SetReferenceDialog.newInstance(callback)
221 val manager = supportFragmentManager
222 dialog.show(manager, "dialog")
223 } catch (e: Exception) {
227 true.also { ret = it }
229 R.id.menu_share_data -> {
231 setupper?.shareTheData(detailAdapter)
232 true.also { ret = it }
238 override fun dataEdited(iconId: Int, title: String)
240 Log.v(TAG, "iconId : $iconId title : '$title'")
243 setupper?.setEditIndexData(title, iconId)
244 val view = findViewById<WearableRecyclerView>(R.id.recycler_detail_view)
245 view.postInvalidate()
253 private fun updateScreen()
257 val view = findViewById<WearableRecyclerView>(R.id.recycler_detail_view)
258 view.postInvalidate()
266 override fun cancelled()
271 @SuppressLint("NotifyDataSetChanged")
272 override fun editedModelData(
282 "editedModelData() $indexId $detailId $lapCount ($prevTime -> $newTime)"
284 if (detailAdapter == null)
288 val diffTime = newTime - prevTime
289 val count = detailAdapter?.itemCount ?: 0
292 var totalTime: Long = 0
293 val modTime = diffTime * -1 / (count - 1)
294 for (index in 1..count)
296 val record = detailAdapter?.getRecord(index - 1)
297 totalTime = if (lapCount == index) {
298 record?.addModifiedTime(diffTime, totalTime) ?: 0
300 record?.addModifiedTime(modTime, totalTime) ?: 0
302 detailAdapter?.notifyItemChanged(index - 1)
306 val thread = Thread {
307 if (setupper != null)
309 setupper?.updateDatabaseRecord(detailAdapter!!)
321 detailAdapter?.notifyDataSetChanged()
329 override fun selectedMenu(itemId: Int)
334 override fun getAmbientCallback(): AmbientModeSupport.AmbientCallback
336 return object : AmbientModeSupport.AmbientCallback() {
337 override fun onEnterAmbient(ambientDetails: Bundle)
339 Log.v(TAG, "onEnterAmbient()")
344 override fun confirmed(id: Int)
347 Log.v(TAG, " SET REFERENCE DATA ID: $id")
348 setupper?.setReferenceData(id)
352 private val TAG = DetailActivity::class.java.simpleName
353 const val INTENT_EXTRA_DATA_ID = "Detail.dataId"