Skip to content
Snippets Groups Projects
Commit 7333cb83 authored by Taras's avatar Taras
Browse files

Change create post to BottomSheetDialogFragment

parent 52f25773
No related branches found
No related tags found
No related merge requests found
package org.futo.circles.feature.timeline.post.create package org.futo.circles.feature.timeline.post.create
import android.app.Dialog
import android.content.Context import android.content.Context
import android.content.DialogInterface
import android.graphics.Color
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.futo.circles.R import org.futo.circles.R
import org.futo.circles.core.base.NetworkObserver import org.futo.circles.core.base.NetworkObserver
import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
import org.futo.circles.core.extensions.navigateSafe import org.futo.circles.core.extensions.navigateSafe
import org.futo.circles.core.extensions.observeData import org.futo.circles.core.extensions.observeData
import org.futo.circles.core.extensions.showError import org.futo.circles.core.extensions.showError
...@@ -23,17 +30,13 @@ import org.futo.circles.core.model.TextContent ...@@ -23,17 +30,13 @@ import org.futo.circles.core.model.TextContent
import org.futo.circles.databinding.DialogFragmentCreatePostBinding import org.futo.circles.databinding.DialogFragmentCreatePostBinding
import org.futo.circles.feature.timeline.post.emoji.EmojiPickerListener import org.futo.circles.feature.timeline.post.emoji.EmojiPickerListener
import org.futo.circles.model.CreatePostContent import org.futo.circles.model.CreatePostContent
import java.util.*
@AndroidEntryPoint @AndroidEntryPoint
class CreatePostDialogFragment : class CreatePostDialogFragment : BottomSheetDialogFragment(), PreviewPostListener,
BaseFullscreenDialogFragment(DialogFragmentCreatePostBinding::inflate), EmojiPickerListener {
PreviewPostListener, EmojiPickerListener {
private var binding: DialogFragmentCreatePostBinding? = null
private val args: CreatePostDialogFragmentArgs by navArgs() private val args: CreatePostDialogFragmentArgs by navArgs()
private val binding by lazy {
getBinding() as DialogFragmentCreatePostBinding
}
private val viewModel by viewModels<CreatePostViewModel>() private val viewModel by viewModels<CreatePostViewModel>()
private val mediaPickerHelper = MediaPickerHelper(this, isVideoAvailable = true) private val mediaPickerHelper = MediaPickerHelper(this, isVideoAvailable = true)
...@@ -45,6 +48,40 @@ class CreatePostDialogFragment : ...@@ -45,6 +48,40 @@ class CreatePostDialogFragment :
parentFragmentManager.fragments.lastOrNull { it is CreatePostListener } as? CreatePostListener parentFragmentManager.fragments.lastOrNull { it is CreatePostListener } as? CreatePostListener
} }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
binding = DialogFragmentCreatePostBinding.inflate(inflater, container, false)
return binding?.root
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
dialog.setOnShowListener { setupBottomSheet(it) }
return dialog
}
private fun setupBottomSheet(dialogInterface: DialogInterface) {
val bottomSheetDialog = dialogInterface as BottomSheetDialog
val bottomSheet = bottomSheetDialog.findViewById<View>(
com.google.android.material.R.id.design_bottom_sheet
) ?: return
bottomSheet.setBackgroundColor(Color.TRANSPARENT)
bottomSheet.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
BottomSheetBehavior.from(bottomSheet).apply {
peekHeight = resources.displayMetrics.heightPixels
state = BottomSheetBehavior.STATE_EXPANDED
addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
override fun onStateChanged(bottomSheet: View, newState: Int) {
if (newState == BottomSheetBehavior.STATE_HALF_EXPANDED) dismiss()
}
override fun onSlide(bottomSheet: View, slideOffset: Float) {}
})
}
}
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
...@@ -55,31 +92,30 @@ class CreatePostDialogFragment : ...@@ -55,31 +92,30 @@ class CreatePostDialogFragment :
private fun setupViews() { private fun setupViews() {
setToolbarTitle() setToolbarTitle()
with(binding) { binding?.btnClose?.setOnClickListener { dismiss() }
vPostPreview.setup(this@CreatePostDialogFragment, args.roomId, args.isEdit) binding?.vPostPreview?.setup(this@CreatePostDialogFragment, args.roomId, args.isEdit)
}
} }
private fun setupObservers() { private fun setupObservers() {
viewModel.postToEditContentLiveData.observeData(this) { viewModel.postToEditContentLiveData.observeData(this) {
when (it.type) { when (it.type) {
PostContentType.IMAGE_CONTENT, PostContentType.VIDEO_CONTENT -> PostContentType.IMAGE_CONTENT, PostContentType.VIDEO_CONTENT ->
binding.vPostPreview.setMediaFromExistingPost(it as MediaContent) binding?.vPostPreview?.setMediaFromExistingPost(it as MediaContent)
else -> binding.vPostPreview.setText((it as TextContent).message) else -> binding?.vPostPreview?.setText((it as TextContent).message)
} }
} }
} }
private fun setToolbarTitle() { private fun setToolbarTitle() {
binding.toolbar.title = when { binding?.tvTitle?.text = when {
args.isEdit -> getString(R.string.edit_post) args.isEdit -> getString(R.string.edit_post)
else -> getString(R.string.create_post) else -> getString(R.string.create_post)
} }
} }
private fun onMediaSelected(uri: Uri, type: MediaType) { private fun onMediaSelected(uri: Uri, type: MediaType) {
binding.vPostPreview.setMedia(uri, type) binding?.vPostPreview?.setMedia(uri, type)
} }
private fun sendPost(content: CreatePostContent) { private fun sendPost(content: CreatePostContent) {
...@@ -109,7 +145,7 @@ class CreatePostDialogFragment : ...@@ -109,7 +145,7 @@ class CreatePostDialogFragment :
override fun onAddLinkClicked() { override fun onAddLinkClicked() {
AddLinkDialog(requireContext()) { title, link -> AddLinkDialog(requireContext()) { title, link ->
binding.vPostPreview.insertLink(title, link) binding?.vPostPreview?.insertLink(title, link)
}.show() }.show()
} }
...@@ -123,6 +159,11 @@ class CreatePostDialogFragment : ...@@ -123,6 +159,11 @@ class CreatePostDialogFragment :
} }
override fun onEmojiSelected(roomId: String?, eventId: String?, emoji: String) { override fun onEmojiSelected(roomId: String?, eventId: String?, emoji: String) {
binding.vPostPreview.insertEmoji(emoji) binding?.vPostPreview?.insertEmoji(emoji)
}
override fun onDestroyView() {
super.onDestroyView()
binding = null
} }
} }
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@drawable/bg_top_rounded_corners"
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.appbar.MaterialToolbar <View
android:id="@+id/toolbar" android:id="@+id/vTopLine"
android:layout_width="0dp" android:layout_width="48dp"
android:layout_height="?attr/actionBarSize" android:layout_height="2dp"
app:layout_constraintEnd_toEndOf="parent" android:layout_gravity="center"
app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="4dp"
app:layout_constraintTop_toTopOf="parent" android:background="@color/divider_color" />
app:navigationIcon="?attr/homeAsUpIndicator"
app:title="@string/create_post" <FrameLayout
app:titleCentered="true" /> android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvTitle"
style="@style/title2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/create_post" />
<ImageButton
android:id="@+id/btnClose"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center"
android:background="?selectableItemBackgroundBorderless"
android:padding="6dp"
android:src="@drawable/ic_close" />
</FrameLayout>
<View <View
android:id="@+id/divider" android:id="@+id/divider"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="@dimen/divider_height" android:layout_height="@dimen/divider_height"
android:background="@color/divider_color" android:layout_marginTop="4dp"
app:layout_constraintEnd_toEndOf="parent" android:background="@color/divider_color" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar" />
<androidx.constraintlayout.widget.ConstraintLayout <org.futo.circles.view.PreviewPostView
android:id="@+id/vPostPreview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/divider"> app:layout_constraintTop_toBottomOf="@id/divider" />
<org.futo.circles.view.PreviewPostView
android:id="@+id/vPostPreview"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="?android:colorBackground" />
<corners
android:bottomLeftRadius="0dp"
android:bottomRightRadius="0dp"
android:topLeftRadius="16dp"
android:topRightRadius="16dp" />
</shape>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment