From 0243e77b50bee903644b39a1b58b64c70fdc9b55 Mon Sep 17 00:00:00 2001 From: HyunWoo Lee Date: Sun, 4 Feb 2024 18:20:36 +0900 Subject: [PATCH 01/10] Add facebookAppId --- .github/workflows/develop_PR_builder.yml | 2 ++ app/src/main/AndroidManifest.xml | 7 ++++++- .../kotlin/com/teampophory/pophory/plugin/CommonConfigs.kt | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/develop_PR_builder.yml b/.github/workflows/develop_PR_builder.yml index 0114fdef..c3a7fe5c 100644 --- a/.github/workflows/develop_PR_builder.yml +++ b/.github/workflows/develop_PR_builder.yml @@ -45,6 +45,7 @@ jobs: KEY_ALIAS: ${{ secrets.SENTRY_DSN }} KEY_PASSWORD: ${{ secrets.SENTRY_DSN }} STORE_PASSWORD: ${{ secrets.SENTRY_DSN }} + FACEBOOK_APP_ID: ${{ secrets.SENTRY_DSN }} run: | echo sentryDsn=\"$SENTRY_DSN\" >> ./local.properties echo kakaoApiKey=$KAKAO_API_KEY >> ./local.properties @@ -53,6 +54,7 @@ jobs: echo keyAlias=$KEY_ALIAS >> ./local.properties echo keyPassword=KEY_PASSWORD >> ./local.properties echo storePassword=$STORE_PASSWORD >> ./local.properties + echo facebookAppId=$FACEBOOK_APP_ID >> ./local.properties - name: Access Firebase Service run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e714103c..cc88876e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,7 +4,9 @@ - + + Date: Sun, 4 Feb 2024 18:54:19 +0900 Subject: [PATCH 02/10] Add facebookAppId to BuildConfig object --- .../main/kotlin/com/teampophory/pophory/plugin/CommonConfigs.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build-logic/convention/src/main/kotlin/com/teampophory/pophory/plugin/CommonConfigs.kt b/build-logic/convention/src/main/kotlin/com/teampophory/pophory/plugin/CommonConfigs.kt index 175e2f4b..19bf10d6 100644 --- a/build-logic/convention/src/main/kotlin/com/teampophory/pophory/plugin/CommonConfigs.kt +++ b/build-logic/convention/src/main/kotlin/com/teampophory/pophory/plugin/CommonConfigs.kt @@ -24,6 +24,7 @@ internal fun Project.configureAndroidCommonPlugin() { defaultConfig { val kakaoApiKey = properties["kakaoApiKey"] as? String ?: "" val pophoryBaseUrl = properties["pophoryBaseUrl"] as? String ?: "" + val facebookAppId = properties["facebookAppId"] as? String ?: "" manifestPlaceholders["sentryDsn"] = properties["sentryDsn"] as String manifestPlaceholders["kakaoApiKey"] = properties["kakaoApiKey"] as String @@ -33,6 +34,7 @@ internal fun Project.configureAndroidCommonPlugin() { buildConfigField("String", "KAKAO_API_KEY", "\"${kakaoApiKey}\"") buildConfigField("String", "POPHORY_BASE_URL", "\"${pophoryBaseUrl}\"") + buildConfigField("String", "FACEBOOK_APP_ID", "\"${facebookAppId}\"") } buildFeatures.apply { viewBinding = true From 765c3910b7328cde14e5401ad97151a569aa0132 Mon Sep 17 00:00:00 2001 From: HyunWoo Lee Date: Sun, 4 Feb 2024 18:54:47 +0900 Subject: [PATCH 03/10] Define type of navigation --- .../pophory/feature/home/model/RegisterNavigationType.kt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/src/main/java/com/teampophory/pophory/feature/home/model/RegisterNavigationType.kt diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/model/RegisterNavigationType.kt b/app/src/main/java/com/teampophory/pophory/feature/home/model/RegisterNavigationType.kt new file mode 100644 index 00000000..25a00840 --- /dev/null +++ b/app/src/main/java/com/teampophory/pophory/feature/home/model/RegisterNavigationType.kt @@ -0,0 +1,5 @@ +package com.teampophory.pophory.feature.home.model + +enum class RegisterNavigationType { + PICKER, QR, GALLERY; +} From b82a0880d58a94631ea64f8ae372f4cc156a10ed Mon Sep 17 00:00:00 2001 From: HyunWoo Lee Date: Sun, 4 Feb 2024 18:55:45 +0900 Subject: [PATCH 04/10] Apply navigation type when navigate to add photo screen --- .../feature/album/list/AlbumListActivity.kt | 2 +- .../feature/home/add/AddPhotoBottomSheet.kt | 5 ++--- .../feature/home/photo/AddPhotoActivity.kt | 17 ++++++++++++++++- .../feature/home/photo/AddPhotoViewModel.kt | 7 +++++++ .../pophory/feature/home/store/StoreFragment.kt | 1 + 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/teampophory/pophory/feature/album/list/AlbumListActivity.kt b/app/src/main/java/com/teampophory/pophory/feature/album/list/AlbumListActivity.kt index 7503b9c6..c8f03306 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/album/list/AlbumListActivity.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/album/list/AlbumListActivity.kt @@ -49,7 +49,7 @@ class AlbumListActivity : AppCompatActivity() { private val imagePicker = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> if (uri != null) { - val intent = albumItem?.let { AddPhotoActivity.getIntent(this, uri.toString(), it) } + val intent = albumItem?.let { AddPhotoActivity.getIntent(this, uri.toString(), it, "PICKER") } photoCountRefreshLauncher.launch(intent) } } diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/add/AddPhotoBottomSheet.kt b/app/src/main/java/com/teampophory/pophory/feature/home/add/AddPhotoBottomSheet.kt index d19033d4..7edc0ad0 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/add/AddPhotoBottomSheet.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/add/AddPhotoBottomSheet.kt @@ -22,7 +22,6 @@ import com.teampophory.pophory.feature.home.photo.AddPhotoActivity import com.teampophory.pophory.feature.qr.QRActivity class AddPhotoBottomSheet : BottomSheetDialogFragment() { - private val binding by viewBinding(BottomSheetHomeAddPhotoBinding::bind) private val viewModel by activityViewModels() private lateinit var imagePicker: ActivityResultLauncher @@ -44,7 +43,7 @@ class AddPhotoBottomSheet : BottomSheetDialogFragment() { val currentAlbumPosition = viewModel.homeState.value.currentAlbumPosition val albumItem = viewModel.homeState.value.currentAlbums?.getOrNull(currentAlbumPosition) if (uri != null && albumItem != null) { - val intent = AddPhotoActivity.getIntent(context, uri.toString(), albumItem) + val intent = AddPhotoActivity.getIntent(context, uri.toString(), albumItem, "PICKER") addPhotoResultLauncher.launch(intent) } } @@ -57,7 +56,7 @@ class AddPhotoBottomSheet : BottomSheetDialogFragment() { val albumItem = viewModel.homeState.value.currentAlbums?.getOrNull(currentAlbumPosition) if (uriString != null && albumItem != null) { - val intent = AddPhotoActivity.getIntent(context, uriString, albumItem) + val intent = AddPhotoActivity.getIntent(context, uriString, albumItem, "QR") addPhotoResultLauncher.launch(intent) } } diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt index 539f5b94..f2d0c66a 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt @@ -9,12 +9,14 @@ import android.util.Size import androidx.activity.addCallback import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.isVisible import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import coil.load import com.google.android.material.datepicker.CalendarConstraints import com.google.android.material.datepicker.DateValidatorPointBackward import com.google.android.material.datepicker.MaterialDatePicker +import com.teampophory.pophory.BuildConfig import com.teampophory.pophory.R import com.teampophory.pophory.common.context.colorOf import com.teampophory.pophory.common.context.snackBar @@ -26,6 +28,7 @@ import com.teampophory.pophory.common.time.systemNow import com.teampophory.pophory.common.view.setOnSingleClickListener import com.teampophory.pophory.common.view.viewBinding import com.teampophory.pophory.databinding.ActivityAddPhotoBinding +import com.teampophory.pophory.feature.home.model.RegisterNavigationType import com.teampophory.pophory.feature.home.store.model.AlbumItem import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn @@ -157,18 +160,30 @@ class AddPhotoActivity : AppCompatActivity() { binding.txtStudio.setTextColor(colorOf(com.teampophory.pophory.designsystem.R.color.gray_40)) } }.launchIn(lifecycleScope) + viewModel.type + .flowWithLifecycle(lifecycle) + .onEach { + binding.btnShare.isVisible = it != RegisterNavigationType.PICKER + }.launchIn(lifecycleScope) } companion object { private const val IMAGE_URL_EXTRA = "imageUri" const val ALBUM_ITEM_EXTRA = "albumItem" const val IMAGE_MIME_TYPE = "image/*" + private const val TYPE = "type" @JvmStatic - fun getIntent(context: Context, imageUri: String, albumItem: AlbumItem): Intent = + fun getIntent( + context: Context, + imageUri: String, + albumItem: AlbumItem, + type: String + ): Intent = Intent(context, AddPhotoActivity::class.java).apply { putExtra(IMAGE_URL_EXTRA, imageUri) putExtra(ALBUM_ITEM_EXTRA, albumItem) + putExtra(TYPE, type) } } } diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoViewModel.kt b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoViewModel.kt index d760476b..e58d515d 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoViewModel.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoViewModel.kt @@ -11,6 +11,7 @@ import com.teampophory.pophory.domain.repository.photo.PhotoRepository import com.teampophory.pophory.feature.home.photo.model.StudioUiModel import com.teampophory.pophory.feature.home.photo.model.toUiModel import com.teampophory.pophory.feature.home.store.model.AlbumItem +import com.teampophory.pophory.feature.home.model.RegisterNavigationType import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -43,6 +44,12 @@ class AddPhotoViewModel @Inject constructor( private var imageRequestBody: RequestBody? = null private var currentImageSize: Size? = null private var currentFileName: String? = null + private val _type = MutableStateFlow( + RegisterNavigationType.valueOf( + savedStateHandle.get("type").orEmpty() + ) + ) + val type = _type.asStateFlow() private val _createdAt = MutableStateFlow(Instant.systemNow().toEpochMilliseconds()) val createdAt = _createdAt.asStateFlow() private val allStudio = MutableStateFlow>(emptyList()) diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/store/StoreFragment.kt b/app/src/main/java/com/teampophory/pophory/feature/home/store/StoreFragment.kt index 8a4b101c..1a6fb761 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/store/StoreFragment.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/store/StoreFragment.kt @@ -235,6 +235,7 @@ class StoreFragment : Fragment() { context = requireContext(), imageUri = imageUri.toString(), albumItem = albumItem, + type = "GALLERY" ).let(albumListAddPhotoLauncher::launch) } } From 75019244b87d15814b2b0ed1887074c5edae04d9 Mon Sep 17 00:00:00 2001 From: HyunWoo Lee Date: Sun, 4 Feb 2024 18:56:02 +0900 Subject: [PATCH 05/10] Add toolbar item when navigate from gallery, qr --- .../feature/home/photo/AddPhotoActivity.kt | 17 ++++-- .../main/res/layout/activity_add_photo.xml | 53 +++++++++++++++++-- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt index f2d0c66a..156faaf1 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt @@ -66,9 +66,9 @@ class AddPhotoActivity : AppCompatActivity() { private fun loadImageWithAdjustedSize(realImageUri: Uri, adjustedSize: Size) { val (backgroundResource, imageView) = if (adjustedSize.width >= adjustedSize.height) { - Pair(R.drawable.img_background_width, binding.imgHorizontal) + R.drawable.img_background_width to binding.imgHorizontal } else { - Pair(R.drawable.img_background_height, binding.imgVertical) + R.drawable.img_background_height to binding.imgVertical } binding.imgBackground.setImageResource(backgroundResource) imageView.load(realImageUri) { @@ -77,10 +77,10 @@ class AddPhotoActivity : AppCompatActivity() { } private fun initView() { - binding.toolbarAddPhoto.btnBack.setOnClickListener { + binding.btnBack.setOnClickListener { finish() } - binding.toolbarAddPhoto.txtToolbarTitle.text = "사진 추가" + binding.txtToolbarTitle.text = "사진 추가" binding.layoutDate.setOnClickListener { viewModel.onCreatedAtPressed() } @@ -94,6 +94,15 @@ class AddPhotoActivity : AppCompatActivity() { setResult(Activity.RESULT_CANCELED) finish() } + binding.btnShare.setOnSingleClickListener { + val intent = Intent("com.instagram.share.ADD_TO_STORY").apply { + putExtra("source_application", BuildConfig.FACEBOOK_APP_ID) + type = "image/png" + putExtra("interactive_asset_uri", imageUri) + putExtra("top_background_color", "#FF6724") + putExtra("bottom_background_color", "#FF6724") + } + } } private fun subscribeEvent() { diff --git a/app/src/main/res/layout/activity_add_photo.xml b/app/src/main/res/layout/activity_add_photo.xml index 4cd80680..8c4513b6 100644 --- a/app/src/main/res/layout/activity_add_photo.xml +++ b/app/src/main/res/layout/activity_add_photo.xml @@ -5,17 +5,60 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/toolbar"> Date: Sun, 4 Feb 2024 18:59:56 +0900 Subject: [PATCH 06/10] Spotless Apply --- .../pophory/feature/home/model/RegisterNavigationType.kt | 2 +- .../pophory/feature/home/photo/AddPhotoActivity.kt | 2 +- .../pophory/feature/home/photo/AddPhotoViewModel.kt | 6 +++--- .../teampophory/pophory/feature/home/store/StoreFragment.kt | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/model/RegisterNavigationType.kt b/app/src/main/java/com/teampophory/pophory/feature/home/model/RegisterNavigationType.kt index 25a00840..f2c699f9 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/model/RegisterNavigationType.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/model/RegisterNavigationType.kt @@ -1,5 +1,5 @@ package com.teampophory.pophory.feature.home.model enum class RegisterNavigationType { - PICKER, QR, GALLERY; + PICKER, QR, GALLERY } diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt index 156faaf1..3accd4f9 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt @@ -187,7 +187,7 @@ class AddPhotoActivity : AppCompatActivity() { context: Context, imageUri: String, albumItem: AlbumItem, - type: String + type: String, ): Intent = Intent(context, AddPhotoActivity::class.java).apply { putExtra(IMAGE_URL_EXTRA, imageUri) diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoViewModel.kt b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoViewModel.kt index e58d515d..9e6ff52f 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoViewModel.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoViewModel.kt @@ -8,10 +8,10 @@ import com.teampophory.pophory.common.time.systemNow import com.teampophory.pophory.data.model.photo.Studio import com.teampophory.pophory.domain.model.S3Image import com.teampophory.pophory.domain.repository.photo.PhotoRepository +import com.teampophory.pophory.feature.home.model.RegisterNavigationType import com.teampophory.pophory.feature.home.photo.model.StudioUiModel import com.teampophory.pophory.feature.home.photo.model.toUiModel import com.teampophory.pophory.feature.home.store.model.AlbumItem -import com.teampophory.pophory.feature.home.model.RegisterNavigationType import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -46,8 +46,8 @@ class AddPhotoViewModel @Inject constructor( private var currentFileName: String? = null private val _type = MutableStateFlow( RegisterNavigationType.valueOf( - savedStateHandle.get("type").orEmpty() - ) + savedStateHandle.get("type").orEmpty(), + ), ) val type = _type.asStateFlow() private val _createdAt = MutableStateFlow(Instant.systemNow().toEpochMilliseconds()) diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/store/StoreFragment.kt b/app/src/main/java/com/teampophory/pophory/feature/home/store/StoreFragment.kt index 1a6fb761..dc9a1304 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/store/StoreFragment.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/store/StoreFragment.kt @@ -235,7 +235,7 @@ class StoreFragment : Fragment() { context = requireContext(), imageUri = imageUri.toString(), albumItem = albumItem, - type = "GALLERY" + type = "GALLERY", ).let(albumListAddPhotoLauncher::launch) } } From e13bb84141725faf02d9dd7d0e4acb3f72a44568 Mon Sep 17 00:00:00 2001 From: HyunWoo Lee Date: Sun, 4 Feb 2024 19:44:36 +0900 Subject: [PATCH 07/10] Add Bitmap Extenstions --- .../pophory/common/bitmap/BitmapExt.kt | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 core/common/src/main/java/com/teampophory/pophory/common/bitmap/BitmapExt.kt diff --git a/core/common/src/main/java/com/teampophory/pophory/common/bitmap/BitmapExt.kt b/core/common/src/main/java/com/teampophory/pophory/common/bitmap/BitmapExt.kt new file mode 100644 index 00000000..1352bc32 --- /dev/null +++ b/core/common/src/main/java/com/teampophory/pophory/common/bitmap/BitmapExt.kt @@ -0,0 +1,44 @@ +package com.teampophory.pophory.common.bitmap + +import android.content.Context +import android.graphics.Bitmap +import android.media.MediaScannerConnection +import android.net.Uri +import android.os.Environment +import kotlinx.coroutines.suspendCancellableCoroutine +import java.io.File +import kotlin.coroutines.resume + +suspend fun Bitmap.saveToDisk(context: Context): Uri { + val file = File( + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), + "screenshot-${System.currentTimeMillis()}.png", + ) + + file.writeBitmap(this, Bitmap.CompressFormat.PNG, 100) + + return scanFilePath(context, file.path) ?: throw Exception("File could not be saved") +} + +fun File.writeBitmap(bitmap: Bitmap, format: Bitmap.CompressFormat, quality: Int) { + outputStream().use { out -> + bitmap.compress(format, quality, out) + out.flush() + } +} + +suspend fun scanFilePath(context: Context, filePath: String): Uri? { + return suspendCancellableCoroutine { continuation -> + MediaScannerConnection.scanFile( + context, + arrayOf(filePath), + arrayOf("image/png"), + ) { _, scannedUri -> + if (scannedUri == null) { + continuation.cancel(Exception("File $filePath could not be scanned")) + } else { + continuation.resume(scannedUri) + } + } + } +} From 337b5519f911787a401b68757fb33046f64e5915 Mon Sep 17 00:00:00 2001 From: HyunWoo Lee Date: Sun, 4 Feb 2024 19:45:06 +0900 Subject: [PATCH 08/10] Add feature: Share photo to instagram story --- .../feature/home/photo/AddPhotoActivity.kt | 66 ++++++++++++++++--- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt index 3accd4f9..d649d0d8 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt @@ -1,11 +1,18 @@ package com.teampophory.pophory.feature.home.photo import android.app.Activity +import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent +import android.graphics.Bitmap +import android.graphics.Rect import android.net.Uri import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.util.Size +import android.view.PixelCopy +import android.widget.Toast import androidx.activity.addCallback import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -18,6 +25,7 @@ import com.google.android.material.datepicker.DateValidatorPointBackward import com.google.android.material.datepicker.MaterialDatePicker import com.teampophory.pophory.BuildConfig import com.teampophory.pophory.R +import com.teampophory.pophory.common.bitmap.saveToDisk import com.teampophory.pophory.common.context.colorOf import com.teampophory.pophory.common.context.snackBar import com.teampophory.pophory.common.context.toast @@ -33,6 +41,7 @@ import com.teampophory.pophory.feature.home.store.model.AlbumItem import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch import kotlinx.datetime.Instant import java.text.SimpleDateFormat import java.util.Date @@ -95,13 +104,53 @@ class AddPhotoActivity : AppCompatActivity() { finish() } binding.btnShare.setOnSingleClickListener { - val intent = Intent("com.instagram.share.ADD_TO_STORY").apply { - putExtra("source_application", BuildConfig.FACEBOOK_APP_ID) - type = "image/png" - putExtra("interactive_asset_uri", imageUri) - putExtra("top_background_color", "#FF6724") - putExtra("bottom_background_color", "#FF6724") - } + val bitmap = Bitmap.createBitmap( + binding.layoutImage.measuredWidth, + binding.layoutImage.measuredHeight, + Bitmap.Config.ARGB_8888, + ) + val location = IntArray(2) + binding.layoutImage.getLocationInWindow(location) + PixelCopy.request( + window, + Rect( + location[0], + location[1], + location[0] + binding.layoutImage.width, + location[1] + binding.layoutImage.height, + ), + bitmap, + { + if (it == PixelCopy.SUCCESS) { + lifecycleScope.launch { + val shareImageUri = bitmap.saveToDisk(this@AddPhotoActivity) + val intent = Intent("com.instagram.share.ADD_TO_STORY").apply { + putExtra("source_application", BuildConfig.FACEBOOK_APP_ID) + type = "image/png" + putExtra("interactive_asset_uri", shareImageUri) + putExtra("top_background_color", "#000000") + putExtra("bottom_background_color", "#000000") + } + grantUriPermission( + "com.instagram.android", + shareImageUri, + Intent.FLAG_GRANT_READ_URI_PERMISSION, + ) + try { + startActivity(intent) + } catch (e: ActivityNotFoundException) { + Toast.makeText( + this@AddPhotoActivity, + "인스타그램 앱이 존재하지 않습니다.", + Toast.LENGTH_SHORT, + ) + .show() + } + } + } + }, + Handler(Looper.getMainLooper()), + ) } } @@ -124,7 +173,8 @@ class AddPhotoActivity : AppCompatActivity() { .setEnd(Instant.systemNow().toEpochMilliseconds()).build(), ) .setSelection( - currentCreatedAt + TimeZone.getDefault().getOffset(currentCreatedAt), + currentCreatedAt + TimeZone.getDefault() + .getOffset(currentCreatedAt), ) .build() picker.show(supportFragmentManager, "datePicker") From 14850c134d31e01b6c46d0623a85b868b66547bd Mon Sep 17 00:00:00 2001 From: HyunWoo Lee Date: Sun, 4 Feb 2024 19:51:58 +0900 Subject: [PATCH 09/10] Add view capture extension --- .../pophory/common/bitmap/BitmapExt.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/core/common/src/main/java/com/teampophory/pophory/common/bitmap/BitmapExt.kt b/core/common/src/main/java/com/teampophory/pophory/common/bitmap/BitmapExt.kt index 1352bc32..2f1c3ad7 100644 --- a/core/common/src/main/java/com/teampophory/pophory/common/bitmap/BitmapExt.kt +++ b/core/common/src/main/java/com/teampophory/pophory/common/bitmap/BitmapExt.kt @@ -1,13 +1,20 @@ package com.teampophory.pophory.common.bitmap +import android.app.Activity import android.content.Context import android.graphics.Bitmap +import android.graphics.Rect import android.media.MediaScannerConnection import android.net.Uri import android.os.Environment +import android.os.Handler +import android.os.Looper +import android.view.PixelCopy +import android.view.View import kotlinx.coroutines.suspendCancellableCoroutine import java.io.File import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException suspend fun Bitmap.saveToDisk(context: Context): Uri { val file = File( @@ -42,3 +49,22 @@ suspend fun scanFilePath(context: Context, filePath: String): Uri? { } } } + +suspend fun View.capture(activity: Activity) = suspendCancellableCoroutine { continuation -> + val bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888) + val location = IntArray(2) + getLocationInWindow(location) + PixelCopy.request( + activity.window, + Rect(location[0], location[1], location[0] + width, location[1] + height), + bitmap, + { + if (it == PixelCopy.SUCCESS) { + continuation.resume(bitmap) + } else { + continuation.resumeWithException(Exception("Unable to load bitmap from view")) + } + }, + Handler(Looper.getMainLooper()), + ) +} From 90327d1d582c9af38f517081e741a2451a015652 Mon Sep 17 00:00:00 2001 From: HyunWoo Lee Date: Sun, 4 Feb 2024 19:53:41 +0900 Subject: [PATCH 10/10] Refactor instagram share feature --- .../feature/home/photo/AddPhotoActivity.kt | 78 +++++++------------ 1 file changed, 26 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt index d649d0d8..8484bb2e 100644 --- a/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt +++ b/app/src/main/java/com/teampophory/pophory/feature/home/photo/AddPhotoActivity.kt @@ -4,14 +4,9 @@ import android.app.Activity import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent -import android.graphics.Bitmap -import android.graphics.Rect import android.net.Uri import android.os.Bundle -import android.os.Handler -import android.os.Looper import android.util.Size -import android.view.PixelCopy import android.widget.Toast import androidx.activity.addCallback import androidx.activity.viewModels @@ -25,6 +20,7 @@ import com.google.android.material.datepicker.DateValidatorPointBackward import com.google.android.material.datepicker.MaterialDatePicker import com.teampophory.pophory.BuildConfig import com.teampophory.pophory.R +import com.teampophory.pophory.common.bitmap.capture import com.teampophory.pophory.common.bitmap.saveToDisk import com.teampophory.pophory.common.context.colorOf import com.teampophory.pophory.common.context.snackBar @@ -104,53 +100,31 @@ class AddPhotoActivity : AppCompatActivity() { finish() } binding.btnShare.setOnSingleClickListener { - val bitmap = Bitmap.createBitmap( - binding.layoutImage.measuredWidth, - binding.layoutImage.measuredHeight, - Bitmap.Config.ARGB_8888, - ) - val location = IntArray(2) - binding.layoutImage.getLocationInWindow(location) - PixelCopy.request( - window, - Rect( - location[0], - location[1], - location[0] + binding.layoutImage.width, - location[1] + binding.layoutImage.height, - ), - bitmap, - { - if (it == PixelCopy.SUCCESS) { - lifecycleScope.launch { - val shareImageUri = bitmap.saveToDisk(this@AddPhotoActivity) - val intent = Intent("com.instagram.share.ADD_TO_STORY").apply { - putExtra("source_application", BuildConfig.FACEBOOK_APP_ID) - type = "image/png" - putExtra("interactive_asset_uri", shareImageUri) - putExtra("top_background_color", "#000000") - putExtra("bottom_background_color", "#000000") - } - grantUriPermission( - "com.instagram.android", - shareImageUri, - Intent.FLAG_GRANT_READ_URI_PERMISSION, - ) - try { - startActivity(intent) - } catch (e: ActivityNotFoundException) { - Toast.makeText( - this@AddPhotoActivity, - "인스타그램 앱이 존재하지 않습니다.", - Toast.LENGTH_SHORT, - ) - .show() - } - } - } - }, - Handler(Looper.getMainLooper()), - ) + lifecycleScope.launch { + val bitmap = binding.layoutImage.capture(this@AddPhotoActivity) + val shareImageUri = bitmap.saveToDisk(this@AddPhotoActivity) + val intent = Intent("com.instagram.share.ADD_TO_STORY").apply { + putExtra("source_application", BuildConfig.FACEBOOK_APP_ID) + type = "image/png" + putExtra("interactive_asset_uri", shareImageUri) + putExtra("top_background_color", "#000000") + putExtra("bottom_background_color", "#000000") + } + grantUriPermission( + "com.instagram.android", + shareImageUri, + Intent.FLAG_GRANT_READ_URI_PERMISSION, + ) + try { + startActivity(intent) + } catch (e: ActivityNotFoundException) { + Toast.makeText( + this@AddPhotoActivity, + "인스타그램 앱이 존재하지 않습니다.", + Toast.LENGTH_SHORT, + ).show() + } + } } }