From e3f45ddaa47dc16a5c54d0d7e286ca50ff4ab6ef Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Sat, 28 Sep 2024 18:37:11 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[FEATURE]=20=EB=A7=81=ED=81=AC=20=EB=B3=B5?= =?UTF-8?q?=EC=82=AC=20=ED=9B=84=20=ED=99=88=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=A7=84=EC=9E=85=EC=8B=9C=20=EB=B3=B5=EC=82=AC=ED=95=9C=20?= =?UTF-8?q?=EB=A7=81=ED=81=AC=20=EC=B6=94=EA=B0=80=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99=ED=95=98=EB=8A=94=20toa?= =?UTF-8?q?st=20=ED=91=9C=EC=8B=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=8F=20PokitToast=EC=9D=98=20=EC=B5=9C?= =?UTF-8?q?=EB=8C=80=20line=EC=88=98=EB=A5=BC=202=EB=A1=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/pokitmons/pokit/MainActivity.kt | 22 +++++++++++++ .../pokit/navigation/RootDestination.kt | 7 ++++- .../pokitmons/pokit/navigation/RootNavHost.kt | 8 +---- .../components/block/pokittoast/PokitToast.kt | 3 ++ .../java/pokitmons/pokit/home/HomeScreen.kt | 22 +++++++++++-- .../pokit/home/model/ClipboardLinkManager.kt | 31 +++++++++++++++++++ .../pokit/home/model/LinkAddToastMessage.kt | 3 ++ .../pokit/home/pokit/PokitViewModel.kt | 18 +++++++++++ feature/home/src/main/res/values/strings.xml | 1 + 9 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt create mode 100644 feature/home/src/main/java/pokitmons/pokit/home/model/LinkAddToastMessage.kt diff --git a/app/src/main/java/pokitmons/pokit/MainActivity.kt b/app/src/main/java/pokitmons/pokit/MainActivity.kt index 8bf0ce26..21b09f3d 100644 --- a/app/src/main/java/pokitmons/pokit/MainActivity.kt +++ b/app/src/main/java/pokitmons/pokit/MainActivity.kt @@ -1,5 +1,7 @@ package pokitmons.pokit +import android.content.ClipboardManager +import android.os.Build import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent @@ -22,6 +24,7 @@ import androidx.navigation.compose.rememberNavController import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import pokitmons.pokit.core.ui.theme.PokitTheme +import pokitmons.pokit.home.model.ClipboardLinkManager import pokitmons.pokit.navigation.RootNavHost @AndroidEntryPoint @@ -55,6 +58,25 @@ class MainActivity : ComponentActivity() { } } } + + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus) + + if (hasFocus) { + val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager + clipboardManager.primaryClip?.let { clipData -> + if (clipData.itemCount == 0) return@let + val clipboardTextData = clipData.getItemAt(0).text.toString() + + if (!ClipboardLinkManager.checkUrlIsValid(clipboardTextData)) return@let + + ClipboardLinkManager.setClipboardLink(clipboardTextData) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + clipboardManager.clearPrimaryClip() + } + } + } + } } @Composable diff --git a/app/src/main/java/pokitmons/pokit/navigation/RootDestination.kt b/app/src/main/java/pokitmons/pokit/navigation/RootDestination.kt index aa7f1bb6..bc3d68e3 100644 --- a/app/src/main/java/pokitmons/pokit/navigation/RootDestination.kt +++ b/app/src/main/java/pokitmons/pokit/navigation/RootDestination.kt @@ -30,11 +30,16 @@ object Home { object AddLink { val route: String = "addLink" val linkIdArg = "link_id" - val routeWithArgs = "$route?$linkIdArg={$linkIdArg}" + val linkUrl = "link_url" + val routeWithArgs = "$route?$linkIdArg={$linkIdArg}&$linkUrl={${linkUrl}}" var arguments = listOf( navArgument(linkIdArg) { nullable = true type = NavType.StringType + }, + navArgument(linkUrl) { + nullable = true + type = NavType.StringType } ) } diff --git a/app/src/main/java/pokitmons/pokit/navigation/RootNavHost.kt b/app/src/main/java/pokitmons/pokit/navigation/RootNavHost.kt index 238f3b8a..3ea5bfed 100644 --- a/app/src/main/java/pokitmons/pokit/navigation/RootNavHost.kt +++ b/app/src/main/java/pokitmons/pokit/navigation/RootNavHost.kt @@ -1,8 +1,6 @@ package pokitmons.pokit.navigation import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -93,10 +91,6 @@ fun RootNavHost( ) } - composable(Home.route) { - Box(modifier = Modifier.fillMaxSize()) - } - composable( route = AddLink.routeWithArgs, arguments = AddLink.arguments @@ -187,7 +181,7 @@ fun RootNavHost( "${PokitDetail.route}/$pokitId?${PokitDetail.pokitCountQuery}=$linkCount" ) }, - onNavigateAddLink = { navHostController.navigate(AddLink.route) }, + onNavigateAddLink = { navHostController.navigate("${AddLink.route}?${AddLink.linkUrl}=$it") }, onNavigateAddPokit = { navHostController.navigate(AddPokit.route) }, onNavigateToLinkModify = { navHostController.navigate("${AddLink.route}?${AddLink.linkIdArg}=$it") }, onNavigateToPokitModify = { navHostController.navigate("${AddPokit.route}?${AddPokit.pokitIdArg}=$it") }, diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokittoast/PokitToast.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokittoast/PokitToast.kt index 494115cf..550a4009 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokittoast/PokitToast.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokittoast/PokitToast.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.R import pokitmons.pokit.core.ui.theme.PokitTheme @@ -41,6 +42,8 @@ fun PokitToast( Text( text = text, style = PokitTheme.typography.body3Medium.copy(color = PokitTheme.colors.inverseWh), + maxLines = 2, + overflow = TextOverflow.Ellipsis, modifier = Modifier.weight(1f) ) diff --git a/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt b/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt index ab29eac8..bfa97b10 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt @@ -52,7 +52,7 @@ fun HomeScreen( onNavigateToPokitDetail: (String, Int) -> Unit, onNavigateToSearch: () -> Unit, onNavigateToSetting: () -> Unit, - onNavigateAddLink: () -> Unit, + onNavigateAddLink: (String?) -> Unit, onNavigateAddPokit: () -> Unit, onNavigateToLinkModify: (String) -> Unit, onNavigateToPokitModify: (String) -> Unit, @@ -63,6 +63,7 @@ fun HomeScreen( var showBottomSheet by remember { mutableStateOf(false) } val toastMessage by viewModel.toastMessage.collectAsState() + val copiedLinkToastMessage by viewModel.copiedLinkUrl.collectAsState() viewModel.sideEffect.collectAsEffect { homeSideEffect: HomeSideEffect -> when (homeSideEffect) { @@ -102,7 +103,7 @@ fun HomeScreen( scope.launch { sheetState.hide() showBottomSheet = false - onNavigateAddLink() + onNavigateAddLink(null) } }, verticalArrangement = Arrangement.Center, @@ -171,7 +172,7 @@ fun HomeScreen( onNavigateToAlarm = onNavigateToAlarm ) Scaffold( - bottomBar = { BottomNavigationBar() } + bottomBar = { BottomNavigationBar(viewModel) } ) { padding -> Box { when (viewModel.screenType.value) { @@ -203,6 +204,21 @@ fun HomeScreen( onClickClose = viewModel::closeToastMessage ) } + + copiedLinkToastMessage?.linkUrl?.let { linkUrl -> + PokitToast( + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(padding) + .padding(start = 12.dp, end = 12.dp, bottom = 48.dp), + text = stringResource(id = pokitmons.pokit.home.R.string.toast_add_copied_link, linkUrl), + onClickClose = viewModel::closeLinkAddToastMessage, + onClick = { + viewModel.closeLinkAddToastMessage() + onNavigateAddLink(linkUrl) + } + ) + } } } } diff --git a/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt b/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt new file mode 100644 index 00000000..d1579668 --- /dev/null +++ b/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt @@ -0,0 +1,31 @@ +package pokitmons.pokit.home.model + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import pokitmons.pokit.core.feature.flow.EventFlow +import pokitmons.pokit.core.feature.flow.MutableEventFlow +import pokitmons.pokit.core.feature.flow.asEventFlow +import java.util.Locale +import java.util.regex.Pattern + +object ClipboardLinkManager { + private val _clipboardLinkUrl : MutableEventFlow = MutableEventFlow() + val clipboardLinkUrl : EventFlow = _clipboardLinkUrl.asEventFlow() + + fun setClipboardLink(linkUrl: String) { + CoroutineScope(Dispatchers.IO).launch { + _clipboardLinkUrl.emit(linkUrl) + } + } + + fun checkUrlIsValid(url: String) : Boolean { + val urlPattern = ("^(http://|https://)?[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,5}" + + "(:[0-9]{1,5})?(/.*)?$") + + val pattern = Pattern.compile(urlPattern) + val matcher = pattern.matcher(url.lowercase(Locale.getDefault())) + + return matcher.matches() + } +} diff --git a/feature/home/src/main/java/pokitmons/pokit/home/model/LinkAddToastMessage.kt b/feature/home/src/main/java/pokitmons/pokit/home/model/LinkAddToastMessage.kt new file mode 100644 index 00000000..723296a9 --- /dev/null +++ b/feature/home/src/main/java/pokitmons/pokit/home/model/LinkAddToastMessage.kt @@ -0,0 +1,3 @@ +package pokitmons.pokit.home.model + +data class LinkAddToastMessage(val linkUrl: String) diff --git a/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitViewModel.kt b/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitViewModel.kt index dfe94ae6..4da93d56 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitViewModel.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/pokit/PokitViewModel.kt @@ -30,8 +30,10 @@ import pokitmons.pokit.domain.usecase.link.SetBookmarkUseCase import pokitmons.pokit.domain.usecase.pokit.DeletePokitUseCase import pokitmons.pokit.domain.usecase.pokit.GetPokitCountUseCase import pokitmons.pokit.domain.usecase.pokit.GetPokitsUseCase +import pokitmons.pokit.home.model.ClipboardLinkManager import pokitmons.pokit.home.model.HomeSideEffect import pokitmons.pokit.home.model.HomeToastMessage +import pokitmons.pokit.home.model.LinkAddToastMessage import javax.inject.Inject import kotlin.math.max import com.strayalpaca.pokitdetail.model.Link as DetailLink @@ -54,6 +56,9 @@ class PokitViewModel @Inject constructor( private val _toastMessage = MutableStateFlow(null) val toastMessage = _toastMessage.asStateFlow() + private val _copiedLinkUrlToastMessage = MutableStateFlow(null) + val copiedLinkUrl = _copiedLinkUrlToastMessage.asStateFlow() + private fun initLinkUpdateEventDetector() { viewModelScope.launch { LinkUpdateEvent.updatedLink.collectLatest { updatedLink -> @@ -94,6 +99,14 @@ class PokitViewModel @Inject constructor( } } + private fun initClipboardLinkUrlDetector() { + viewModelScope.launch { + ClipboardLinkManager.clipboardLinkUrl.collectLatest { linkUrl -> + _copiedLinkUrlToastMessage.update { LinkAddToastMessage(linkUrl) } + } + } + } + private fun initPokitUpdateEventDetector() { viewModelScope.launch { PokitUpdateEvent.updatedPokit.collectLatest { updatedPokit -> @@ -225,6 +238,7 @@ class PokitViewModel @Inject constructor( initLinkAddEventDetector() initPokitAddEventDetector() initLinkRemoveEventDetector() + initClipboardLinkUrlDetector() loadUnCategoryLinks() loadPokits() @@ -309,6 +323,10 @@ class PokitViewModel @Inject constructor( _toastMessage.update { null } } + fun closeLinkAddToastMessage() { + _copiedLinkUrlToastMessage.update { null } + } + fun showLinkOptionBottomSheet(link: DetailLink) { _linkOptionBottomSheetType.update { BottomSheetType.MODIFY } _currentSelectedLink.update { link } diff --git a/feature/home/src/main/res/values/strings.xml b/feature/home/src/main/res/values/strings.xml index b98ddae5..0ddade75 100644 --- a/feature/home/src/main/res/values/strings.xml +++ b/feature/home/src/main/res/values/strings.xml @@ -2,4 +2,5 @@ home 최대 30개의 포킷을 생성할 수 있습니다.\n포킷을 삭제한 뒤에 추가해주세요. + 복사한 링크 저장하기\n%s \ No newline at end of file From c59582fef38450f8ded73bfed98238c62362f080 Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Sat, 28 Sep 2024 18:38:17 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[FIX]=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=97=90=EC=84=9C=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=EC=8B=9C=20=ED=99=94=EB=A9=B4=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=EA=B0=80=202=EB=B2=88?= =?UTF-8?q?=20=EC=88=98=ED=96=89=EB=90=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/pokitmons/pokit/login/LoginScreen.kt | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/feature/login/src/main/java/pokitmons/pokit/login/LoginScreen.kt b/feature/login/src/main/java/pokitmons/pokit/login/LoginScreen.kt index 2edf16b7..4314f6d3 100644 --- a/feature/login/src/main/java/pokitmons/pokit/login/LoginScreen.kt +++ b/feature/login/src/main/java/pokitmons/pokit/login/LoginScreen.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope @@ -47,20 +48,23 @@ fun LoginScreen( val coroutineScope = rememberCoroutineScope() // TODO 리팩토링 - when (loginState) { - is LoginState.Init -> Unit - is LoginState.Login -> { - loginViewModel.changeState() - onNavigateToTermsOfServiceScreen() + LaunchedEffect(loginState) { + when (loginState) { + is LoginState.Init -> Unit + is LoginState.Login -> { + loginViewModel.changeState() + onNavigateToTermsOfServiceScreen() + } + is LoginState.Registered -> { + loginViewModel.changeState() + onNavigateToHomeScreen() + } + is LoginState.Failed -> loginViewModel.setVisible(true) + is LoginState.AutoLogin -> onNavigateToHomeScreen() } - is LoginState.Registered -> { - loginViewModel.changeState() - onNavigateToHomeScreen() - } - is LoginState.Failed -> loginViewModel.setVisible(true) - is LoginState.AutoLogin -> onNavigateToHomeScreen() } + Box( modifier = Modifier .background(color = PokitTheme.colors.backgroundBase) From 64f5f097ac48a5e91f523c829936dd60730d7433 Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Sat, 28 Sep 2024 18:45:12 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[FEATURE]=20=ED=99=88=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B3=B5=EC=82=AC=EB=90=9C=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EC=B6=94=EA=B0=80=20=ED=86=A0=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20=ED=86=B5=ED=95=B4=20=EB=A7=81=ED=81=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=99=94=EB=A9=B4=20=EC=A7=84=EC=9E=85=EC=8B=9C,=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EB=A7=81=ED=81=AC=20url=EB=A1=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/strayalpaca/addlink/AddLinkViewModel.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/feature/addlink/src/main/java/com/strayalpaca/addlink/AddLinkViewModel.kt b/feature/addlink/src/main/java/com/strayalpaca/addlink/AddLinkViewModel.kt index 327c3395..fc031bdb 100644 --- a/feature/addlink/src/main/java/com/strayalpaca/addlink/AddLinkViewModel.kt +++ b/feature/addlink/src/main/java/com/strayalpaca/addlink/AddLinkViewModel.kt @@ -85,6 +85,7 @@ class AddLinkViewModel @Inject constructor( val memo: StateFlow = _memo.asStateFlow() val currentLinkId: Int? = savedStateHandle.get("link_id")?.toIntOrNull() + private val copiedLinkUrl: String? = savedStateHandle.get("link_url") // 수정 이전 pokit과 수정 이후 pokit이 다른 경우를 체크하기 위해서만 사용 private var prevPokitId: Int? = null @@ -97,6 +98,10 @@ class AddLinkViewModel @Inject constructor( } else { loadUncategorizedPokit() } + + copiedLinkUrl?.let { url -> + inputLinkUrl(url) + } } private fun initPokitAddEventDetector() { From 8785dcd05bdbfc9afbb38cae548edfe75baf2782 Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Sat, 28 Sep 2024 18:49:27 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[CHORE]=20ktlint=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pokitmons/pokit/navigation/RootDestination.kt | 2 +- .../pokit/home/model/ClipboardLinkManager.kt | 12 +++++++----- .../main/java/pokitmons/pokit/login/LoginScreen.kt | 1 - 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/pokitmons/pokit/navigation/RootDestination.kt b/app/src/main/java/pokitmons/pokit/navigation/RootDestination.kt index bc3d68e3..f2b1a432 100644 --- a/app/src/main/java/pokitmons/pokit/navigation/RootDestination.kt +++ b/app/src/main/java/pokitmons/pokit/navigation/RootDestination.kt @@ -31,7 +31,7 @@ object AddLink { val route: String = "addLink" val linkIdArg = "link_id" val linkUrl = "link_url" - val routeWithArgs = "$route?$linkIdArg={$linkIdArg}&$linkUrl={${linkUrl}}" + val routeWithArgs = "$route?$linkIdArg={$linkIdArg}&$linkUrl={$linkUrl}" var arguments = listOf( navArgument(linkIdArg) { nullable = true diff --git a/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt b/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt index d1579668..42550dc1 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt @@ -10,8 +10,8 @@ import java.util.Locale import java.util.regex.Pattern object ClipboardLinkManager { - private val _clipboardLinkUrl : MutableEventFlow = MutableEventFlow() - val clipboardLinkUrl : EventFlow = _clipboardLinkUrl.asEventFlow() + private val _clipboardLinkUrl: MutableEventFlow = MutableEventFlow() + val clipboardLinkUrl: EventFlow = _clipboardLinkUrl.asEventFlow() fun setClipboardLink(linkUrl: String) { CoroutineScope(Dispatchers.IO).launch { @@ -19,9 +19,11 @@ object ClipboardLinkManager { } } - fun checkUrlIsValid(url: String) : Boolean { - val urlPattern = ("^(http://|https://)?[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,5}" - + "(:[0-9]{1,5})?(/.*)?$") + fun checkUrlIsValid(url: String): Boolean { + val urlPattern = ( + "^(http://|https://)?[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,5}" + + "(:[0-9]{1,5})?(/.*)?$" + ) val pattern = Pattern.compile(urlPattern) val matcher = pattern.matcher(url.lowercase(Locale.getDefault())) diff --git a/feature/login/src/main/java/pokitmons/pokit/login/LoginScreen.kt b/feature/login/src/main/java/pokitmons/pokit/login/LoginScreen.kt index 4314f6d3..e37585dc 100644 --- a/feature/login/src/main/java/pokitmons/pokit/login/LoginScreen.kt +++ b/feature/login/src/main/java/pokitmons/pokit/login/LoginScreen.kt @@ -64,7 +64,6 @@ fun LoginScreen( } } - Box( modifier = Modifier .background(color = PokitTheme.colors.backgroundBase) From cb98dc8b32a5b9dcbaedacbfe766883a2fd26d50 Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Mon, 30 Sep 2024 19:32:34 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[FIX]=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=82=B4=EC=9A=A9=20=EB=B0=98=EC=98=81=20-=20url?= =?UTF-8?q?=EB=A7=81=ED=81=AC=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=EC=8B=9C=20=EC=A1=B0=EA=B1=B4=20=EB=8B=A8=EC=88=9C?= =?UTF-8?q?=ED=99=94=20-=20SDK=2027=20=EC=9D=B4=ED=95=98=EC=9D=BC=20?= =?UTF-8?q?=EB=95=8C=20=ED=81=B4=EB=A6=BD=EB=B3=B4=EB=93=9C=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=20=EB=88=84=EB=9D=BD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/pokitmons/pokit/MainActivity.kt | 4 ++++ .../pokit/home/model/ClipboardLinkManager.kt | 23 ++++++------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/pokitmons/pokit/MainActivity.kt b/app/src/main/java/pokitmons/pokit/MainActivity.kt index 21b09f3d..3c78fe92 100644 --- a/app/src/main/java/pokitmons/pokit/MainActivity.kt +++ b/app/src/main/java/pokitmons/pokit/MainActivity.kt @@ -1,5 +1,6 @@ package pokitmons.pokit +import android.content.ClipData import android.content.ClipboardManager import android.os.Build import android.os.Bundle @@ -73,6 +74,9 @@ class MainActivity : ComponentActivity() { ClipboardLinkManager.setClipboardLink(clipboardTextData) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { clipboardManager.clearPrimaryClip() + } else { + val emptyClip = ClipData.newPlainText("", "") + clipboardManager.setPrimaryClip(emptyClip) } } } diff --git a/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt b/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt index 42550dc1..e53f1ff5 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/model/ClipboardLinkManager.kt @@ -2,16 +2,14 @@ package pokitmons.pokit.home.model import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch -import pokitmons.pokit.core.feature.flow.EventFlow -import pokitmons.pokit.core.feature.flow.MutableEventFlow -import pokitmons.pokit.core.feature.flow.asEventFlow -import java.util.Locale -import java.util.regex.Pattern object ClipboardLinkManager { - private val _clipboardLinkUrl: MutableEventFlow = MutableEventFlow() - val clipboardLinkUrl: EventFlow = _clipboardLinkUrl.asEventFlow() + private val _clipboardLinkUrl: MutableSharedFlow = MutableSharedFlow() + val clipboardLinkUrl: SharedFlow = _clipboardLinkUrl.asSharedFlow() fun setClipboardLink(linkUrl: String) { CoroutineScope(Dispatchers.IO).launch { @@ -20,14 +18,7 @@ object ClipboardLinkManager { } fun checkUrlIsValid(url: String): Boolean { - val urlPattern = ( - "^(http://|https://)?[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,5}" + - "(:[0-9]{1,5})?(/.*)?$" - ) - - val pattern = Pattern.compile(urlPattern) - val matcher = pattern.matcher(url.lowercase(Locale.getDefault())) - - return matcher.matches() + val isValidUrl = url.startsWith("http://") || url.startsWith("https://") + return isValidUrl } }