view-mate: болванка + концепт + эскизы + сценарии (единый коммит, история очищена от hprof/build)

This commit is contained in:
Hermes Agent
2026-08-11 11:34:50 +03:00
commit 5268a12d20
25 changed files with 1234 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
plugins {
alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.android.library)
alias(libs.plugins.kotlinx.serialization)
}
kotlin {
androidTarget {
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
}
}
jvm()
sourceSets {
commonMain.dependencies {
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.coroutines.core)
}
androidMain.dependencies {
implementation(libs.kotlinx.coroutines.android)
}
}
}
android {
namespace = "pw.binom.viewmate.core"
compileSdk = 35
defaultConfig {
minSdk = 26
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
@@ -0,0 +1,62 @@
package pw.binom.viewmate.core
import kotlinx.serialization.Serializable
/**
* Режимы очков. Переключаются с телефона (и жестом на очках).
* Каталог контента — НЕ режим: он живёт на телефоне (и в будущем —
* у голосового ассистента), а очки только показывают выбранное.
*/
@Serializable
enum class GlassesMode {
/** Кино: видео на очках (ExoPlayer), звук на телефоне. */
MOVIE,
/** Общение с ассистентом (Hermes): выбор сессии + разговор. */
CHAT,
}
/**
* Состояния режима кино. BROWSING здесь нет — выбор контента
* происходит на телефоне (каталог Jellyfin), очки получают готовое.
*/
@Serializable
enum class MovieState {
PLAYING,
PAUSED,
}
/**
* Состояния режима общения.
*/
@Serializable
enum class ChatState {
/** Выбор сессии (список сессий Hermes). */
SESSION_SELECT,
/** Разговор в активной сессии. */
TALKING,
}
/** Команды управления медиа — единые для очков и телефона. */
@Serializable
enum class MediaCommand {
PLAY,
PAUSE,
TOGGLE,
SEEK_FORWARD,
SEEK_BACKWARD,
NEXT_AUDIO,
PREV_AUDIO,
CLOSE,
}
/** Состояние воспроизведения (синхронизация очки ↔ телефон). */
@Serializable
data class PlaybackState(
val itemId: String? = null,
val positionMs: Long = 0,
val durationMs: Long = 0,
val audioIndex: Int = 0,
val playing: Boolean = false,
)