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")