Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{
"java.configuration.updateBuildConfiguration": "interactive"
"java.configuration.updateBuildConfiguration": "interactive",
"git.ignoreLimitWarning": true
}
16 changes: 10 additions & 6 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.ksp)
alias(libs.plugins.kotlin.serialization)
id("io.objectbox")
Expand Down Expand Up @@ -46,16 +47,11 @@ android {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}

buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get()
}

packaging {
resources {
excludes.add("/META-INF/{AL2.0,LGPL2.1}")
Expand All @@ -64,6 +60,12 @@ android {
buildToolsVersion = "34.0.0"
}

kotlin {
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
}
}

dependencies {
// Bill of Materials
val composeBom = platform(libs.compose.bom)
Expand Down Expand Up @@ -119,6 +121,8 @@ dependencies {
// Image Loading
implementation(libs.glide)
implementation(libs.glide.compose)
implementation(libs.coil)
implementation(libs.coil.compose)

// Other Libraries
implementation(libs.zoomable)
Expand Down
53 changes: 53 additions & 0 deletions app/objectbox-models/default.json.bak
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{
"_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.",
"_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.",
"_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
"entities": [
{
"id": "1:6256215631497182449",
"lastPropertyId": "4:8708513969305822242",
"name": "ObjectBoxEmbedding",
"properties": [
{
"id": "1:6545944855726584292",
"name": "id",
"type": 6,
"flags": 1
},
{
"id": "2:2952332731167717730",
"name": "photoId",
"indexId": "1:2288798603681999270",
"type": 6,
"flags": 8
},
{
"id": "3:5902302075074261439",
"name": "albumId",
"indexId": "2:2918075261928380804",
"type": 6,
"flags": 8
},
{
"id": "4:8708513969305822242",
"name": "data",
"indexId": "3:7623933702471750709",
"type": 28,
"flags": 8
}
],
"relations": []
}
],
"lastEntityId": "1:6256215631497182449",
"lastIndexId": "3:7623933702471750709",
"lastRelationId": "0:0",
"lastSequenceId": "0:0",
"modelVersion": 5,
"modelVersionParserMinimum": 5,
"retiredEntityUids": [],
"retiredIndexUids": [],
"retiredPropertyUids": [],
"retiredRelationUids": [],
"version": 1
}
13 changes: 9 additions & 4 deletions app/src/main/java/me/grey/picquery/PicQueryApplication.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package me.grey.picquery

import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import me.grey.picquery.common.AppModules
Expand All @@ -13,14 +12,20 @@ import timber.log.Timber
class PicQueryApplication : Application() {

companion object {
@SuppressLint("StaticFieldLeak")
lateinit var context: Context
private lateinit var appContext: Context
private const val TAG = "PicQueryApp"

/**
* 获取 Application Context,避免内存泄漏
* 总是返回 applicationContext 而不是直接持有引用
*/
val context: Context
get() = appContext.applicationContext
}

override fun onCreate() {
super.onCreate()
context = applicationContext
appContext = this
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
Expand Down
67 changes: 59 additions & 8 deletions app/src/main/java/me/grey/picquery/common/AppModules.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,15 @@ import me.grey.picquery.data.data_source.ObjectBoxEmbeddingRepository
import me.grey.picquery.data.data_source.PhotoRepository
import me.grey.picquery.data.data_source.PreferenceRepository
import me.grey.picquery.domain.AlbumManager
import me.grey.picquery.domain.EmbeddingService
import me.grey.picquery.domain.ImageSearcher
import me.grey.picquery.domain.MLKitTranslator
import me.grey.picquery.domain.SearchConfigurationService
import me.grey.picquery.domain.SearchOrchestrator
import me.grey.picquery.domain.SimilarityConfigurationService
import me.grey.picquery.domain.SimilarityManager
import me.grey.picquery.feature.clip.modulesCLIP
import me.grey.picquery.feature.mobileclip2.modulesMobileCLIP2
import me.grey.picquery.ui.display.DisplayViewModel
import me.grey.picquery.ui.home.HomeViewModel
import me.grey.picquery.ui.photoDetail.PhotoDetailViewModel
Expand All @@ -27,7 +32,8 @@ import org.koin.dsl.module
private val viewModelModules = module {
viewModel {
HomeViewModel(
imageSearcher = get()
imageSearcher = get(),
preferenceRepository = get()
)
}
viewModel {
Expand Down Expand Up @@ -65,18 +71,58 @@ private val dataModules = module {
}

private val domainModules = module {
// Translation service
single { MLKitTranslator() }

// Encoding service - Handles image and text encoding
single {
ImageSearcher(
EmbeddingService(
context = androidContext(),
imageEncoder = get(),
textEncoder = get(),
embeddingRepository = get(),
objectBoxEmbeddingRepository = get(),
translator = MLKitTranslator(),
dispatcher = get(),
dispatcher = get()
)
}

// Search configuration service - Manages search configuration
single {
SearchConfigurationService(
preferenceRepository = get(),
scope = get(),
scope = get()
)
}

// Search orchestrator - Coordinates search operations
single {
SearchOrchestrator(
embeddingService = get(),
configurationService = get(),
objectBoxEmbeddingRepository = get(),
translator = get(),
dispatcher = get(),
scope = get()
)
}

// Image searcher - External interface for search functionality
single {
ImageSearcher(
embeddingService = get(),
configurationService = get(),
searchOrchestrator = get()
)
}

// Similarity configuration service - Manages similarity grouping configuration
single {
SimilarityConfigurationService(
scope = get()
)
}

// Album manager
single {
AlbumManager(
albumRepository = get(),
Expand All @@ -87,9 +133,14 @@ private val domainModules = module {
)
}

single { MLKitTranslator() }

single { SimilarityManager(get(), get()) }
// Similarity manager
single {
SimilarityManager(
imageSimilarityDao = get(),
embeddingRepository = get(),
configurationService = get()
)
}
}

val workManagerModule = module {
Expand Down
Loading