diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index b948dda7..6e9ca6c9 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -97,7 +97,10 @@ dependencies {
implementation(project(":feature_data_edit"))
implementation(project(":feature_records_filter"))
implementation(project(":feature_goals"))
+ implementation(project(":wearrpc"))
+ implementation("com.google.android.gms:play-services-wearable:18.0.0")
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1")
implementation(Deps.Androidx.room)
implementation(Deps.Ktx.navigationFragment)
implementation(Deps.Ktx.navigationUi)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1d64b6a0..a91a129a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,6 +45,15 @@
android:value="true" />
+
+
+
+
+
+
diff --git a/app/src/main/java/com/example/util/simpletimetracker/wear/DomainAPI.kt b/app/src/main/java/com/example/util/simpletimetracker/wear/DomainAPI.kt
new file mode 100644
index 00000000..b0f12f3d
--- /dev/null
+++ b/app/src/main/java/com/example/util/simpletimetracker/wear/DomainAPI.kt
@@ -0,0 +1,43 @@
+package com.example.util.simpletimetracker.wear
+
+import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor
+import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor
+import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor
+import com.example.util.simpletimetracker.domain.mapper.AppColorMapper
+import com.example.util.simpletimetracker.wearrpc.Activity
+import com.example.util.simpletimetracker.wearrpc.CurrentActivity
+import com.example.util.simpletimetracker.wearrpc.Settings
+import com.example.util.simpletimetracker.wearrpc.SimpleTimeTrackerAPI
+import com.example.util.simpletimetracker.wearrpc.Tag
+
+class DomainAPI (
+ private val prefsInteractor: PrefsInteractor,
+ private val recordTypeInteractor: RecordTypeInteractor,
+ private val runningRecordInteractor: RunningRecordInteractor,
+ private val appColorMapper: AppColorMapper,
+): SimpleTimeTrackerAPI {
+
+ override suspend fun queryActivities(): Array {
+ return recordTypeInteractor.getAll()
+ .filter { recordType -> !recordType.hidden }
+ .map { recordType -> Activity(recordType.id, recordType.name) }
+ .toTypedArray()
+ }
+
+ override suspend fun queryCurrentActivities(): Array {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun setCurrentActivities(activities: Array) {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun queryTagsForActivity(activityId: Long): Array {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun querySettings(): Settings {
+ TODO("Not yet implemented")
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/util/simpletimetracker/wear/WearService.kt b/app/src/main/java/com/example/util/simpletimetracker/wear/WearService.kt
new file mode 100644
index 00000000..6ffc92e5
--- /dev/null
+++ b/app/src/main/java/com/example/util/simpletimetracker/wear/WearService.kt
@@ -0,0 +1,52 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ */
+package com.example.util.simpletimetracker.wear
+
+import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor
+import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor
+import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor
+import com.example.util.simpletimetracker.domain.mapper.AppColorMapper
+import com.example.util.simpletimetracker.wearrpc.WearRPCServer
+import com.google.android.gms.tasks.Task
+import com.google.android.gms.tasks.Tasks
+import com.google.android.gms.wearable.WearableListenerService
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.runBlocking
+import javax.inject.Inject
+
+/**
+ * Landing point for messages coming to Mobile from Wear.
+ *
+ * Implemented as a Service so that it can receive messages even when the Mobile app is stopped or
+ * in the background.
+ */
+@AndroidEntryPoint
+class WearService : WearableListenerService() {
+
+ @Inject
+ lateinit var prefsInteractor: PrefsInteractor
+
+ @Inject
+ lateinit var recordTypeInteractor: RecordTypeInteractor
+
+ @Inject
+ lateinit var runningRecordInteractor: RunningRecordInteractor
+
+ @Inject
+ lateinit var appColorMapper: AppColorMapper
+
+ override fun onRequest(nodeId: String, path: String, request: ByteArray): Task? {
+ val rpc = WearRPCServer(
+ DomainAPI(
+ prefsInteractor,
+ recordTypeInteractor,
+ runningRecordInteractor,
+ appColorMapper,
+ ),
+ )
+ return runBlocking { Tasks.forResult(rpc.onRequest(path, request)) }
+ }
+}
diff --git a/app/src/main/res/values/wear.xml b/app/src/main/res/values/wear.xml
new file mode 100644
index 00000000..19fe4bcd
--- /dev/null
+++ b/app/src/main/res/values/wear.xml
@@ -0,0 +1,12 @@
+
+
+
+ - /stt//GET/ping
+ - /stt//GET/activities
+ - /stt//GET/activities/current
+ - /stt//POST/activities/current
+ - /stt//GET/activites/:ID/tags
+ - /stt//GET/settings
+
+
\ No newline at end of file