Skip to content

Commit 2e92035

Browse files
DokySping03201
authored andcommitted
add GetQRCodeUseCase and qrcode repository [#76]
- QR코드 생성 및 Bitmap 반환 UseCase 추가
1 parent 1aa5278 commit 2e92035

File tree

7 files changed

+126
-0
lines changed

7 files changed

+126
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.foke.together.domain.interactor
2+
3+
import android.graphics.Bitmap
4+
import com.foke.together.domain.output.QRCodeRepositoryInterface
5+
import javax.inject.Inject
6+
7+
class GetQRCodeUseCase @Inject constructor(
8+
private val qrCodeRepository: QRCodeRepositoryInterface
9+
){
10+
suspend operator fun invoke(key: String, url: String): Result<Bitmap> {
11+
qrCodeRepository.generateQRCode(key, url)
12+
.onSuccess {
13+
return qrCodeRepository.readQRCode(key)
14+
}
15+
return Result.failure(Exception("cannot generate qr code"))
16+
}
17+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.foke.together.domain.output
2+
3+
import android.graphics.Bitmap
4+
5+
interface QRCodeRepositoryInterface {
6+
suspend fun generateQRCode(key: String, url: String): Result<Unit>
7+
suspend fun readQRCode(key: String): Result<Bitmap>
8+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.foke.together.external.qrcode
2+
3+
import android.content.Context
4+
import android.graphics.Bitmap
5+
import com.foke.together.util.AppPolicy
6+
import com.foke.together.util.FileUtil
7+
import com.foke.together.util.ImageFileUtil
8+
import qrcode.QRCode
9+
import javax.inject.Inject
10+
11+
class QRCodeGenerator @Inject constructor(
12+
) {
13+
suspend fun generate(context: Context, key: String, data: String): Result<Unit> =
14+
runCatching {
15+
val squares = QRCode.ofSquares()
16+
// TODO: check customize qrcode
17+
// val circles = QRCode.ofCircles()
18+
// val roundedSquares = QRCode.ofRoundedSquares()
19+
20+
val qrcode = squares
21+
.withInnerSpacing(0)
22+
// TODO: check customize qrcode
23+
// .withColor(Colors.BLACK)
24+
// .withRadius(20)
25+
// .withSize(25)
26+
// .withLogo(logo.readBytes(), 20, 20)
27+
.build(data)
28+
29+
val qrImage = qrcode.render().nativeImage() as Bitmap
30+
31+
// TODO: need to merge ImageFileUtil and FileUtil
32+
FileUtil.createDir(context, key)
33+
ImageFileUtil.cacheBitmap(context, qrImage, "$key/${AppPolicy.DEFAULT_QR_CODE_IMAGE_NAME}")
34+
}
35+
36+
fun readFile(context: Context, key: String): Result<Bitmap> {
37+
FileUtil.readCachedQRCodeImage(context, key)?.run {
38+
return Result.success(this)
39+
}
40+
return Result.failure(Exception("cannot read file"))
41+
}
42+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.foke.together.external.repository
2+
3+
import android.content.Context
4+
import com.foke.together.domain.output.QRCodeRepositoryInterface
5+
import com.foke.together.external.qrcode.QRCodeGenerator
6+
import dagger.hilt.android.qualifiers.ApplicationContext
7+
import javax.inject.Inject
8+
9+
class QRCodeRepository @Inject constructor(
10+
@ApplicationContext private val context: Context,
11+
private val qrCodeGenerator: QRCodeGenerator
12+
): QRCodeRepositoryInterface {
13+
override suspend fun generateQRCode(key: String, url: String): Result<Unit> {
14+
return qrCodeGenerator.generate(context, key, url)
15+
}
16+
17+
override suspend fun readQRCode(key: String) =
18+
qrCodeGenerator.readFile(context, key)
19+
20+
companion object {
21+
private val TAG = QRCodeRepository::class.java.simpleName
22+
}
23+
}

external/src/main/java/com/foke/together/external/repository/di/RepositoryModule.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package com.foke.together.external.repository.di
22

33
import com.foke.together.domain.output.ExternalCameraRepositoryInterface
44
import com.foke.together.domain.output.ImageRepositoryInterface
5+
import com.foke.together.domain.output.QRCodeRepositoryInterface
56
import com.foke.together.external.repository.ExternalCameraRepository
67
import com.foke.together.external.repository.ImageRepository
8+
import com.foke.together.external.repository.QRCodeRepository
79
import dagger.Binds
810
import dagger.Module
911
import dagger.hilt.InstallIn
@@ -19,8 +21,15 @@ abstract class RepositoryModule {
1921
externalCameraRepository: ExternalCameraRepository
2022
): ExternalCameraRepositoryInterface
2123

24+
@Singleton
2225
@Binds
2326
abstract fun bindImageRepository(
2427
imageRepository: ImageRepository
2528
): ImageRepositoryInterface
29+
30+
@Singleton
31+
@Binds
32+
abstract fun bindQRCodeRepository(
33+
qrCodeRepository: QRCodeRepository
34+
): QRCodeRepositoryInterface
2635
}

util/src/main/java/com/foke/together/util/AppPolicy.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,6 @@ object AppPolicy {
2424
const val CAPTURED_FOUR_CUT_IMAGE_NAME = "capture"
2525
const val SINGLE_ROW_FINAL_IMAGE_NAME = "final_single_row"
2626
const val TWO_ROW_FINAL_IMAGE_NAME = "final_two_row"
27+
28+
const val DEFAULT_QR_CODE_IMAGE_NAME = "qrcode"
2729
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.foke.together.util
2+
3+
import android.content.Context
4+
import android.graphics.Bitmap
5+
import android.graphics.BitmapFactory
6+
import java.io.File
7+
8+
object FileUtil {
9+
fun readCachedQRCodeImage(context: Context, key: String): Bitmap? {
10+
val qrImageFile = File("${context.cacheDir}/$key/${AppPolicy.DEFAULT_QR_CODE_IMAGE_NAME}.jpg")
11+
var qrImage: Bitmap? = null
12+
13+
if (qrImageFile.exists()) {
14+
qrImage = BitmapFactory.decodeFile(qrImageFile.absolutePath)
15+
}
16+
return qrImage
17+
}
18+
19+
fun createDir(context: Context, key: String) {
20+
val dir = File("${context.cacheDir}/$key")
21+
if(!dir.exists()) {
22+
dir.mkdirs()
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)