diff --git a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt index 37b629d3aaeda0588c4623ce8598d9d707f9e43d..c333babbd9e0e75299e7a082673372b0eab7343f 100644 --- a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt +++ b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt @@ -1,17 +1,24 @@ package org.futo.circles.feature.timeline.post.create +import android.app.Dialog import android.content.Context +import android.content.DialogInterface +import android.graphics.Color import android.net.Uri import android.os.Bundle +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.view.WindowManager import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController 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 org.futo.circles.R 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.observeData import org.futo.circles.core.extensions.showError @@ -23,17 +30,13 @@ import org.futo.circles.core.model.TextContent import org.futo.circles.databinding.DialogFragmentCreatePostBinding import org.futo.circles.feature.timeline.post.emoji.EmojiPickerListener import org.futo.circles.model.CreatePostContent -import java.util.* @AndroidEntryPoint -class CreatePostDialogFragment : - BaseFullscreenDialogFragment(DialogFragmentCreatePostBinding::inflate), - PreviewPostListener, EmojiPickerListener { +class CreatePostDialogFragment : BottomSheetDialogFragment(), PreviewPostListener, + EmojiPickerListener { + private var binding: DialogFragmentCreatePostBinding? = null private val args: CreatePostDialogFragmentArgs by navArgs() - private val binding by lazy { - getBinding() as DialogFragmentCreatePostBinding - } private val viewModel by viewModels<CreatePostViewModel>() private val mediaPickerHelper = MediaPickerHelper(this, isVideoAvailable = true) @@ -45,6 +48,40 @@ class CreatePostDialogFragment : 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") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -55,31 +92,30 @@ class CreatePostDialogFragment : private fun setupViews() { setToolbarTitle() - with(binding) { - vPostPreview.setup(this@CreatePostDialogFragment, args.roomId, args.isEdit) - } + binding?.btnClose?.setOnClickListener { dismiss() } + binding?.vPostPreview?.setup(this@CreatePostDialogFragment, args.roomId, args.isEdit) } private fun setupObservers() { viewModel.postToEditContentLiveData.observeData(this) { when (it.type) { 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() { - binding.toolbar.title = when { + binding?.tvTitle?.text = when { args.isEdit -> getString(R.string.edit_post) else -> getString(R.string.create_post) } } private fun onMediaSelected(uri: Uri, type: MediaType) { - binding.vPostPreview.setMedia(uri, type) + binding?.vPostPreview?.setMedia(uri, type) } private fun sendPost(content: CreatePostContent) { @@ -109,7 +145,7 @@ class CreatePostDialogFragment : override fun onAddLinkClicked() { AddLinkDialog(requireContext()) { title, link -> - binding.vPostPreview.insertLink(title, link) + binding?.vPostPreview?.insertLink(title, link) }.show() } @@ -123,6 +159,11 @@ class CreatePostDialogFragment : } 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 diff --git a/app/src/main/res/layout/dialog_fragment_create_post.xml b/app/src/main/res/layout/dialog_fragment_create_post.xml index ac9ce83e80201a992489b57dc0f8e32cbc3ba6c5..f3c76d3a8f4cc348d95b94b21691390c67a07dc7 100644 --- a/app/src/main/res/layout/dialog_fragment_create_post.xml +++ b/app/src/main/res/layout/dialog_fragment_create_post.xml @@ -1,52 +1,60 @@ <?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" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@drawable/bg_top_rounded_corners" android:orientation="vertical"> - <com.google.android.material.appbar.MaterialToolbar - android:id="@+id/toolbar" - android:layout_width="0dp" - android:layout_height="?attr/actionBarSize" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:navigationIcon="?attr/homeAsUpIndicator" - app:title="@string/create_post" - app:titleCentered="true" /> + <View + android:id="@+id/vTopLine" + android:layout_width="48dp" + android:layout_height="2dp" + android:layout_gravity="center" + android:layout_marginTop="4dp" + android:background="@color/divider_color" /> + + <FrameLayout + 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 android:id="@+id/divider" - android:layout_width="0dp" + android:layout_width="match_parent" android:layout_height="@dimen/divider_height" - android:background="@color/divider_color" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/toolbar" /> + android:layout_marginTop="4dp" + android:background="@color/divider_color" /> + - <androidx.constraintlayout.widget.ConstraintLayout + <org.futo.circles.view.PreviewPostView + android:id="@+id/vPostPreview" android:layout_width="match_parent" - android:layout_height="0dp" - android:clipChildren="false" - android:clipToPadding="false" - android:orientation="vertical" + android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - 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> + app:layout_constraintTop_toBottomOf="@id/divider" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file +</LinearLayout> \ No newline at end of file diff --git a/core/src/main/res/drawable/bg_top_rounded_corners.xml b/core/src/main/res/drawable/bg_top_rounded_corners.xml new file mode 100644 index 0000000000000000000000000000000000000000..06ea43007348afcfc944ba72f91d61926c8953ed --- /dev/null +++ b/core/src/main/res/drawable/bg_top_rounded_corners.xml @@ -0,0 +1,9 @@ +<?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