OSDN Git Service

ロータリー入力に対応。
[gokigen/JoggingTimer.git] / wear / src / main / java / net / osdn / gokigen / joggingtimer / recordlist / ListActivity.kt
diff --git a/wear/src/main/java/net/osdn/gokigen/joggingtimer/recordlist/ListActivity.kt b/wear/src/main/java/net/osdn/gokigen/joggingtimer/recordlist/ListActivity.kt
new file mode 100644 (file)
index 0000000..25da2ee
--- /dev/null
@@ -0,0 +1,328 @@
+package net.osdn.gokigen.joggingtimer.recordlist
+
+import android.content.Intent
+import android.os.Bundle
+import android.util.Log
+import android.view.MotionEvent
+import android.view.ViewConfiguration
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.InputDeviceCompat
+import androidx.core.view.MotionEventCompat
+import androidx.core.view.ViewConfigurationCompat
+import androidx.recyclerview.widget.DividerItemDecoration
+import androidx.wear.ambient.AmbientModeSupport
+import androidx.wear.widget.WearableLinearLayoutManager
+import androidx.wear.widget.WearableRecyclerView
+import androidx.wear.widget.drawer.WearableNavigationDrawerView
+import net.osdn.gokigen.joggingtimer.R
+import net.osdn.gokigen.joggingtimer.recorddetail.DetailActivity
+import net.osdn.gokigen.joggingtimer.storage.ITimeEntryDatabase
+import net.osdn.gokigen.joggingtimer.utilities.ConfirmationDialog
+import net.osdn.gokigen.joggingtimer.utilities.CreateModelData.ICreatedModelDataCallback
+import net.osdn.gokigen.joggingtimer.utilities.CreateModelDataDialog
+import kotlin.math.roundToInt
+
+/**
+ *
+ *
+ */
+class ListActivity : AppCompatActivity(),
+    IDetailLauncher, RecordSummarySetup.IDatabaseReadyNotify, ICreatedModelDataCallback,
+    ListSelectionMenuAdapter.ISelectedMenu, AmbientModeSupport.AmbientCallbackProvider {
+    private val TAG = toString()
+    private var summaryAdapter: RecordSummaryAdapter? = null
+    private var setupper: RecordSummarySetup? = null
+
+    /**
+     *
+     */
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        Log.v(TAG, "onCreate()")
+        setContentView(R.layout.activity_list)
+
+        // Enables Always-on
+        //setAmbientEnabled();
+        try {
+            val ambientController = AmbientModeSupport.attach(this)
+            ambientController.setAutoResumeEnabled(true)
+            //boolean isAmbient = ambientController.isAmbient();
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        try {
+            val naviView =
+                findViewById<WearableNavigationDrawerView>(R.id.list_top_navigation_drawer)
+            val menuAdapter = ListSelectionMenuAdapter(this, this)
+            naviView.setAdapter(menuAdapter)
+            naviView.addOnItemSelectedListener(menuAdapter)
+            val view = findViewById<WearableRecyclerView>(R.id.recycler_list_view)
+            summaryAdapter = RecordSummaryAdapter()
+            val layoutManager = WearableLinearLayoutManager(this)
+            view.isCircularScrollingGestureEnabled = resources.configuration.isScreenRound
+            //view.setCircularScrollingGestureEnabled(false);
+            val dividerDecoration = DividerItemDecoration(view.context, layoutManager.orientation)
+            view.addItemDecoration(dividerDecoration)
+            view.layoutManager = layoutManager
+            view.adapter = summaryAdapter
+        } catch (e: Exception) {
+            e.printStackTrace()
+            summaryAdapter = null
+        }
+    }
+
+    /**
+     *
+     */
+    override fun onSaveInstanceState(outState: Bundle) {
+        super.onSaveInstanceState(outState)
+    }
+
+    /**
+     *
+     */
+    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
+        super.onRestoreInstanceState(savedInstanceState)
+    }
+
+    /**
+     *
+     */
+    override fun onResume() {
+        super.onResume()
+        Log.v(TAG, "onResume()")
+        try {
+            setupper = RecordSummarySetup(this, this, this, summaryAdapter, this)
+            setupper!!.setup()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    /**
+     *
+     */
+    override fun onPause() {
+        super.onPause()
+        Log.v(TAG, "onPause()")
+        try {
+            if (setupper != null) {
+                setupper!!.closeDatabase()
+                setupper = null
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        System.gc()
+    }
+
+    /**
+     *
+     *
+     */
+    public override fun onStart() {
+        super.onStart()
+        Log.v(TAG, "onStart()")
+    }
+
+    /**
+     *
+     *
+     */
+    public override fun onStop() {
+        super.onStop()
+        Log.v(TAG, "onStop()")
+    }
+    /*
+    @Override
+    public void onEnterAmbient(Bundle ambientDetails)
+    {
+        super.onEnterAmbient(ambientDetails);
+        Log.v(TAG, "onEnterAmbient()");
+    }
+
+    @Override
+    public void onExitAmbient()
+    {
+        super.onExitAmbient();
+        Log.v(TAG, "onExitAmbient()");
+    }
+
+    @Override
+    public void onUpdateAmbient()
+    {
+        super.onUpdateAmbient();
+        Log.v(TAG, "onUpdateAmbient()");
+    }
+*/
+
+    override fun onGenericMotionEvent(ev: MotionEvent?): Boolean
+    {
+        try
+        {
+            if ((ev?.action == MotionEvent.ACTION_SCROLL)&& (ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)))
+            {
+                // ロータリー入力でスクロールする
+                // Log.v(TAG, "Rotary Encoder Input")
+                val view = findViewById<WearableRecyclerView>(R.id.recycler_list_view)
+                val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
+                        ViewConfigurationCompat.getScaledVerticalScrollFactor(ViewConfiguration.get(this), this)
+                view.scrollBy(0, delta.roundToInt())
+                return (true)
+            }
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+        return (super.onGenericMotionEvent(ev))
+    }
+
+    /**
+     *
+     *
+     */
+    override fun launchDetail(recordId: Long) {
+        Log.v(TAG, "launchDetail() id:$recordId")
+        try {
+            val intent = Intent(this, DetailActivity::class.java)
+            intent.putExtra(DetailActivity.INTENT_EXTRA_DATA_ID, recordId)
+            startActivity(intent)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    /**
+     *
+     *
+     */
+    private fun itemSelected(itemId: Int) {
+        //String toastMessage = "";
+        if (itemId == R.id.menu_create_model) {
+            // モデルデータの作成
+            val dialog2 = CreateModelDataDialog.newInstance(
+                true,
+                getString(R.string.information_time_picker),
+                0,
+                setupper!!.getCreateModelDataCallback(
+                    ITimeEntryDatabase.DONT_USE_ID,
+                    ITimeEntryDatabase.DONT_USE_ID
+                ),
+                0
+            )
+            dialog2.show(supportFragmentManager, "dialog2")
+        }
+        /*
+        try
+        {
+            if (toastMessage.length() > 0)
+            {
+                Toast toast = Toast.makeText(getApplicationContext(), toastMessage, Toast.LENGTH_SHORT);
+                toast.show();
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+ */
+    }
+
+    /**
+     *
+     *
+     */
+    override fun deleteRecord(targetRecord: DataRecord) {
+        try {
+            val positionId = targetRecord.positionId
+            val title = targetRecord.title
+            Log.v(TAG, "deleteRecord() : $title")
+            val message = getString(R.string.dialog_message_delete) + " (" + title + ")"
+            val dialog = ConfirmationDialog.newInstance(
+                getString(R.string.dialog_title_delete), message
+            ) {
+                Log.v(
+                    TAG,
+                    "Delete Record Execute [$title] pos:$positionId"
+                )
+                if (summaryAdapter != null) {
+                    val indexId = summaryAdapter!!.removeItem(positionId)
+                    try {
+                        val thread = Thread {
+                            if (indexId >= 0) {
+                                setupper!!.deleteTimeEntryData(indexId)
+                            }
+                        }
+                        thread.start()
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+                }
+            }
+            dialog.show(supportFragmentManager, "dialog")
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    /**
+     *
+     *
+     */
+    override fun databaseSetupFinished(result: Boolean) {
+        Log.v(TAG, "databaseSetupFinished() : $result")
+    }
+
+    /**
+     *
+     *
+     */
+    override fun selectedMenu(itemId: Int) {
+        itemSelected(itemId)
+    }
+
+    /**
+     *
+     *
+     */
+    override fun createdModelData(indexId: Long) {
+        // データの登録
+        setupper!!.setIndexData(indexId)
+
+        // 一覧の更新
+        runOnUiThread {
+            if (summaryAdapter != null) {
+                val count = summaryAdapter!!.itemCount
+                summaryAdapter!!.notifyItemChanged(count - 1)
+                summaryAdapter!!.notifyDataSetChanged()
+            }
+
+            // Toastで作成を通知する
+            val toast = Toast.makeText(
+                applicationContext,
+                getString(R.string.created_model_data),
+                Toast.LENGTH_SHORT
+            )
+            toast.show()
+        }
+    }
+
+    override fun getAmbientCallback(): AmbientModeSupport.AmbientCallback {
+        return object : AmbientModeSupport.AmbientCallback() {
+            override fun onEnterAmbient(ambientDetails: Bundle) {
+                Log.v(TAG, "onEnterAmbient()")
+            }
+
+            fun onExitAmbient(ambientDetails: Bundle?) {
+                Log.v(TAG, "onExitAmbient()")
+                //updateTimerLabel();
+            }
+        }
+    }
+
+    override fun onPointerCaptureChanged(hasCapture: Boolean) {
+        super.onPointerCaptureChanged(hasCapture)
+    }
+}
\ No newline at end of file