Skip to content

Commit

Permalink
[FEAT]#111: 인스타 사진 공유 문제 해결
Browse files Browse the repository at this point in the history
  • Loading branch information
flash159483 committed Aug 19, 2024
1 parent b76d197 commit 4a22876
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 226 deletions.
10 changes: 0 additions & 10 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,16 +55,6 @@
</intent-filter>
</activity>

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>

<service
android:name=".PushNotificationService"
android:exported="false">
Expand Down
11 changes: 3 additions & 8 deletions app/src/main/kotlin/com/bff/wespot/NavigatorImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -95,18 +95,13 @@ class NavigatorImpl @Inject constructor() : Navigator {
val intent = Intent("com.instagram.share.ADD_TO_STORY")
.apply {
setDataAndType(null, "image/*")
setPackage("com.instagram.android")
}
if (intent.resolveActivity(context.packageManager) == null) {
redirectToPlayStoreForInstagram(context)
}

intent.apply {
return intent.apply {
putExtra("source_application", BuildConfig.FACEBOOK_APP_ID)
setDataAndType(file, "image/jpeg")
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}

return intent
}

override fun navigateToWebLink(context: Context, webLink: WebLink) {
Expand Down Expand Up @@ -156,7 +151,7 @@ class NavigatorImpl @Inject constructor() : Navigator {
}
}

private fun redirectToPlayStoreForInstagram(context: Context) {
override fun redirectToPlayStoreForInstagram(context: Context) {
val appStoreIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=com.instagram.android"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,6 @@ interface Navigator {
)

fun navigateToWebLink(context: Context, webLink: WebLink)

fun redirectToPlayStoreForInstagram(context: Context)
}
67 changes: 41 additions & 26 deletions core/ui/src/main/kotlin/com/bff/wespot/ui/CaptureBitmap.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
package com.bff.wespot.ui

import android.content.ContentValues
import android.content.Context
import android.graphics.Bitmap
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.content.FileProvider
import androidx.core.view.drawToBitmap
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import com.bff.wespot.designsystem.theme.WeSpotThemeManager

@Composable
fun CaptureBitmap(
Expand All @@ -35,7 +37,13 @@ fun CaptureBitmap(
factory = {
composeView.apply {
setContent {
content.invoke()
Box(
modifier = Modifier
.wrapContentSize()
.background(WeSpotThemeManager.colors.backgroundColor)
) {
content.invoke()
}
}
}
},
Expand All @@ -44,25 +52,32 @@ fun CaptureBitmap(
return ::captureBitmap
}

suspend fun saveImage(image: Bitmap, context: Context): Uri? =
withContext(Dispatchers.IO) {
val imagesFolder = File(context.cacheDir, "images")
var uri: Uri? = null
fun saveBitmap(context: Context, bitmap: Bitmap, filename: String = DEFAULT_FILENAME): Uri? {
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")

try {
imagesFolder.mkdirs()
val file = File(imagesFolder, "shared_image.png")
FileOutputStream(file).use { stream ->
if (image.compress(Bitmap.CompressFormat.PNG, 90, stream)) {
stream.flush()
uri = FileProvider.getUriForFile(context, "com.bff.wespot.fileProvider", file)
} else {
Timber.e("Error", "Image compression failed")
}
}
} catch (e: IOException) {
Timber.e("Error", "IOException while trying to write file for sharing: ${e.message}")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
}
}

val contentResolver = context.contentResolver

val imageUri: Uri? = contentResolver.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues
)

uri
return imageUri.also {
val fileOutputStream = imageUri?.let { contentResolver.openOutputStream(it) }
if (fileOutputStream != null) {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream)
}
fileOutputStream?.close()
}
}


@JvmField
val DEFAULT_FILENAME = "${System.currentTimeMillis()}.png"
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ import com.bff.wespot.navigation.Navigator
import com.bff.wespot.ui.CaptureBitmap
import com.bff.wespot.ui.DotIndicators
import com.bff.wespot.ui.WSCarousel
import com.bff.wespot.ui.saveImage
import com.bff.wespot.ui.saveBitmap
import com.bff.wespot.vote.R
import com.bff.wespot.vote.ui.VoteCard
import com.bff.wespot.vote.viewmodel.IndividualViewModel
Expand Down Expand Up @@ -74,11 +74,12 @@ fun IndividualVoteScreen(
val individual by viewModel.individual.collectAsStateWithLifecycle()
val context = LocalContext.current

val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == Activity.RESULT_OK) {
val intent = it.data
val launcher =
rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == Activity.RESULT_OK) {
val intent = it.data
}
}
}

Scaffold(
topBar = {
Expand Down Expand Up @@ -189,11 +190,13 @@ fun IndividualVoteScreen(
onClick = {
MainScope().launch {
val bitmap = snapshot.invoke()
val uri = saveImage(bitmap, context)
val uri = saveBitmap(context, bitmap)

if (uri != null) {
val intent = navigator.navigateToInstaStory(context, uri)
launcher.launch(intent)
intent?.let {
launcher.launch(intent)
}
}
}
},
Expand Down
Loading

0 comments on commit 4a22876

Please sign in to comment.