Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
bfeb08b
fix(ar): improve drag drop position and trash zone deletion
recepteksi Apr 6, 2026
7e5701c
fix(ar): fix trash zone detection with proper X and Y coordinate check
recepteksi Apr 6, 2026
a4f049b
fix: code review fixes and drag improvements
recepteksi Apr 6, 2026
5d5314f
fix(ar): improve drag drop to work on all screen positions
recepteksi Apr 6, 2026
2177109
style(ui): improve TrashZone design with transparency and centering
recepteksi Apr 6, 2026
44e7ad9
fix(ui): correct trash zone detection bounds for drag-to-delete
recepteksi Apr 6, 2026
67fde79
Merge remote-tracking branch 'origin/feature/ui-trash-design' into dev
recepteksi Apr 6, 2026
4eb0ecc
Merge remote-tracking branch 'origin/feature/fix-trash-delete' into dev
recepteksi Apr 6, 2026
9abb221
feat(ui): add thumbnails to object lists
recepteksi Apr 6, 2026
c7f8000
feat(di): setup Koin dependency injection
recepteksi Apr 6, 2026
1179b83
feat(ar): implement photo capture functionality
recepteksi Apr 7, 2026
50c06c7
feat(ar): implement video recording functionality
recepteksi Apr 7, 2026
652293c
feat(ui): implement object gallery screen
recepteksi Apr 7, 2026
7be3e25
build: add Kover test coverage plugin
recepteksi Apr 7, 2026
97af3b7
feat: Add video recording with camera-style UI
recepteksi Apr 7, 2026
f49f3de
fix: Improve AR screen layout and video recording connection
recepteksi Apr 7, 2026
2316036
feat: Add 3D model preview thumbnails in object lists
recepteksi Apr 7, 2026
6026dae
fix: Remove HDR environment dependency from ModelPreviewThumbnail
recepteksi Apr 7, 2026
f3139da
fix: Disable 3D preview to fix crash - use icon placeholder
recepteksi Apr 7, 2026
ef03c8a
Fix video recording and gallery integration
recepteksi Apr 7, 2026
19c214c
fix(di): prevent Koin crash on Activity recreation
recepteksi Apr 7, 2026
83a5fe5
Fix photo capture DI - ensure CapturePhotoUseCase is injected
recepteksi Apr 7, 2026
3276be1
fix(ui): improve camera controls symmetry
recepteksi Apr 8, 2026
b1564a4
fix(gallery): lazy inject GalleryViewModel to prevent crash
recepteksi Apr 8, 2026
65ab2ff
Merge branch 'fix/KAN-7-camera-controls-symmetry' into dev
recepteksi Apr 8, 2026
47f36cb
docs: reorganize markdown files into proper structure
recepteksi Apr 8, 2026
75c36e5
docs: update INDEX.md and README.md with new file structure
recepteksi Apr 8, 2026
bee391a
merge: resolve conflicts with origin/main
recepteksi Apr 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude/WORKFLOW_EXAMPLES.md
Original file line number Diff line number Diff line change
Expand Up @@ -251,12 +251,12 @@ git checkout -b ci/ios-workflow
# 2. Create workflow files
# Created:
# - .github/workflows/ios-ci.yml
# - .github/workflows/IOS_WORKFLOW_README.md
# - docs/ios/ios-workflow-readme.md
# - iosApp/.swiftlint.yml

# 3. Commit
git add .github/workflows/ios-ci.yml
git add .github/workflows/IOS_WORKFLOW_README.md
git add docs/ios/ios-workflow-readme.md
git add iosApp/.swiftlint.yml

git commit -m "ci: add GitHub Actions workflow for iOS builds
Expand Down
12 changes: 7 additions & 5 deletions .claude/agents/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Agents

Central documentation containing 6 agent definitions and task specifications.
Central documentation containing 7 agent definitions and task specifications.

## 🔄 Development Workflow

Expand All @@ -25,8 +25,9 @@ Each agent follows this flow:
| 2 | [Android Expert](./android-expert-agent.md) | ARCore research, Android report | Android report |
| 3 | [iOS Expert](./ios-expert-agent.md) | ARKit research, iOS report | iOS report |
| 4 | [Main Developer](./main-developer-agent.md) | Code development (domain, application, infrastructure, presentation) | Code files |
| 5 | [Test Developer](./test-developer-agent.md) | Unit testing | Test files |
| 6 | [Code Reviewer](./code-reviewer-agent.md) | Code standards verification | Review report |
| 5 | [Bug Fixer](./bug-fixer-agent.md) | Debugging and bug fixing | Bug reports, fixed code |
| 6 | [Test Developer](./test-developer-agent.md) | Unit testing | Test files |
| 7 | [Code Reviewer](./code-reviewer-agent.md) | Code standards verification | Review report |

## Agent Communication Flow

Expand Down Expand Up @@ -70,5 +71,6 @@ Main Developer (fixes)
2. [Android Expert Agent](./android-expert-agent.md) - Android ARCore implementation
3. [iOS Expert Agent](./ios-expert-agent.md) - iOS ARKit implementation
4. [Main Developer Agent](./main-developer-agent.md) - Core code development
5. [Test Developer Agent](./test-developer-agent.md) - Unit tests
6. [Code Reviewer Agent](./code-reviewer-agent.md) - Code quality control
5. [Bug Fixer Agent](./bug-fixer-agent.md) - Debugging and bug fixing
6. [Test Developer Agent](./test-developer-agent.md) - Unit tests
7. [Code Reviewer Agent](./code-reviewer-agent.md) - Code quality control
220 changes: 0 additions & 220 deletions INDEX.md

This file was deleted.

43 changes: 43 additions & 0 deletions composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ plugins {
alias(libs.plugins.composeMultiplatform)
alias(libs.plugins.composeCompiler)
alias(libs.plugins.kotlinSerialization)
alias(libs.plugins.kover)
}

kotlin {
Expand Down Expand Up @@ -35,6 +36,7 @@ kotlin {
implementation(libs.sceneview)
implementation(libs.arcore)
implementation(libs.gson)
implementation(libs.koin.android)
}
commonMain.dependencies {
implementation(compose.runtime)
Expand All @@ -48,6 +50,8 @@ kotlin {
implementation(libs.androidx.lifecycle.runtimeCompose)
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.koin.core)
implementation(libs.koin.compose)
}
commonTest.dependencies {
implementation(libs.kotlin.test)
Expand Down Expand Up @@ -88,3 +92,42 @@ dependencies {
debugImplementation(libs.compose.uiTooling)
}

koverReport {
defaults {
html {
onCheck = true
}
xml {
onCheck = true
}
}

filters {
excludes {
// Exclude generated code
classes("*_Factory", "*_HiltModules*", "Hilt_*", "*BuildConfig")
// Exclude Android framework classes
packages("*.di", "*.ui.theme")
// Exclude Compose generated
annotatedBy("androidx.compose.runtime.Composable")
}
}

verify {
rule {
isEnabled = true
// Domain layer should have high coverage
filters {
includes {
packages("com.trendhive.arsample.domain.*")
packages("com.trendhive.arsample.application.*")
}
}
bound {
minValue = 80
metric = kotlinx.kover.gradle.plugin.dsl.MetricType.LINE
}
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import com.trendhive.arsample.infrastructure.persistence.local.*
import com.trendhive.arsample.infrastructure.persistence.repository.*
import com.trendhive.arsample.application.usecase.*
import java.io.File
import com.trendhive.arsample.di.appModules
import com.trendhive.arsample.di.platformDataSourceModule
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.GlobalContext
import org.koin.core.context.startKoin

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -18,36 +20,18 @@ class MainActivity : ComponentActivity() {
enableEdgeToEdge()
super.onCreate(savedInstanceState)

// Simple DI setup for Android
val filesDir = applicationContext.filesDir
val modelFileStorage = ModelFileStorageImpl(applicationContext, filesDir)
val objectLocalDataSource = ARObjectLocalDataSourceImpl(filesDir)
val sceneDataStore = ARSceneDataStoreImpl(filesDir)

val objectRepository = ARObjectRepositoryImpl(objectLocalDataSource, modelFileStorage)
val sceneRepository = ARSceneRepositoryImpl(sceneDataStore)

val importObjectUseCase = ImportObjectUseCase(objectRepository)
val getAllObjectsUseCase = GetAllObjectsUseCase(objectRepository)
val deleteObjectUseCase = DeleteObjectUseCase(objectRepository)
val placeObjectInSceneUseCase = PlaceObjectInSceneUseCase(sceneRepository, objectRepository)
val removeObjectFromSceneUseCase = RemoveObjectFromSceneUseCase(sceneRepository)
val getSceneUseCase = GetSceneUseCase(sceneRepository)
val saveSceneUseCase = SaveSceneUseCase(sceneRepository)
val moveObjectUseCase = MoveObjectUseCase(sceneRepository)
// Initialize Koin DI only if not already started
// This prevents crash on Activity recreation (e.g., configuration change)
if (GlobalContext.getOrNull() == null) {
startKoin {
androidLogger()
androidContext(applicationContext)
modules(platformDataSourceModule() + appModules)
}
}

setContent {
App(
importObjectUseCase = importObjectUseCase,
getAllObjectsUseCase = getAllObjectsUseCase,
deleteObjectUseCase = deleteObjectUseCase,
placeObjectInSceneUseCase = placeObjectInSceneUseCase,
removeObjectFromSceneUseCase = removeObjectFromSceneUseCase,
getSceneUseCase = getSceneUseCase,
saveSceneUseCase = saveSceneUseCase,
moveObjectUseCase = moveObjectUseCase,
sceneRepository = sceneRepository
)
App()
}
}
}
Loading
Loading