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