Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/#75 : 2nd qa #76

Merged
merged 9 commits into from
Sep 6, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ class NotificationActionFragment : BindingFragment<FragmentNotificationVpBinding
viewModel.getNotifications().collectLatest { pagingData ->
notificationAdapter.submitData(pagingData)
}
viewModel.patchCheck()
}
viewModel.patchCheck()
}

private fun setEmptyLayout() = with(binding) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class NotificationActionViewHolder(

init {
binding.root.setOnClickListener {
if (this::item.isInitialized) onNotificationClick(item, adapterPosition)
if (this::item.isInitialized) onNotificationClick(item, absoluteAdapterPosition)
}

binding.ivNotificationVpProfile.setOnClickListener {
Expand Down Expand Up @@ -141,12 +141,17 @@ class NotificationActionViewHolder(
}

private fun getSpannablePopularText(name: String, data: NotificationActionModel): SpannableStringBuilder {
val popularText = name + getPopularContent(data.notificationText)
val popularText = if (data.notificationText.isNotEmpty()) {
"$name\n: ${cutContentMaxLen(data.notificationText)}"
} else {
name
}

val spannablePopularText = SpannableStringBuilder(popularText)
spannablePopularText.setSpan(
StyleSpan(com.teamwable.ui.R.font.font_pretendard_semibold),
0,
name.replace("\n: ", "").length,
name.length - 1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
return spannablePopularText
Expand Down Expand Up @@ -220,20 +225,20 @@ class NotificationActionViewHolder(
binding.root.context.getString(resId)
}

return if (data.notificationTriggerType in listOf(
return if ((data.notificationTriggerType in listOf(
binding.root.context.stringOf(NotificationActionType.CONTENT_LIKED.title),
binding.root.context.stringOf(NotificationActionType.COMMENT.title),
binding.root.context.stringOf(NotificationActionType.COMMENT_LIKED.title),
binding.root.context.stringOf(NotificationActionType.POPULAR_WRITER.title)
)
)) && data.notificationText.isNotBlank()
) {
"$name$resourceString\n: ${getPopularContent(data.notificationText)}"
"$name$resourceString\n: ${cutContentMaxLen(data.notificationText)}"
} else {
"$name$resourceString"
}
}

private fun getPopularContent(notificationText: String): String {
private fun cutContentMaxLen(notificationText: String): String {
return if (notificationText.length > MAX_LEN) {
notificationText.substring(0, MAX_LEN) + binding.root.context.stringOf(R.string.tv_notification_action_more)
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class NotificationInformationViewHolder(

init {
binding.root.setOnClickListener {
if (this::item.isInitialized) click(item, adapterPosition)
if (this::item.isInitialized) click(item, absoluteAdapterPosition)
}
}

Expand Down
2 changes: 1 addition & 1 deletion feature/notification/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
<string name="tv_notification_action_comment_ghost">님, 작성하신 댓글로 인해 점점 투명해지고 있어요.</string>
<string name="tv_notification_action_user_ban">님, 커뮤니티 활동 정책 위반으로 더 이상 와블을 이용할 수 없어요. 자세한 내용은 문의 사항으로 남겨주세요.</string>
<string name="tv_notification_action_popular_writer">님 이 작성하신 글이 인기글로 선정되었어요!\uD83E\uDD73\</string>
<string name="tv_notification_action_popular_content">어제 가장 인기있던 글이에요.\n: </string>
<string name="tv_notification_action_popular_content">어제 가장 인기있던 글이에요.</string>
<string name="tv_notification_action_more">...</string>

<!-- fragment_notification_information -->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.teamwable.posting

import android.Manifest
import android.content.Context
import android.content.res.ColorStateList
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.text.InputFilter
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.PickVisualMediaRequest
Expand All @@ -24,7 +25,6 @@ import com.teamwable.ui.base.BindingFragment
import com.teamwable.ui.component.TwoButtonDialog
import com.teamwable.ui.extensions.colorOf
import com.teamwable.ui.extensions.setOnDuplicateBlockClick
import com.teamwable.ui.extensions.showPermissionAppSettingsDialog
import com.teamwable.ui.extensions.viewLifeCycle
import com.teamwable.ui.extensions.viewLifeCycleScope
import com.teamwable.ui.type.DialogType
Expand All @@ -34,7 +34,6 @@ import com.teamwable.ui.util.BundleKey.POSTING_RESULT
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import timber.log.Timber

@AndroidEntryPoint
class PostingFragment : BindingFragment<FragmentPostingBinding>(FragmentPostingBinding::inflate) {
Expand All @@ -46,26 +45,6 @@ class PostingFragment : BindingFragment<FragmentPostingBinding>(FragmentPostingB

private lateinit var getGalleryLauncher: ActivityResultLauncher<String>
private lateinit var getPhotoPickerLauncher: ActivityResultLauncher<PickVisualMediaRequest>
private val requestPermissions =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
when (isGranted) {
true -> {
try {
selectImage()
} catch (e: Exception) {
Timber.tag("posting_fragment").e("에러 : ${e.message}")
}
}

false -> handlePermissionDenied()
}
}

private fun handlePermissionDenied() {
if (!shouldShowRequestPermissionRationale(Manifest.permission.READ_MEDIA_IMAGES)) {
context?.showPermissionAppSettingsDialog()
}
}

override fun initView() {
showKeyboard()
Expand All @@ -85,7 +64,9 @@ class PostingFragment : BindingFragment<FragmentPostingBinding>(FragmentPostingB

private val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
TwoButtonDialog.Companion.show(requireContext(), findNavController(), DialogType.CANCEL_POSTING)
if (!(binding.etPostingTitle.text.isEmpty() && binding.etPostingContent.text.isEmpty() && viewModel.photoUri.value.isNullOrBlank()))
TwoButtonDialog.Companion.show(requireContext(), findNavController(), DialogType.CANCEL_POSTING)
else findNavController().popBackStack()
}
}

Expand Down Expand Up @@ -123,19 +104,8 @@ class PostingFragment : BindingFragment<FragmentPostingBinding>(FragmentPostingB

private fun initPhotoBtnClickListener() = with(binding) {
ivPostingPhotoBtn.setOnClickListener {
getGalleryPermission()
showKeyboard()
}
}

private fun getGalleryPermission() {
// api 34 이상인 경우
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
selectImage()
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermissions.launch(Manifest.permission.READ_MEDIA_IMAGES)
} else {
requestPermissions.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
showKeyboard()
}
}

Expand Down Expand Up @@ -181,7 +151,9 @@ class PostingFragment : BindingFragment<FragmentPostingBinding>(FragmentPostingB

private fun initBackBtnClickListener() {
binding.ivPostingAppbarBack.setOnClickListener {
TwoButtonDialog.Companion.show(requireContext(), findNavController(), DialogType.CANCEL_POSTING)
if (!(binding.etPostingTitle.text.isEmpty() && binding.etPostingContent.text.isEmpty() && viewModel.photoUri.value.isNullOrBlank()))
TwoButtonDialog.Companion.show(requireContext(), findNavController(), DialogType.CANCEL_POSTING)
else findNavController().popBackStack()
}
}

Expand All @@ -196,18 +168,27 @@ class PostingFragment : BindingFragment<FragmentPostingBinding>(FragmentPostingB
etPostingTitle.doAfterTextChanged {
isTitleNull = etPostingTitle.text.isNullOrBlank()
totalTitleLength = etPostingTitle.text.length

handleUploadProgressAndBtn(isTitleNull, totalTitleLength, totalContentLength)
setEditTextMaxLen(etPostingContent, totalTitleLength)
}
etPostingContent.doAfterTextChanged {
totalContentLength = etPostingContent.text.length

handleUploadProgressAndBtn(isTitleNull, totalTitleLength, totalContentLength)
setEditTextMaxLen(etPostingTitle, totalContentLength)
}
}
}

private fun setEditTextMaxLen(view: EditText, totalViewLen: Int) {
val contentMaxLength = POSTING_MAX - totalViewLen
view.filters = arrayOf(InputFilter.LengthFilter(contentMaxLength.coerceAtLeast(0)))
}

private fun handleUploadProgressAndBtn(isTitleNull: Boolean, totalTitleLength: Int, totalContentLength: Int) {
when {
(!isTitleNull && (totalTitleLength + totalContentLength) <= POSTING_MAX) -> {
(!isTitleNull && (totalTitleLength + totalContentLength) <= POSTING_MAX - 1) -> {
updateProgress(
com.teamwable.ui.R.color.gray_600,
com.teamwable.ui.R.color.purple_50,
Expand All @@ -218,7 +199,7 @@ class PostingFragment : BindingFragment<FragmentPostingBinding>(FragmentPostingB
}
}

(totalTitleLength + totalContentLength) >= POSTING_MAX + 1 -> {
(totalTitleLength + totalContentLength) >= POSTING_MAX -> {
updateProgress(
com.teamwable.ui.R.color.error,
com.teamwable.ui.R.color.gray_200,
Expand Down Expand Up @@ -280,6 +261,6 @@ class PostingFragment : BindingFragment<FragmentPostingBinding>(FragmentPostingB
}

companion object {
const val POSTING_MAX = 499
const val POSTING_MAX = 500
}
}
4 changes: 3 additions & 1 deletion feature/posting/src/main/res/layout/fragment_posting.xml
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,13 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:hint="@string/hint_posting_title"
android:maxLength="500"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.Wable.Head1"
android:textColor="@color/black"
android:textColorHint="@color/gray_700"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/dummy" />

<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/iv_posting_photo"
Expand Down
2 changes: 1 addition & 1 deletion feature/posting/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
<string name="hint_posting_content">본문은 생략이 가능해요</string>
<string name="tv_posting_progress_base">0/500</string>
<string name="btn_posting_upload">게시</string>
<string name="tv_posting_progress_count">(%1$d/500)</string>
<string name="tv_posting_progress_count">%1$d/500</string>

</resources>