Skip to content

Commit

Permalink
add GetQRCodeUseCase and qrcode repository [#76]
Browse files Browse the repository at this point in the history
- QR코드 생성 및 Bitmap 반환 UseCase 추가
  • Loading branch information
DokySp authored and ing03201 committed Oct 11, 2024
1 parent 1aa5278 commit 2e92035
Show file tree
Hide file tree
Showing 7 changed files with 126 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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<Bitmap> {
qrCodeRepository.generateQRCode(key, url)
.onSuccess {
return qrCodeRepository.readQRCode(key)
}
return Result.failure(Exception("cannot generate qr code"))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.foke.together.domain.output

import android.graphics.Bitmap

interface QRCodeRepositoryInterface {
suspend fun generateQRCode(key: String, url: String): Result<Unit>
suspend fun readQRCode(key: String): Result<Bitmap>
}
Original file line number Diff line number Diff line change
@@ -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<Unit> =
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<Bitmap> {
FileUtil.readCachedQRCodeImage(context, key)?.run {
return Result.success(this)
}
return Result.failure(Exception("cannot read file"))
}
}
Original file line number Diff line number Diff line change
@@ -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<Unit> {
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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}
2 changes: 2 additions & 0 deletions util/src/main/java/com/foke/together/util/AppPolicy.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
25 changes: 25 additions & 0 deletions util/src/main/java/com/foke/together/util/FileUtil.kt
Original file line number Diff line number Diff line change
@@ -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()
}
}
}

0 comments on commit 2e92035

Please sign in to comment.