Skip to content

Commit 99fe202

Browse files
author
pav
committed
— Теперь процесс распознавания маркировки происходит быстрее.
— Включение вспышки на экране сканирования маркировки поддерживается почти на всех устройствах.
1 parent e48168d commit 99fe202

40 files changed

+711
-552
lines changed

app/build.gradle.kts

+6-4
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ android {
1414
applicationId = "ru.application.homemedkit"
1515
minSdk = 26
1616
targetSdk = 35
17-
versionCode = 39
18-
versionName = "1.5.4"
17+
versionCode = 40
18+
versionName = "1.5.5"
1919
}
2020

2121
dependenciesInfo {
@@ -45,7 +45,6 @@ android {
4545
}
4646
buildFeatures {
4747
compose = true
48-
buildConfig = true
4948
}
5049
composeOptions {
5150
kotlinCompilerExtensionVersion = "1.5.15"
@@ -77,7 +76,10 @@ dependencies {
7776
implementation(libs.compose.destinations)
7877

7978
// ==================== Scanner ====================
80-
implementation(libs.code.scanner)
79+
implementation(libs.androidx.camera.camera2)
80+
implementation(libs.androidx.camera.lifecycle)
81+
implementation(libs.androidx.camera.view)
82+
implementation(libs.zxing)
8183

8284
// ==================== Coil ====================
8385
implementation(libs.coil.compose)

app/src/main/java/ru/application/homemedkit/MainActivity.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import ru.application.homemedkit.helpers.KEY_EXP_IMP
1111
import ru.application.homemedkit.helpers.Preferences
1212
import ru.application.homemedkit.helpers.showToast
1313
import ru.application.homemedkit.receivers.AlarmSetter
14-
import ru.application.homemedkit.screens.RootScreen
14+
import ru.application.homemedkit.ui.screens.RootScreen
1515
import ru.application.homemedkit.ui.theme.AppTheme
1616

1717
class MainActivity : ComponentActivity() {

app/src/main/java/ru/application/homemedkit/data/dao/MedicineDAO.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ interface MedicineDAO {
3232
fun getByKitId(kitId: Long?): List<Medicine>
3333

3434
@Query("SELECT cis from medicines")
35-
fun getAllCIS(): List<String>
35+
fun getAllCis(): List<String>
3636

3737
@Query("UPDATE medicines SET prodAmount = prodAmount - :amount WHERE id = :id")
3838
fun intakeMedicine(id: Long, amount: Double)

app/src/main/java/ru/application/homemedkit/helpers/AppUtils.kt

+40-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ import androidx.core.os.LocaleListCompat
1515
import ru.application.homemedkit.R
1616
import ru.application.homemedkit.R.string.text_error
1717
import ru.application.homemedkit.R.string.text_success
18+
import ru.application.homemedkit.data.dto.Intake
19+
import ru.application.homemedkit.data.dto.Medicine
20+
import ru.application.homemedkit.data.dto.Technical
21+
import ru.application.homemedkit.models.states.IntakeState
22+
import ru.application.homemedkit.models.states.MedicineState
1823
import java.time.Instant
1924
import java.time.LocalDate
2025
import java.time.LocalDateTime
@@ -112,4 +117,38 @@ fun createNotificationChannel(
112117
)
113118
.build()
114119
)
115-
}
120+
}
121+
122+
fun MedicineState.toMedicine() = Medicine(
123+
id = id,
124+
kitId = kitId,
125+
cis = cis,
126+
productName = productName,
127+
expDate = expDate,
128+
prodFormNormName = prodFormNormName,
129+
prodDNormName = prodDNormName,
130+
prodAmount = prodAmount.ifEmpty { "0.0" }.toDouble(),
131+
doseType = doseType,
132+
phKinetics = phKinetics,
133+
comment = comment,
134+
image = image,
135+
technical = Technical(
136+
scanned = cis.isNotBlank(),
137+
verified = technical.verified
138+
)
139+
)
140+
141+
fun IntakeState.toIntake(time: List<LocalTime>) = Intake(
142+
intakeId = intakeId,
143+
medicineId = medicineId,
144+
amount = amount.toDouble(),
145+
interval = interval.toInt(),
146+
foodType = foodType,
147+
time = time,
148+
period = period.toInt(),
149+
startDate = startDate,
150+
finalDate = finalDate,
151+
fullScreen = fullScreen,
152+
noSound = noSound,
153+
preAlarm = preAlarm
154+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package ru.application.homemedkit.helpers
2+
3+
import android.graphics.ImageFormat.YUV_420_888
4+
import android.graphics.ImageFormat.YUV_422_888
5+
import android.graphics.ImageFormat.YUV_444_888
6+
import androidx.camera.core.ImageAnalysis
7+
import androidx.camera.core.ImageProxy
8+
import com.google.zxing.BarcodeFormat
9+
import com.google.zxing.BinaryBitmap
10+
import com.google.zxing.DecodeHintType
11+
import com.google.zxing.MultiFormatReader
12+
import com.google.zxing.PlanarYUVLuminanceSource
13+
import com.google.zxing.common.HybridBinarizer
14+
import java.nio.ByteBuffer
15+
16+
class DataMatrixAnalyzer(private val onResult: (String) -> Unit) : ImageAnalysis.Analyzer {
17+
override fun analyze(image: ImageProxy) {
18+
if (image.format in listOf(YUV_420_888, YUV_422_888, YUV_444_888)) {
19+
val source = PlanarYUVLuminanceSource(
20+
image.planes.first().buffer.toByteArray(),
21+
image.width, image.height,
22+
0, 0,
23+
image.width, image.height,
24+
false
25+
)
26+
27+
try {
28+
val result = MultiFormatReader().apply {
29+
setHints(
30+
mapOf(
31+
DecodeHintType.POSSIBLE_FORMATS to setOf(BarcodeFormat.DATA_MATRIX),
32+
DecodeHintType.TRY_HARDER to true
33+
)
34+
)
35+
}.decodeWithState(BinaryBitmap(HybridBinarizer(source)))
36+
37+
onResult(result.text)
38+
} catch (_: Throwable) {
39+
} finally {
40+
image.close()
41+
}
42+
}
43+
}
44+
45+
private fun ByteBuffer.toByteArray() = ByteArray(rewind().remaining()).also(::get)
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ru.application.homemedkit.models.events
2+
3+
sealed interface Response {
4+
data object Default : Response
5+
data object Loading : Response
6+
data object Error : Response
7+
data class Success(val id: Long) : Response
8+
data class Duplicate(val id: Long) : Response
9+
data class NoNetwork(val cis: String) : Response
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
@file:OptIn(ExperimentalMaterial3Api::class)
2+
3+
package ru.application.homemedkit.models.states
4+
5+
import androidx.compose.material3.ExperimentalMaterial3Api
6+
import androidx.compose.material3.TimePickerState
7+
import androidx.compose.runtime.mutableStateListOf
8+
import androidx.compose.runtime.snapshots.SnapshotStateList
9+
import ru.application.homemedkit.helpers.BLANK
10+
import ru.application.homemedkit.helpers.Intervals
11+
import ru.application.homemedkit.helpers.Periods
12+
13+
data class IntakeState(
14+
val adding: Boolean = true,
15+
val editing: Boolean = false,
16+
val default: Boolean = false,
17+
val intakeId: Long = 0,
18+
val medicineId: Long = 0,
19+
val amount: String = BLANK,
20+
val interval: String = BLANK,
21+
val intervalE: Intervals? = null,
22+
val period: String = BLANK,
23+
val periodE: Periods = Periods.PICK,
24+
val foodType: Int = -1,
25+
val time: SnapshotStateList<String> = mutableStateListOf(BLANK),
26+
val times: SnapshotStateList<TimePickerState> = mutableStateListOf(TimePickerState(12, 0, true)),
27+
val timeF: Int = 0,
28+
val startDate: String = BLANK,
29+
val finalDate: String = BLANK,
30+
val showIntervalM: Boolean = false,
31+
val showPeriodD: Boolean = false,
32+
val showPeriodM: Boolean = false,
33+
val showTimeP: Boolean = false,
34+
val fullScreen: Boolean = false,
35+
val noSound: Boolean = false,
36+
val preAlarm: Boolean = false,
37+
val showDialog: Boolean = false
38+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ru.application.homemedkit.models.states
2+
3+
import androidx.compose.foundation.lazy.LazyListState
4+
import ru.application.homemedkit.helpers.BLANK
5+
6+
data class IntakesState(
7+
val search: String = BLANK,
8+
val tab: Int = 0,
9+
val stateA: LazyListState = LazyListState(),
10+
val stateB: LazyListState = LazyListState(),
11+
val stateC: LazyListState = LazyListState(),
12+
val showDialog: Boolean = false
13+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package ru.application.homemedkit.models.states
2+
3+
import ru.application.homemedkit.helpers.BLANK
4+
import ru.application.homemedkit.helpers.DoseTypes
5+
import ru.application.homemedkit.helpers.Types
6+
import ru.application.homemedkit.models.events.Response
7+
import kotlin.random.Random
8+
9+
data class MedicineState(
10+
val adding: Boolean = true,
11+
val editing: Boolean = false,
12+
val default: Boolean = false,
13+
val fetch: Response = Response.Default,
14+
val id: Long = 0L,
15+
val kitId: Long? = null,
16+
val kitTitle: String = BLANK,
17+
val cis: String = BLANK,
18+
val productName: String = BLANK,
19+
val expDate: Long = -1L,
20+
val prodFormNormName: String = BLANK,
21+
val prodDNormName: String = BLANK,
22+
val prodAmount: String = BLANK,
23+
val doseType: String = BLANK,
24+
val doseTypeE: DoseTypes? = null,
25+
val phKinetics: String = BLANK,
26+
val comment: String = BLANK,
27+
val image: String = Types.entries[Random.nextInt(0, Types.entries.size)].value,
28+
val technical: TechnicalState = TechnicalState(),
29+
val showDialogKits: Boolean = false,
30+
val showDialogDate: Boolean = false,
31+
val showDialogIcons: Boolean = false,
32+
val showMenuDose: Boolean = false
33+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package ru.application.homemedkit.models.states
2+
3+
import androidx.compose.foundation.lazy.LazyListState
4+
import ru.application.homemedkit.data.dto.Medicine
5+
import ru.application.homemedkit.helpers.BLANK
6+
import ru.application.homemedkit.helpers.Preferences
7+
import ru.application.homemedkit.helpers.Sorting
8+
9+
data class MedicinesState(
10+
val search: String = BLANK,
11+
val sorting: Comparator<Medicine> =
12+
Sorting.entries.find { it.value == Preferences.getSortingOrder() }?.type ?: Sorting.IN_NAME.type,
13+
val kitId: Long = Preferences.getLastKit(),
14+
val showSort: Boolean = false,
15+
val showFilter: Boolean = false,
16+
val showAdding: Boolean = false,
17+
val listState: LazyListState = LazyListState()
18+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
@file:OptIn(ExperimentalMaterial3Api::class)
2+
3+
package ru.application.homemedkit.models.states
4+
5+
import androidx.compose.material3.ExperimentalMaterial3Api
6+
import androidx.compose.material3.TimePickerState
7+
import ru.application.homemedkit.helpers.BLANK
8+
9+
data class TakenState(
10+
val takenId: Long = 0L,
11+
val medicineId: Long = 0L,
12+
val productName: String = BLANK,
13+
val amount: Double = 0.0,
14+
val trigger: Long = 0L,
15+
val inFact: Long = 0L,
16+
val pickerState: TimePickerState = TimePickerState(12, 0, true),
17+
val taken: Boolean = false,
18+
val selection: Int = 0,
19+
val notified: Boolean = false,
20+
val showPicker: Boolean = false
21+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package ru.application.homemedkit.models.states
2+
3+
data class TechnicalState(
4+
val scanned: Boolean = false,
5+
val verified: Boolean = false
6+
)

0 commit comments

Comments
 (0)