From 929ca6059ccc2722bb671dbf5992d0bf8e76bade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=88=98?= Date: Fri, 11 Oct 2024 10:36:45 +0900 Subject: [PATCH] share button test --- app/src/main/AndroidManifest.xml | 15 ++++++++++- app/src/main/res/xml/provider_files.xml | 18 +++++++++++++ .../external/repository/ImageRepository.kt | 1 + .../together/presenter/screen/ShareScreen.kt | 18 +++++++++++-- .../presenter/viewmodel/ShareViewModel.kt | 27 ++++++++++++++----- .../java/com/foke/together/util/AppPolicy.kt | 4 +-- .../com/foke/together/util/ImageFileUtil.kt | 13 +++++++-- 7 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/xml/provider_files.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f5a051e..218e671 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,20 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" - android:usesCleartextTraffic="true" /> + android:usesCleartextTraffic="true" > + + + + + + + diff --git a/app/src/main/res/xml/provider_files.xml b/app/src/main/res/xml/provider_files.xml new file mode 100644 index 0000000..344e0be --- /dev/null +++ b/app/src/main/res/xml/provider_files.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/external/src/main/java/com/foke/together/external/repository/ImageRepository.kt b/external/src/main/java/com/foke/together/external/repository/ImageRepository.kt index 88dd731..5483cdc 100644 --- a/external/src/main/java/com/foke/together/external/repository/ImageRepository.kt +++ b/external/src/main/java/com/foke/together/external/repository/ImageRepository.kt @@ -41,6 +41,7 @@ class ImageRepository @Inject constructor( return uriList } + //TODO: file작업코드는 repository에서 하지말고 Util로 옮겨놓기 override suspend fun clearCacheDir() { context.cacheDir.listFiles().forEach { if(it.name.contains(".jpg")){ diff --git a/presenter/src/main/java/com/foke/together/presenter/screen/ShareScreen.kt b/presenter/src/main/java/com/foke/together/presenter/screen/ShareScreen.kt index 87c8882..fb72eb0 100644 --- a/presenter/src/main/java/com/foke/together/presenter/screen/ShareScreen.kt +++ b/presenter/src/main/java/com/foke/together/presenter/screen/ShareScreen.kt @@ -19,6 +19,8 @@ import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ChainStyle import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension +import androidx.core.content.FileProvider +import androidx.core.net.toFile import com.foke.together.presenter.frame.FourCutFrame import com.foke.together.presenter.theme.FourCutTogetherTheme import com.foke.together.presenter.theme.highContrastDarkColorScheme @@ -28,6 +30,7 @@ import androidx.lifecycle.compose.LifecycleEventEffect import coil.compose.AsyncImage import coil.request.ImageRequest import com.foke.together.presenter.viewmodel.ShareViewModel +import com.foke.together.util.ImageFileUtil @Composable fun ShareScreen( @@ -87,7 +90,10 @@ fun ShareScreen( } IconButton( - onClick = { viewModel.printImage() }, + onClick = { + val finalTwoRowImageUri = viewModel.getFinalTwoImageUri() + ImageFileUtil.printFromUri(context,finalTwoRowImageUri) + }, modifier = Modifier.constrainAs(printButton) { top.linkTo(homeButton.bottom) end.linkTo(parent.end, margin = 30.dp) @@ -105,7 +111,15 @@ fun ShareScreen( } IconButton( - onClick = {viewModel.shareImage()}, + onClick = { + val finalFile = finalSingleImageUri.toFile() + val contentUri = FileProvider.getUriForFile( + context, + "com.foke.together.fileprovider", + finalFile + ) + ImageFileUtil.shareUri(context, contentUri) + }, modifier = Modifier.constrainAs(shareButton) { top.linkTo(printButton.bottom) end.linkTo(parent.end, margin = 30.dp) diff --git a/presenter/src/main/java/com/foke/together/presenter/viewmodel/ShareViewModel.kt b/presenter/src/main/java/com/foke/together/presenter/viewmodel/ShareViewModel.kt index 8c3c404..979f1e9 100644 --- a/presenter/src/main/java/com/foke/together/presenter/viewmodel/ShareViewModel.kt +++ b/presenter/src/main/java/com/foke/together/presenter/viewmodel/ShareViewModel.kt @@ -2,10 +2,13 @@ package com.foke.together.presenter.viewmodel import android.content.Context import android.net.Uri -import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.foke.together.util.AppPolicy +import com.foke.together.util.ImageFileUtil import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -16,18 +19,28 @@ class ShareViewModel @Inject constructor( fun getFinalSingleImageUri(): Uri { var finalSingleImageUri: Uri = Uri.EMPTY context.cacheDir.listFiles().forEach { - file -> if (file.name.contains("final_single_row.jpg")) { finalSingleImageUri = Uri.fromFile(file) } + file -> if (file.name.contains("${AppPolicy.SINGLE_ROW_FINAL_IMAGE_NAME}")) { finalSingleImageUri = Uri.fromFile(file) } } return finalSingleImageUri } - fun shareImage() { - - } - fun printImage() { + fun getFinalTwoImageUri(): Uri { + var finalTwoImageUri: Uri = Uri.EMPTY + context.cacheDir.listFiles().forEach { + file -> if (file.name.contains("${AppPolicy.TWO_ROW_FINAL_IMAGE_NAME}")) { finalTwoImageUri = Uri.fromFile(file) } + } + return finalTwoImageUri } fun downloadImage() { - + val imageUri = getFinalSingleImageUri() + val imageBitmap = ImageFileUtil.getBitmapFromUri(context, imageUri) + viewModelScope.launch { + ImageFileUtil.saveBitmapToStorage( + context, + imageBitmap, + AppPolicy.SINGLE_ROW_FINAL_IMAGE_NAME + ) + } } } \ 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 a4b9647..2b7b502 100644 --- a/util/src/main/java/com/foke/together/util/AppPolicy.kt +++ b/util/src/main/java/com/foke/together/util/AppPolicy.kt @@ -3,7 +3,7 @@ package com.foke.together.util object AppPolicy { const val isDebugMode = true - const val DEFAULT_EXTERNAL_CAMERA_IP = "0.0.0.0" + const val DEFAULT_EXTERNAL_CAMERA_IP = "192.168.0.71:5000" // network const val WEB_SERVER_URL = "https://4cuts.store/" @@ -12,7 +12,7 @@ object AppPolicy { const val WEB_WRITE_TIMEOUT = 10L const val WEB_FILE_MAX_CONTENT_LENGTH = 20971520 - const val EXTERNAL_CAMERA_DEFAULT_SERVER_URL = "http://0.0.0.0" + const val EXTERNAL_CAMERA_DEFAULT_SERVER_URL = "http://192.168.0.71:5000" const val EXTERNAL_CAMERA_CONNECT_TIMEOUT = 10L const val EXTERNAL_CAMERA_READ_TIMEOUT = 10L const val EXTERNAL_CAMERA_WRITE_TIMEOUT = 10L diff --git a/util/src/main/java/com/foke/together/util/ImageFileUtil.kt b/util/src/main/java/com/foke/together/util/ImageFileUtil.kt index 0dae5a1..d94c310 100644 --- a/util/src/main/java/com/foke/together/util/ImageFileUtil.kt +++ b/util/src/main/java/com/foke/together/util/ImageFileUtil.kt @@ -4,12 +4,14 @@ import android.content.Context import android.content.Intent import android.content.Intent.createChooser import android.graphics.Bitmap +import android.graphics.BitmapFactory import android.media.MediaScannerConnection import android.net.Uri import android.os.Environment import androidx.compose.ui.graphics.asAndroidBitmap import androidx.compose.ui.graphics.layer.GraphicsLayer import androidx.core.content.ContextCompat.startActivity +import androidx.core.net.toFile import androidx.print.PrintHelper import kotlinx.coroutines.suspendCancellableCoroutine import java.io.File @@ -84,7 +86,7 @@ object ImageFileUtil { } // TODO: 파일 분리하기 - fun shareBitmap(context: Context, uri: Uri) { + fun shareUri(context: Context, uri: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { type = "image/jpg" putExtra(Intent.EXTRA_STREAM, uri) @@ -93,8 +95,15 @@ object ImageFileUtil { startActivity(context, createChooser(intent, "Share your image"), null) } - fun printBitmap(context: Context, bitmap: Bitmap){ + fun getBitmapFromUri(context: Context, uri: Uri): Bitmap { + val file = uri.toFile() + return BitmapFactory.decodeFile(file.absolutePath) + } + + fun printFromUri(context: Context, uri: Uri){ // can use getActivity() + val file = uri.toFile() + val bitmap = BitmapFactory.decodeFile(file.absolutePath) val photoPrinter = PrintHelper(context) photoPrinter.printBitmap("Print", bitmap) }