diff --git a/apps/giga-wear/client/.gitignore b/apps/giga-wear/client/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/apps/giga-wear/client/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/apps/giga-wear/client/build.gradle.kts b/apps/giga-wear/client/build.gradle.kts
new file mode 100644
index 0000000..77705e6
--- /dev/null
+++ b/apps/giga-wear/client/build.gradle.kts
@@ -0,0 +1,47 @@
+import ru.shadowsparky.generateVersionCode
+
+plugins {
+ alias(libs.plugins.convention.android.app)
+ alias(libs.plugins.convention.compose)
+ alias(libs.plugins.convention.koin)
+ alias(libs.plugins.convention.ktor.client)
+}
+
+val appVersion = "1.27.1"
+
+android {
+ buildFeatures { buildConfig = true }
+ namespace = "ru.shadowsparky.gigawear"
+ defaultConfig {
+ applicationId = namespace
+ minSdk = libs.versions.proj.min.get().toInt()
+ targetSdk = libs.versions.proj.target.get().toInt()
+ versionCode = generateVersionCode(appVersion)
+ versionName = appVersion
+ }
+ useLibrary("wear-sdk")
+}
+
+dependencies {
+ implementation(platform(libs.androidx.compose.bom))
+ implementation(libs.activity.compose)
+ implementation(libs.androidx.compose.foundation)
+ implementation(libs.androidx.compose.material3)
+ implementation(libs.androidx.compose.ui.graphics)
+ implementation(libs.androidx.compose.ui.tooling)
+ implementation(libs.androidx.compose.ui.tooling.preview)
+ implementation(libs.androidx.core.splashscreen)
+ implementation(libs.androidx.protolayout)
+ implementation(libs.androidx.protolayout.material3)
+ implementation(libs.androidx.tiles)
+ implementation(libs.androidx.tiles.tooling.preview)
+ implementation(libs.androidx.watchface.complications.data.source.ktx)
+ implementation(libs.androidx.wear.tooling.preview)
+ implementation(libs.guava)
+ implementation(libs.play.services.wearable)
+ implementation(libs.ui.compose)
+ debugImplementation(libs.androidx.compose.ui.test.manifest)
+ debugImplementation(libs.androidx.tiles.renderer)
+ debugImplementation(libs.androidx.tiles.tooling)
+ debugImplementation(libs.ui.tooling)
+}
diff --git a/apps/giga-wear/client/src/main/AndroidManifest.xml b/apps/giga-wear/client/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..0943432
--- /dev/null
+++ b/apps/giga-wear/client/src/main/AndroidManifest.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/complication/MainComplicationService.kt b/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/complication/MainComplicationService.kt
new file mode 100644
index 0000000..39ebf81
--- /dev/null
+++ b/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/complication/MainComplicationService.kt
@@ -0,0 +1,41 @@
+package ru.shadowsparky.gigawear.complication
+
+import androidx.wear.watchface.complications.data.ComplicationData
+import androidx.wear.watchface.complications.data.ComplicationType
+import androidx.wear.watchface.complications.data.PlainComplicationText
+import androidx.wear.watchface.complications.data.ShortTextComplicationData
+import androidx.wear.watchface.complications.datasource.ComplicationRequest
+import androidx.wear.watchface.complications.datasource.SuspendingComplicationDataSourceService
+import java.util.Calendar
+
+/**
+ * Skeleton for complication data source that returns short text.
+ */
+class MainComplicationService : SuspendingComplicationDataSourceService() {
+
+ override fun getPreviewData(type: ComplicationType): ComplicationData? {
+ if (type != ComplicationType.SHORT_TEXT) {
+ return null
+ }
+ return createComplicationData("Mon", "Monday")
+ }
+
+ override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationData {
+ return when (Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) {
+ Calendar.SUNDAY -> createComplicationData("Sun", "Sunday")
+ Calendar.MONDAY -> createComplicationData("Mon", "Monday")
+ Calendar.TUESDAY -> createComplicationData("Tue", "Tuesday")
+ Calendar.WEDNESDAY -> createComplicationData("Wed", "Wednesday")
+ Calendar.THURSDAY -> createComplicationData("Thu", "Thursday")
+ Calendar.FRIDAY -> createComplicationData("Fri", "Friday")
+ Calendar.SATURDAY -> createComplicationData("Sat", "Saturday")
+ else -> throw IllegalArgumentException("too many days")
+ }
+ }
+
+ private fun createComplicationData(text: String, contentDescription: String) =
+ ShortTextComplicationData.Builder(
+ text = PlainComplicationText.Builder(text).build(),
+ contentDescription = PlainComplicationText.Builder(contentDescription).build()
+ ).build()
+}
\ No newline at end of file
diff --git a/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/presentation/MainActivity.kt b/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/presentation/MainActivity.kt
new file mode 100644
index 0000000..07f949c
--- /dev/null
+++ b/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/presentation/MainActivity.kt
@@ -0,0 +1,136 @@
+/* While this template provides a good starting point for using Wear Compose, you can always
+ * take a look at https://github.com/android/wear-os-samples/tree/main/ComposeStarter to find the
+ * most up to date changes to the libraries and their usages.
+ */
+
+package ru.shadowsparky.gigawear.presentation
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.speech.RecognizerIntent
+import android.speech.tts.TextToSpeech
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.rememberLauncherForActivityResult
+import androidx.activity.compose.setContent
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.wear.compose.foundation.lazy.TransformingLazyColumn
+import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState
+import androidx.wear.compose.material3.AppScaffold
+import androidx.wear.compose.material3.Button
+import androidx.wear.compose.material3.ButtonDefaults
+import androidx.wear.compose.material3.EdgeButton
+import androidx.wear.compose.material3.ListHeader
+import androidx.wear.compose.material3.MaterialTheme
+import androidx.wear.compose.material3.ScreenScaffold
+import androidx.wear.compose.material3.SurfaceTransformation
+import androidx.wear.compose.material3.Text
+import androidx.wear.compose.material3.lazy.rememberTransformationSpec
+import androidx.wear.compose.material3.lazy.transformedHeight
+import ru.shadowsparky.gigawear.R
+import ru.shadowsparky.gigawear.presentation.theme.AndroidDevTheme
+import java.util.Locale
+
+class MainActivity : ComponentActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContent {
+ WearApp("Android")
+ }
+ }
+}
+
+@Composable
+fun WearApp(greetingName: String) {
+ val context = LocalContext.current
+ var spokenText by remember { mutableStateOf("Тут будет твой текст") }
+ val tts = remember { mutableStateOf(null) }
+ DisposableEffect(Unit) {
+ tts.value = TextToSpeech(context) { status ->
+ if (status == TextToSpeech.SUCCESS) {
+ tts.value?.language = Locale.getDefault()
+ }
+ }
+ onDispose {
+ tts.value?.stop()
+ tts.value?.shutdown()
+ }
+ }
+ val voiceLauncher = rememberLauncherForActivityResult(
+ contract = ActivityResultContracts.StartActivityForResult()
+ ) { result ->
+ if (result.resultCode == Activity.RESULT_OK) {
+ val results = result.data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)
+ val text = results?.firstOrNull()
+ if (!text.isNullOrBlank()) {
+ spokenText = text
+ tts.value?.speak(text, TextToSpeech.QUEUE_FLUSH, null, null)
+ }
+ }
+ }
+ AndroidDevTheme {
+ AppScaffold {
+ val listState = rememberTransformingLazyColumnState()
+ val transformationSpec = rememberTransformationSpec()
+ ScreenScaffold(
+ scrollState = listState,
+ edgeButton = {
+ EdgeButton(
+ onClick = {
+ val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
+ putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
+ putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault().toString())
+ }
+ try {
+ voiceLauncher.launch(intent)
+ } catch (e: Exception) {
+ spokenText = " Ошибка: Голосовой ввод недоступен"
+ }
+ },
+ colors = ButtonDefaults.buttonColors(
+ containerColor = MaterialTheme.colorScheme.primaryContainer,
+ contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
+ ),
+ ) {
+ Text(" Начать ввод")
+ }
+ },
+ ) { contentPadding ->
+ TransformingLazyColumn(contentPadding = contentPadding, state = listState) {
+ item {
+ ListHeader(
+ modifier = Modifier.fillMaxWidth().transformedHeight(this, transformationSpec),
+ transformation = SurfaceTransformation(transformationSpec),
+ ) {
+ Text(text = stringResource(R.string.hello_world, greetingName))
+ }
+ }
+ item {
+ Button(
+ onClick = {
+ tts.value?.speak(spokenText, TextToSpeech.QUEUE_FLUSH, null, null)
+ },
+ modifier = Modifier.fillMaxWidth().transformedHeight(this, transformationSpec),
+ transformation = SurfaceTransformation(transformationSpec),
+ colors = ButtonDefaults.buttonColors(
+ containerColor = MaterialTheme.colorScheme.secondaryContainer
+ )
+ ) {
+ Text(text = spokenText)
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/presentation/theme/Theme.kt b/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/presentation/theme/Theme.kt
new file mode 100644
index 0000000..b5d29d3
--- /dev/null
+++ b/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/presentation/theme/Theme.kt
@@ -0,0 +1,17 @@
+package ru.shadowsparky.gigawear.presentation.theme
+
+import androidx.compose.runtime.Composable
+import androidx.wear.compose.material3.MaterialTheme
+
+@Composable
+fun AndroidDevTheme(
+ content: @Composable () -> Unit
+) {
+ /**
+ * Empty theme to customize for your app.
+ * See: https://developer.android.com/jetpack/compose/designsystems/custom
+ */
+ MaterialTheme(
+ content = content
+ )
+}
\ No newline at end of file
diff --git a/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/tile/MainTileService.kt b/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/tile/MainTileService.kt
new file mode 100644
index 0000000..056eae4
--- /dev/null
+++ b/apps/giga-wear/client/src/main/java/ru/shadowsparky/gigawear/tile/MainTileService.kt
@@ -0,0 +1,65 @@
+package ru.shadowsparky.gigawear.tile
+
+import android.content.Context
+import androidx.wear.protolayout.ResourceBuilders.Resources
+import androidx.wear.protolayout.TimelineBuilders
+import androidx.wear.protolayout.material3.Typography.BODY_LARGE
+import androidx.wear.tiles.RequestBuilders
+import androidx.wear.tiles.TileBuilders
+import androidx.wear.tiles.TileService
+import com.google.common.util.concurrent.Futures
+import androidx.wear.protolayout.material3.materialScope
+import androidx.wear.protolayout.material3.primaryLayout
+import androidx.wear.protolayout.material3.text
+import androidx.wear.protolayout.types.layoutString
+import androidx.wear.tiles.RequestBuilders.ResourcesRequest
+import androidx.wear.tiles.tooling.preview.Preview
+import androidx.wear.tiles.tooling.preview.TilePreviewData
+import androidx.wear.tooling.preview.devices.WearDevices
+import ru.shadowsparky.gigawear.R
+import com.google.common.util.concurrent.ListenableFuture
+
+private const val RESOURCES_VERSION = "0"
+
+class MainTileService : TileService() {
+ override fun onTileRequest(requestParams: RequestBuilders.TileRequest): ListenableFuture =
+ Futures.immediateFuture(tile(requestParams, this))
+
+ override fun onTileResourcesRequest(requestParams: ResourcesRequest): ListenableFuture =
+ Futures.immediateFuture(resources(requestParams))
+}
+
+private fun resources(requestParams: ResourcesRequest): Resources {
+ return Resources.Builder()
+ .setVersion(RESOURCES_VERSION)
+ .build()
+}
+
+private fun tile(
+ requestParams: RequestBuilders.TileRequest,
+ context: Context,
+): TileBuilders.Tile {
+ return TileBuilders.Tile.Builder()
+ .setResourcesVersion(RESOURCES_VERSION)
+ .setTileTimeline(
+ TimelineBuilders.Timeline.fromLayoutElement(
+ materialScope(context, requestParams.deviceConfiguration) {
+ primaryLayout(
+ mainSlot = {
+ text(
+ context.getString(R.string.hello_world, "Tile").layoutString,
+ typography = BODY_LARGE
+ )
+ }
+ )
+ }
+ )
+ )
+ .build()
+}
+
+@Preview(device = WearDevices.SMALL_ROUND)
+@Preview(device = WearDevices.LARGE_ROUND)
+fun tilePreview(context: Context) = TilePreviewData(::resources) {
+ tile(it, context)
+}
\ No newline at end of file
diff --git a/apps/giga-wear/client/src/main/keepRules/rules.keep b/apps/giga-wear/client/src/main/keepRules/rules.keep
new file mode 100644
index 0000000..d7e081a
--- /dev/null
+++ b/apps/giga-wear/client/src/main/keepRules/rules.keep
@@ -0,0 +1,12 @@
+# Add project specific R8 rules here.
+# AGP will combine all keep rule files in src/main/keepRules to pass to R8
+#
+# For more details, see
+# https://d.android.com/r/tools/r8/keep-rules
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
\ No newline at end of file
diff --git a/apps/giga-wear/client/src/main/res/drawable/ic_launcher_background.xml b/apps/giga-wear/client/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/apps/giga-wear/client/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/giga-wear/client/src/main/res/drawable/ic_launcher_foreground.xml b/apps/giga-wear/client/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/apps/giga-wear/client/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/giga-wear/client/src/main/res/drawable/splash_icon.xml b/apps/giga-wear/client/src/main/res/drawable/splash_icon.xml
new file mode 100644
index 0000000..7874e83
--- /dev/null
+++ b/apps/giga-wear/client/src/main/res/drawable/splash_icon.xml
@@ -0,0 +1,27 @@
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
diff --git a/apps/giga-wear/client/src/main/res/drawable/tile_preview.png b/apps/giga-wear/client/src/main/res/drawable/tile_preview.png
new file mode 100644
index 0000000..6cba3c3
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/drawable/tile_preview.png differ
diff --git a/apps/giga-wear/client/src/main/res/mipmap-anydpi/ic_launcher.xml b/apps/giga-wear/client/src/main/res/mipmap-anydpi/ic_launcher.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/apps/giga-wear/client/src/main/res/mipmap-anydpi/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/giga-wear/client/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/apps/giga-wear/client/src/main/res/mipmap-anydpi/ic_launcher_round.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/apps/giga-wear/client/src/main/res/mipmap-anydpi/ic_launcher_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/giga-wear/client/src/main/res/mipmap-hdpi/ic_launcher.webp b/apps/giga-wear/client/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/apps/giga-wear/client/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/apps/giga-wear/client/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/apps/giga-wear/client/src/main/res/mipmap-mdpi/ic_launcher.webp b/apps/giga-wear/client/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/apps/giga-wear/client/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/apps/giga-wear/client/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..62b611d
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/apps/giga-wear/client/src/main/res/mipmap-xhdpi/ic_launcher.webp b/apps/giga-wear/client/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/apps/giga-wear/client/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/apps/giga-wear/client/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1b9a695
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/apps/giga-wear/client/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/apps/giga-wear/client/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/apps/giga-wear/client/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/apps/giga-wear/client/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9287f50
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/apps/giga-wear/client/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/apps/giga-wear/client/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/apps/giga-wear/client/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/apps/giga-wear/client/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9126ae3
Binary files /dev/null and b/apps/giga-wear/client/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/apps/giga-wear/client/src/main/res/values/strings.xml b/apps/giga-wear/client/src/main/res/values/strings.xml
new file mode 100644
index 0000000..ca7359e
--- /dev/null
+++ b/apps/giga-wear/client/src/main/res/values/strings.xml
@@ -0,0 +1,6 @@
+
+ GigaWear
+ Hello, %1$s!
+ Example tile
+ Example complication
+
\ No newline at end of file
diff --git a/apps/giga-wear/client/src/main/res/values/styles.xml b/apps/giga-wear/client/src/main/res/values/styles.xml
new file mode 100644
index 0000000..dbf9c83
--- /dev/null
+++ b/apps/giga-wear/client/src/main/res/values/styles.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 86bc611..d5b448d 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -53,6 +53,21 @@ coreKtx = "1.19.0"
workRuntimeKtx = "2.11.2"
krpc = "0.10.3"
core = "1.19.0"
+playServicesWearable = "20.0.1"
+composeBom = "2025.12.00"
+composeMaterial3 = "1.5.6"
+composeFoundation = "1.5.6"
+composeUiTooling = "1.5.6"
+wearToolingPreview = "1.0.0"
+coreSplashscreen = "1.2.0"
+tiles = "1.5.0"
+tilesRenderer = "1.5.0"
+protolayout = "1.3.0"
+protolayoutMaterial3 = "1.3.0"
+guava = "33.2.1-android"
+tilesTooling = "1.5.0"
+tilesToolingPreview = "1.5.0"
+watchfaceComplicationsDataSourceKtx = "1.2.1"
[libraries]
adaptive-layout = { module = "org.jetbrains.compose.material3.adaptive:adaptive-layout", version.ref = "adaptiveLayout" }
@@ -153,6 +168,25 @@ kotlinx-rpc-krpc-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-
kotlinx-rpc-krpc-server = { module = "org.jetbrains.kotlinx:kotlinx-rpc-krpc-server", version.ref = "krpc" }
kotlinx-rpc-krpc-client = { module = "org.jetbrains.kotlinx:kotlinx-rpc-krpc-client", version.ref = "krpc" }
androidx-core = { group = "androidx.core", name = "core", version.ref = "core" }
+play-services-wearable = { group = "com.google.android.gms", name = "play-services-wearable", version.ref = "playServicesWearable" }
+androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
+androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
+androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
+androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
+androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
+androidx-compose-material3 = { group = "androidx.wear.compose", name = "compose-material3", version.ref = "composeMaterial3" }
+androidx-compose-foundation = { group = "androidx.wear.compose", name = "compose-foundation", version.ref = "composeFoundation" }
+androidx-compose-ui-tooling = { group = "androidx.wear.compose", name = "compose-ui-tooling", version.ref = "composeUiTooling" }
+androidx-wear-tooling-preview = { group = "androidx.wear", name = "wear-tooling-preview", version.ref = "wearToolingPreview" }
+androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "coreSplashscreen" }
+androidx-tiles = { group = "androidx.wear.tiles", name = "tiles", version.ref = "tiles" }
+androidx-tiles-renderer = { group = "androidx.wear.tiles", name = "tiles-renderer", version.ref = "tilesRenderer" }
+androidx-protolayout = { group = "androidx.wear.protolayout", name = "protolayout", version.ref = "protolayout" }
+androidx-protolayout-material3 = { group = "androidx.wear.protolayout", name = "protolayout-material3", version.ref = "protolayoutMaterial3" }
+guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
+androidx-tiles-tooling = { group = "androidx.wear.tiles", name = "tiles-tooling", version.ref = "tilesTooling" }
+androidx-tiles-tooling-preview = { group = "androidx.wear.tiles", name = "tiles-tooling-preview", version.ref = "tilesToolingPreview" }
+androidx-watchface-complications-data-source-ktx = { group = "androidx.wear.watchface", name = "watchface-complications-data-source-ktx", version.ref = "watchfaceComplicationsDataSourceKtx" }
[plugins]
jetbrains-compose = { id = "org.jetbrains.compose", version.ref = "compose-version" }
diff --git a/settings.gradle.kts b/settings.gradle.kts
index c35c949..4dfeb47 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -38,6 +38,9 @@ include(":apps:experimentarium:androidApp")
include(":apps:experimentarium:shared")
include(":apps:experimentarium:web")
+include(":apps:giga-wear")
+include(":apps:giga-wear:client")
+
include(":libs:backend-base")
include(":libs:base")
include(":libs:ui")