Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 541bf125 authored by cketti's avatar cketti
Browse files

Add QR code reader functionality

parent 8239b139
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -19,7 +19,9 @@ dependencies {
    implementation(libs.androidx.camera.lifecycle)
    implementation(libs.androidx.camera.view)
    implementation(libs.moshi)
    implementation(libs.okio)
    implementation(libs.timber)
    implementation(libs.zxing)

    testImplementation(projects.core.ui.compose.testing)
    testImplementation(projects.core.ui.compose.theme2.k9mail)
+4 −1
Original line number Diff line number Diff line
package app.k9mail.feature.migration.qrcode.ui

import app.k9mail.core.ui.compose.common.mvi.BaseViewModel
import app.k9mail.feature.migration.qrcode.domain.QrCodeDomainContract.UseCase
import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.Effect
import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.Event
import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.State

class NoOpQrCodeScannerViewModel(
internal class NoOpQrCodeScannerViewModel(
    initialState: State = State(),
) : BaseViewModel<State, Event, Effect>(initialState), QrCodeScannerContract.ViewModel {
    override val cameraUseCasesProvider = UseCase.CameraUseCasesProvider { emptyList() }

    override fun event(event: Event) = Unit
}
+36 −0
Original line number Diff line number Diff line
package app.k9mail.feature.migration.qrcode.ui

import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.core.ui.compose.designsystem.atom.Surface

@Preview
@Composable
fun QrCodeScannerViewPreview_initial() {
    PreviewWithTheme {
        Surface {
            QrCodeScannerView(
                cameraUseCasesProvider = { emptyList() },
                scannedCount = 0,
                totalCount = 0,
                onDoneClick = {},
            )
        }
    }
}

@Preview
@Composable
fun QrCodeScannerViewPreview_one_qr_code_scanned() {
    PreviewWithTheme {
        Surface {
            QrCodeScannerView(
                cameraUseCasesProvider = { emptyList() },
                scannedCount = 1,
                totalCount = 2,
                onDoneClick = {},
            )
        }
    }
}
+9 −1
Original line number Diff line number Diff line
package app.k9mail.feature.migration.qrcode

import app.k9mail.feature.migration.qrcode.domain.QrCodeDomainContract.UseCase
import app.k9mail.feature.migration.qrcode.domain.usecase.QrCodePayloadReader
import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerViewModel
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module

val qrCodeModule = module {
    viewModel { QrCodeScannerViewModel() }
    viewModel {
        QrCodeScannerViewModel(
            qrCodePayloadReader = get(),
        )
    }

    factory<UseCase.QrCodePayloadReader> { QrCodePayloadReader() }
}
+18 −0
Original line number Diff line number Diff line
package app.k9mail.feature.migration.qrcode.domain

import app.k9mail.feature.migration.qrcode.domain.entity.AccountData
import androidx.camera.core.UseCase as CameraUseCase

internal interface QrCodeDomainContract {

    interface UseCase {

        fun interface CameraUseCasesProvider {
            fun getUseCases(): List<CameraUseCase>
        }

        fun interface QrCodePayloadReader {
            fun read(payload: String): AccountData?
        }
    }
}
Loading