Skip to content

Commit 55f11af

Browse files
authored
Add vector search (#40)
* feat: add object box for text vector search * feat: add object box for image vector search and similarity * feat: fix duplicated photos * feat: fix duplicated photos * feat: enhance photo navigation and update ObjectBox configuration * Revert targetSdk from 36 to 35 * chore: update .gitignore and remove unused Git hook installation task
1 parent 7cff940 commit 55f11af

File tree

107 files changed

+2359
-1089
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+2359
-1089
lines changed

.editorconfig

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
end_of_line = lf
6+
indent_size = 4
7+
indent_style = space
8+
insert_final_newline = true
9+
max_line_length = 120
10+
tab_width = 4
11+
12+
[*.{kt,kts}]
13+
# Disable specific ktlint rules
14+
ktlint_disabled_rules = no-wildcard-imports,filename,package-name,max-line-length,comment-spacing
15+
# Enable experimental ktlint rules
16+
ktlint_experimental = true
17+
# Android style rules
18+
ktlint_standard_filename = false
19+
ktlint_standard_class-naming = true
20+
ktlint_standard_import-ordering = true
21+
22+
[*.{yml,yaml}]
23+
indent_size = 2
24+
25+
[*.{md,markdown}]
26+
trim_trailing_whitespace = false

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,5 @@ key.properties
3030
website/docs/.vitepress/cache/
3131
website/docs/.vitepress/dist/
3232
website/docs/.vitepress/dist-ssr/
33-
node_modules/
33+
node_modules/
34+
/.vscode/

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"java.configuration.updateBuildConfiguration": "interactive"
3+
}

app/build.gradle renamed to app/build.gradle.kts

Lines changed: 76 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,77 +3,92 @@ plugins {
33
alias(libs.plugins.kotlin.android)
44
alias(libs.plugins.ksp)
55
alias(libs.plugins.kotlin.serialization)
6+
id("io.objectbox")
7+
id("io.gitlab.arturbosch.detekt")
68
}
79

810
android {
9-
namespace 'me.grey.picquery'
10-
compileSdk 34
11+
namespace = "me.grey.picquery"
12+
compileSdk = 36
1113

1214
defaultConfig {
13-
applicationId "me.grey.picquery"
14-
minSdk 29
15-
targetSdk 35
16-
versionCode 8
17-
versionName "1.2.0"
15+
applicationId = "me.grey.picquery"
16+
minSdk = 29
17+
targetSdk = 35
18+
versionCode = 8
19+
versionName = "1.2.0"
1820

19-
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
21+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2022
vectorDrawables {
21-
useSupportLibrary true
23+
useSupportLibrary = true
2224
}
2325

2426
ndk {
2527
//noinspection ChromeOsAbiSupport
26-
abiFilters 'armeabi-v7a', 'arm64-v8a'
28+
abiFilters += listOf("armeabi-v7a", "arm64-v8a")
2729
}
2830
}
2931

3032
buildTypes {
3133
debug {}
3234

3335
release {
34-
minifyEnabled true
35-
shrinkResources true
36-
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
36+
isMinifyEnabled = true
37+
isShrinkResources = true
38+
proguardFiles(
39+
getDefaultProguardFile("proguard-android-optimize.txt"),
40+
"proguard-rules.pro"
41+
)
3742
}
3843
}
3944

4045
compileOptions {
41-
sourceCompatibility JavaVersion.VERSION_17
42-
targetCompatibility JavaVersion.VERSION_17
46+
sourceCompatibility = JavaVersion.VERSION_17
47+
targetCompatibility = JavaVersion.VERSION_17
4348
}
4449
kotlinOptions {
45-
jvmTarget = '17'
50+
jvmTarget = "17"
4651
}
4752

4853
buildFeatures {
49-
compose true
54+
compose = true
5055
}
5156
composeOptions {
52-
kotlinCompilerExtensionVersion libs.versions.compose.compiler.get()
57+
kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get()
5358
}
54-
packagingOptions {
59+
packaging {
5560
resources {
56-
excludes += '/META-INF/{AL2.0,LGPL2.1}'
61+
excludes.add("/META-INF/{AL2.0,LGPL2.1}")
5762
}
5863
}
59-
buildToolsVersion = '34.0.0'
64+
buildToolsVersion = "34.0.0"
6065
}
6166

6267
dependencies {
63-
def composeBom = platform(libs.compose.bom)
64-
implementation composeBom
65-
androidTestImplementation composeBom
68+
// Bill of Materials
69+
val composeBom = platform(libs.compose.bom)
70+
implementation(composeBom)
71+
androidTestImplementation(composeBom)
72+
73+
// Implementation dependencies
74+
implementation(libs.androidx.core.ktx)
75+
implementation(libs.androidx.lifecycle.runtime)
76+
implementation(libs.androidx.lifecycle.livedata)
77+
implementation(libs.androidx.lifecycle.viewmodel)
78+
implementation(libs.androidx.activity.compose)
79+
implementation(libs.androidx.legacy)
80+
implementation(libs.androidx.datastore)
81+
implementation(libs.androidx.dataStore)
82+
implementation(libs.androidx.work.runtime)
83+
implementation(libs.androidx.navigation.compose)
84+
implementation(libs.androidx.splashscreen)
6685

6786
// Compose
6887
implementation(libs.compose.ui)
6988
implementation(libs.compose.ui.graphics)
7089
implementation(libs.compose.ui.tooling.preview)
7190
implementation(libs.compose.material3)
7291
implementation(libs.compose.material.icons.extended)
73-
debugImplementation(libs.compose.ui.tooling)
74-
75-
// SplashScreen
76-
implementation(libs.androidx.splashscreen)
7792

7893
// Accompanist
7994
implementation(libs.accompanist.systemuicontroller)
@@ -87,61 +102,67 @@ dependencies {
87102
implementation(libs.koin.androidx.compose)
88103
implementation(libs.koin.androidx.compose.navigation)
89104

90-
// DataStore
91-
implementation(libs.androidx.dataStore)
92-
93105
// Coroutines
94106
implementation(libs.coroutines.core)
95107
implementation(libs.coroutines.android)
96108

97109
// Serialization
98110
implementation(libs.kotlinx.serialization)
99111

100-
// AndroidX
101-
implementation(libs.androidx.core.ktx)
102-
implementation(libs.androidx.lifecycle.runtime)
103-
implementation(libs.androidx.activity.compose)
104-
implementation(libs.androidx.legacy)
105-
implementation(libs.androidx.test.monitor)
106-
implementation(libs.androidx.test.ext)
107-
implementation(libs.androidx.lifecycle.livedata)
108-
implementation(libs.androidx.lifecycle.viewmodel)
109-
implementation(libs.androidx.datastore)
110-
implementation(libs.androidx.work.runtime)
111-
implementation(libs.androidx.navigation.compose)
112-
113112
// Room
114113
implementation(libs.room.runtime)
115114
implementation(libs.room.ktx)
116-
ksp(libs.room.compiler)
117115

118116
// Logging
119117
implementation(libs.timber)
120118

121119
// Image Loading
122120
implementation(libs.glide)
123121
implementation(libs.glide.compose)
124-
annotationProcessor(libs.glide.compiler)
125122

126123
// Other Libraries
127124
implementation(libs.zoomable)
128125
implementation(libs.permissionx)
126+
implementation(libs.work.runtime)
129127

130128
// AI & ML
131129
implementation(libs.onnx.runtime)
132130
implementation(libs.mlkit.translate)
133131

134-
/// LiteRT
135-
implementation libs.litert
136-
implementation libs.litert.support
137-
implementation libs.litert.gpu.api
138-
implementation libs.litert.gpu
132+
// LiteRT
133+
implementation(libs.litert)
134+
implementation(libs.litert.support)
135+
implementation(libs.litert.gpu.api)
136+
implementation(libs.litert.gpu)
137+
138+
// Debug implementation
139+
debugImplementation(libs.compose.ui.tooling)
140+
141+
// Annotation processors
142+
annotationProcessor(libs.glide.compiler)
139143

140-
// Testing
144+
// KSP
145+
ksp(libs.room.compiler)
146+
147+
// Test implementation
141148
testImplementation(libs.junit)
149+
150+
// Android test implementation
142151
androidTestImplementation(libs.androidx.test.ext)
143152
androidTestImplementation(libs.espresso.core)
153+
androidTestImplementation(libs.androidx.test.monitor)
154+
androidTestImplementation(libs.androidx.test.ext)
155+
}
144156

145-
implementation libs.androidx.work.runtime
146-
implementation libs.work.runtime
147-
}
157+
detekt {
158+
toolVersion = "1.23.3"
159+
config.setFrom(files("${project.rootDir}/config/detekt/detekt.yml"))
160+
buildUponDefaultConfig = true
161+
autoCorrect = true
162+
parallel = true
163+
ignoreFailures = true // Set to true to make detekt non-blocking
164+
}
165+
166+
tasks.withType<io.gitlab.arturbosch.detekt.Detekt>().configureEach {
167+
jvmTarget = "17"
168+
}

app/objectbox-models/default.json

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.",
3+
"_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.",
4+
"_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
5+
"entities": [
6+
{
7+
"id": "1:6256215631497182449",
8+
"lastPropertyId": "4:8708513969305822242",
9+
"name": "ObjectBoxEmbedding",
10+
"properties": [
11+
{
12+
"id": "1:6545944855726584292",
13+
"name": "id",
14+
"type": 6,
15+
"flags": 1
16+
},
17+
{
18+
"id": "2:2952332731167717730",
19+
"name": "photoId",
20+
"indexId": "1:2288798603681999270",
21+
"type": 6,
22+
"flags": 8
23+
},
24+
{
25+
"id": "3:5902302075074261439",
26+
"name": "albumId",
27+
"indexId": "2:2918075261928380804",
28+
"type": 6,
29+
"flags": 8
30+
},
31+
{
32+
"id": "4:8708513969305822242",
33+
"name": "data",
34+
"indexId": "3:7623933702471750709",
35+
"type": 28,
36+
"flags": 8
37+
}
38+
],
39+
"relations": []
40+
}
41+
],
42+
"lastEntityId": "1:6256215631497182449",
43+
"lastIndexId": "3:7623933702471750709",
44+
"lastRelationId": "0:0",
45+
"lastSequenceId": "0:0",
46+
"modelVersion": 5,
47+
"modelVersionParserMinimum": 5,
48+
"retiredEntityUids": [],
49+
"retiredIndexUids": [],
50+
"retiredPropertyUids": [],
51+
"retiredRelationUids": [],
52+
"version": 1
53+
}

app/proguard-rules.pro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Add project specific ProGuard rules here.
22
# You can control the set of applied configuration files using the
3-
# proguardFiles setting in build.gradle.
3+
# proguardFiles setting in build.gradle.kts.
44
#
55
# For more details, see
66
# http://developer.android.com/guide/developing/tools/proguard.html
Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
11
package me.grey.picquery
22

3-
import android.util.Log
43
import androidx.test.ext.junit.runners.AndroidJUnit4
5-
6-
import org.junit.Test
74
import org.junit.runner.RunWith
85

9-
import org.junit.Assert.*
10-
116
/**
127
* Instrumented test, which will execute on an Android device.
138
*
149
* See [testing documentation](http://d.android.com/tools/testing).
1510
*/
1611
@RunWith(AndroidJUnit4::class)
17-
class ExampleInstrumentedTest {
18-
19-
}
12+
class ExampleInstrumentedTest
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
package me.grey.picquery
2-

app/src/main/java/me/grey/picquery/PicQueryApplication.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
44
import android.app.Application
55
import android.content.Context
66
import me.grey.picquery.common.AppModules
7+
import me.grey.picquery.data.ObjectBoxDatabase
78
import org.koin.android.ext.koin.androidContext
89
import org.koin.android.ext.koin.androidLogger
910
import org.koin.core.context.startKoin
@@ -27,7 +28,7 @@ class PicQueryApplication : Application() {
2728
androidLogger()
2829
androidContext(this@PicQueryApplication)
2930
modules(AppModules)
31+
ObjectBoxDatabase.getDatabase().initialize(this@PicQueryApplication)
3032
}
3133
}
3234
}
33-

0 commit comments

Comments
 (0)