diff --git a/domain/src/main/java/com/foke/together/domain/interactor/GetQRCodeUseCase.kt b/domain/src/main/java/com/foke/together/domain/interactor/GetQRCodeUseCase.kt new file mode 100644 index 0000000..e1354ff --- /dev/null +++ b/domain/src/main/java/com/foke/together/domain/interactor/GetQRCodeUseCase.kt @@ -0,0 +1,17 @@ +package com.foke.together.domain.interactor + +import android.graphics.Bitmap +import com.foke.together.domain.output.QRCodeRepositoryInterface +import javax.inject.Inject + +class GetQRCodeUseCase @Inject constructor( + private val qrCodeRepository: QRCodeRepositoryInterface +){ + suspend operator fun invoke(key: String, url: String): Result { + qrCodeRepository.generateQRCode(key, url) + .onSuccess { + return qrCodeRepository.readQRCode(key) + } + return Result.failure(Exception("cannot generate qr code")) + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/foke/together/domain/output/QRCodeRepositoryInterface.kt b/domain/src/main/java/com/foke/together/domain/output/QRCodeRepositoryInterface.kt new file mode 100644 index 0000000..fb29030 --- /dev/null +++ b/domain/src/main/java/com/foke/together/domain/output/QRCodeRepositoryInterface.kt @@ -0,0 +1,8 @@ +package com.foke.together.domain.output + +import android.graphics.Bitmap + +interface QRCodeRepositoryInterface { + suspend fun generateQRCode(key: String, url: String): Result + suspend fun readQRCode(key: String): Result +} \ No newline at end of file diff --git a/external/src/main/java/com/foke/together/external/qrcode/QRCodeGenerator.kt b/external/src/main/java/com/foke/together/external/qrcode/QRCodeGenerator.kt new file mode 100644 index 0000000..bb4cee3 --- /dev/null +++ b/external/src/main/java/com/foke/together/external/qrcode/QRCodeGenerator.kt @@ -0,0 +1,42 @@ +package com.foke.together.external.qrcode + +import android.content.Context +import android.graphics.Bitmap +import com.foke.together.util.AppPolicy +import com.foke.together.util.FileUtil +import com.foke.together.util.ImageFileUtil +import qrcode.QRCode +import javax.inject.Inject + +class QRCodeGenerator @Inject constructor( +) { + suspend fun generate(context: Context, key: String, data: String): Result = + runCatching { + val squares = QRCode.ofSquares() + // TODO: check customize qrcode +// val circles = QRCode.ofCircles() +// val roundedSquares = QRCode.ofRoundedSquares() + + val qrcode = squares + .withInnerSpacing(0) + // TODO: check customize qrcode +// .withColor(Colors.BLACK) +// .withRadius(20) +// .withSize(25) +// .withLogo(logo.readBytes(), 20, 20) + .build(data) + + val qrImage = qrcode.render().nativeImage() as Bitmap + + // TODO: need to merge ImageFileUtil and FileUtil + FileUtil.createDir(context, key) + ImageFileUtil.cacheBitmap(context, qrImage, "$key/${AppPolicy.DEFAULT_QR_CODE_IMAGE_NAME}") + } + + fun readFile(context: Context, key: String): Result { + FileUtil.readCachedQRCodeImage(context, key)?.run { + return Result.success(this) + } + return Result.failure(Exception("cannot read file")) + } +} \ No newline at end of file diff --git a/external/src/main/java/com/foke/together/external/repository/QRCodeRepository.kt b/external/src/main/java/com/foke/together/external/repository/QRCodeRepository.kt new file mode 100644 index 0000000..21e0008 --- /dev/null +++ b/external/src/main/java/com/foke/together/external/repository/QRCodeRepository.kt @@ -0,0 +1,23 @@ +package com.foke.together.external.repository + +import android.content.Context +import com.foke.together.domain.output.QRCodeRepositoryInterface +import com.foke.together.external.qrcode.QRCodeGenerator +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class QRCodeRepository @Inject constructor( + @ApplicationContext private val context: Context, + private val qrCodeGenerator: QRCodeGenerator +): QRCodeRepositoryInterface { + override suspend fun generateQRCode(key: String, url: String): Result { + return qrCodeGenerator.generate(context, key, url) + } + + override suspend fun readQRCode(key: String) = + qrCodeGenerator.readFile(context, key) + + companion object { + private val TAG = QRCodeRepository::class.java.simpleName + } +} \ No newline at end of file diff --git a/external/src/main/java/com/foke/together/external/repository/di/RepositoryModule.kt b/external/src/main/java/com/foke/together/external/repository/di/RepositoryModule.kt index 9285e2d..2d0e61b 100644 --- a/external/src/main/java/com/foke/together/external/repository/di/RepositoryModule.kt +++ b/external/src/main/java/com/foke/together/external/repository/di/RepositoryModule.kt @@ -2,8 +2,10 @@ package com.foke.together.external.repository.di import com.foke.together.domain.output.ExternalCameraRepositoryInterface import com.foke.together.domain.output.ImageRepositoryInterface +import com.foke.together.domain.output.QRCodeRepositoryInterface import com.foke.together.external.repository.ExternalCameraRepository import com.foke.together.external.repository.ImageRepository +import com.foke.together.external.repository.QRCodeRepository import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -19,8 +21,15 @@ abstract class RepositoryModule { externalCameraRepository: ExternalCameraRepository ): ExternalCameraRepositoryInterface + @Singleton @Binds abstract fun bindImageRepository( imageRepository: ImageRepository ): ImageRepositoryInterface + + @Singleton + @Binds + abstract fun bindQRCodeRepository( + qrCodeRepository: QRCodeRepository + ): QRCodeRepositoryInterface } \ No newline at end of file diff --git a/util/src/main/java/com/foke/together/util/AppPolicy.kt b/util/src/main/java/com/foke/together/util/AppPolicy.kt index 059a48c..a4b9647 100644 --- a/util/src/main/java/com/foke/together/util/AppPolicy.kt +++ b/util/src/main/java/com/foke/together/util/AppPolicy.kt @@ -24,4 +24,6 @@ object AppPolicy { const val CAPTURED_FOUR_CUT_IMAGE_NAME = "capture" const val SINGLE_ROW_FINAL_IMAGE_NAME = "final_single_row" const val TWO_ROW_FINAL_IMAGE_NAME = "final_two_row" + + const val DEFAULT_QR_CODE_IMAGE_NAME = "qrcode" } \ No newline at end of file diff --git a/util/src/main/java/com/foke/together/util/FileUtil.kt b/util/src/main/java/com/foke/together/util/FileUtil.kt new file mode 100644 index 0000000..7515d49 --- /dev/null +++ b/util/src/main/java/com/foke/together/util/FileUtil.kt @@ -0,0 +1,25 @@ +package com.foke.together.util + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import java.io.File + +object FileUtil { + fun readCachedQRCodeImage(context: Context, key: String): Bitmap? { + val qrImageFile = File("${context.cacheDir}/$key/${AppPolicy.DEFAULT_QR_CODE_IMAGE_NAME}.jpg") + var qrImage: Bitmap? = null + + if (qrImageFile.exists()) { + qrImage = BitmapFactory.decodeFile(qrImageFile.absolutePath) + } + return qrImage + } + + fun createDir(context: Context, key: String) { + val dir = File("${context.cacheDir}/$key") + if(!dir.exists()) { + dir.mkdirs() + } + } +} \ No newline at end of file