add giga wear stub
@@ -0,0 +1 @@
|
|||||||
|
/build
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<uses-feature android:name="android.hardware.type.watch" />
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@android:style/Theme.DeviceDefault">
|
||||||
|
<service
|
||||||
|
android:name=".complication.MainComplicationService"
|
||||||
|
android:exported="true"
|
||||||
|
android:label="@string/complication_label"
|
||||||
|
android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="android.support.wearable.complications.SUPPORTED_TYPES"
|
||||||
|
android:value="SHORT_TEXT" />
|
||||||
|
<meta-data
|
||||||
|
android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
|
||||||
|
android:value="3600" />
|
||||||
|
</service>
|
||||||
|
<service
|
||||||
|
android:name=".tile.MainTileService"
|
||||||
|
android:exported="true"
|
||||||
|
android:label="@string/tile_label"
|
||||||
|
android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="androidx.wear.tiles.action.BIND_TILE_PROVIDER" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="androidx.wear.tiles.PREVIEW"
|
||||||
|
android:resource="@drawable/tile_preview" />
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<uses-library
|
||||||
|
android:name="com.google.android.wearable"
|
||||||
|
android:required="true" />
|
||||||
|
<uses-library
|
||||||
|
android:name="wear-sdk"
|
||||||
|
android:required="false" />
|
||||||
|
<!--
|
||||||
|
Set to true if your app is Standalone, that is, it does not require the handheld
|
||||||
|
app to run.
|
||||||
|
-->
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.android.wearable.standalone"
|
||||||
|
android:value="true" />
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".presentation.MainActivity"
|
||||||
|
android:exported="true"
|
||||||
|
android:taskAffinity=""
|
||||||
|
android:theme="@style/MainActivityTheme.Starting">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
@@ -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()
|
||||||
|
}
|
||||||
@@ -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<TextToSpeech?>(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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -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<TileBuilders.Tile> =
|
||||||
|
Futures.immediateFuture(tile(requestParams, this))
|
||||||
|
|
||||||
|
override fun onTileResourcesRequest(requestParams: ResourcesRequest): ListenableFuture<Resources> =
|
||||||
|
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)
|
||||||
|
}
|
||||||
@@ -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 *;
|
||||||
|
#}
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<path
|
||||||
|
android:fillColor="#3DDC84"
|
||||||
|
android:pathData="M0,0h108v108h-108z" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M9,0L9,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,0L19,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,0L29,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,0L39,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,0L49,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,0L59,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,0L69,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,0L79,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M89,0L89,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M99,0L99,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,9L108,9"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,19L108,19"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,29L108,29"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,39L108,39"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,49L108,49"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,59L108,59"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,69L108,69"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,79L108,79"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,89L108,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,99L108,99"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,29L89,29"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,39L89,39"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,49L89,49"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,59L89,59"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,69L89,69"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,79L89,79"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,19L29,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,19L39,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,19L49,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,19L59,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,19L69,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,19L79,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="85.84757"
|
||||||
|
android:endY="92.4963"
|
||||||
|
android:startX="42.9492"
|
||||||
|
android:startY="49.59793"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#44000000"
|
||||||
|
android:offset="0.0" />
|
||||||
|
<item
|
||||||
|
android:color="#00000000"
|
||||||
|
android:offset="1.0" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFF"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
||||||
|
android:strokeWidth="1"
|
||||||
|
android:strokeColor="#00000000" />
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item
|
||||||
|
android:width="48dp"
|
||||||
|
android:height="48dp"
|
||||||
|
android:gravity="center">
|
||||||
|
<shape android:shape="oval">
|
||||||
|
<solid android:color="#FFFFFF" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item
|
||||||
|
android:width="40dp"
|
||||||
|
android:height="40dp"
|
||||||
|
android:gravity="center">
|
||||||
|
<vector
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="#000000"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M17.6,11.48 L19.44,8.3a0.63,0.63 0,0 0,-1.09 -0.63l-1.88,3.24a11.43,11.43 0,0 0,-8.94 0L5.65,7.67a0.63,0.63 0,0 0,-1.09 0.63L6.4,11.48A10.81,10.81 0,0 0,1 20L23,20A10.81,10.81 0,0 0,17.6 11.48ZM7,17.25A1.25,1.25 0,1 1,8.25 16,1.25 1.25,0 0,1 7,17.25ZM17,17.25A1.25,1.25 0,1 1,18.25 16,1.25 1.25,0 0,1 17,17.25Z" />
|
||||||
|
</vector>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background" />
|
||||||
|
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
</adaptive-icon>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background" />
|
||||||
|
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
</adaptive-icon>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 982 B |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
@@ -0,0 +1,6 @@
|
|||||||
|
<resources>
|
||||||
|
<string name="app_name">GigaWear</string>
|
||||||
|
<string name="hello_world">Hello, %1$s!</string>
|
||||||
|
<string name="tile_label">Example tile</string>
|
||||||
|
<string name="complication_label">Example complication</string>
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<style name="MainActivityTheme.Starting" parent="Theme.SplashScreen">
|
||||||
|
<item name="windowSplashScreenBackground">@android:color/black</item>
|
||||||
|
<item name="windowSplashScreenAnimatedIcon">@drawable/splash_icon</item>
|
||||||
|
<item name="postSplashScreenTheme">@android:style/Theme.DeviceDefault</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
@@ -53,6 +53,21 @@ coreKtx = "1.19.0"
|
|||||||
workRuntimeKtx = "2.11.2"
|
workRuntimeKtx = "2.11.2"
|
||||||
krpc = "0.10.3"
|
krpc = "0.10.3"
|
||||||
core = "1.19.0"
|
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]
|
[libraries]
|
||||||
adaptive-layout = { module = "org.jetbrains.compose.material3.adaptive:adaptive-layout", version.ref = "adaptiveLayout" }
|
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-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" }
|
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" }
|
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]
|
[plugins]
|
||||||
jetbrains-compose = { id = "org.jetbrains.compose", version.ref = "compose-version" }
|
jetbrains-compose = { id = "org.jetbrains.compose", version.ref = "compose-version" }
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ include(":apps:experimentarium:androidApp")
|
|||||||
include(":apps:experimentarium:shared")
|
include(":apps:experimentarium:shared")
|
||||||
include(":apps:experimentarium:web")
|
include(":apps:experimentarium:web")
|
||||||
|
|
||||||
|
include(":apps:giga-wear")
|
||||||
|
include(":apps:giga-wear:client")
|
||||||
|
|
||||||
include(":libs:backend-base")
|
include(":libs:backend-base")
|
||||||
include(":libs:base")
|
include(":libs:base")
|
||||||
include(":libs:ui")
|
include(":libs:ui")
|
||||||
|
|||||||