From 8c8219f5d893019c542d001ca231dc04e99001c1 Mon Sep 17 00:00:00 2001 From: erik-everardo Date: Thu, 4 Jan 2024 16:20:38 -0600 Subject: [PATCH] * creador de links --- .../presentation/LinkCreatorViewModel.kt | 15 ++++ .../link_creator/ui/LinkCreatorFragment.kt | 74 ++++++++++++++++ .../posts/ui/MarkdownEditingFragment.kt | 18 ++++ .../layout/fragment_dialog_link_creator.xml | 84 +++++++++++++++++++ .../res/layout/fragment_markdown_editing.xml | 12 +-- app/src/main/res/values/strings.xml | 3 + build.gradle | 4 +- 7 files changed, 202 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/isolaatti/posting/link_creator/presentation/LinkCreatorViewModel.kt create mode 100644 app/src/main/java/com/isolaatti/posting/link_creator/ui/LinkCreatorFragment.kt create mode 100644 app/src/main/res/layout/fragment_dialog_link_creator.xml diff --git a/app/src/main/java/com/isolaatti/posting/link_creator/presentation/LinkCreatorViewModel.kt b/app/src/main/java/com/isolaatti/posting/link_creator/presentation/LinkCreatorViewModel.kt new file mode 100644 index 0000000..5157539 --- /dev/null +++ b/app/src/main/java/com/isolaatti/posting/link_creator/presentation/LinkCreatorViewModel.kt @@ -0,0 +1,15 @@ +package com.isolaatti.posting.link_creator.presentation + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.isolaatti.markdown.Generators + +class LinkCreatorViewModel : ViewModel() { + val liveMarkdown: MutableLiveData = MutableLiveData() + val markdown: String get() = liveMarkdown.value ?: "" + val inserted: MutableLiveData = MutableLiveData() + + fun generateMarkdown(text: String, url: String) { + liveMarkdown.value = Generators.generateLink(text, url) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/posting/link_creator/ui/LinkCreatorFragment.kt b/app/src/main/java/com/isolaatti/posting/link_creator/ui/LinkCreatorFragment.kt new file mode 100644 index 0000000..02eedca --- /dev/null +++ b/app/src/main/java/com/isolaatti/posting/link_creator/ui/LinkCreatorFragment.kt @@ -0,0 +1,74 @@ +package com.isolaatti.posting.link_creator.ui + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.widget.doOnTextChanged +import androidx.fragment.app.viewModels +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.isolaatti.R +import com.isolaatti.databinding.FragmentDialogLinkCreatorBinding +import com.isolaatti.posting.link_creator.presentation.LinkCreatorViewModel +import io.noties.markwon.Markwon +import io.noties.markwon.linkify.LinkifyPlugin + +class LinkCreatorFragment : BottomSheetDialogFragment() { + + private lateinit var binding: FragmentDialogLinkCreatorBinding + private val viewModel: LinkCreatorViewModel by viewModels( { requireParentFragment() }) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + } + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentDialogLinkCreatorBinding.inflate(inflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + setupListeners() + setupObservers() + } + + private fun setupObservers() { + viewModel.liveMarkdown.observe(viewLifecycleOwner) { markdown -> + binding.markdownTextView.text = markdown + } + } + + private fun setupListeners() { + binding.text.editText?.doOnTextChanged { text, start, before, count -> + viewModel.generateMarkdown(text.toString(), binding.url.editText?.text.toString()) + } + + binding.url.editText?.doOnTextChanged { text, start, before, count -> + viewModel.generateMarkdown(binding.text.editText?.text.toString(), text.toString()) + } + + binding.card.setOnClickListener { + showMarkdownDialog() + } + + binding.button.setOnClickListener { + viewModel.inserted.value = true + dismiss() + } + } + + private fun showMarkdownDialog() { + MaterialAlertDialogBuilder(requireContext()) + .setMessage(viewModel.markdown) + .setNegativeButton(R.string.close, null) + .show() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownEditingFragment.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownEditingFragment.kt index f71fc82..836c8ab 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownEditingFragment.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownEditingFragment.kt @@ -8,13 +8,17 @@ import android.view.ViewGroup import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels import com.isolaatti.databinding.FragmentMarkdownEditingBinding import com.isolaatti.images.image_chooser.ui.ImageChooserContract +import com.isolaatti.posting.link_creator.presentation.LinkCreatorViewModel +import com.isolaatti.posting.link_creator.ui.LinkCreatorFragment import com.isolaatti.posting.posts.presentation.CreatePostViewModel class MarkdownEditingFragment : Fragment(){ private lateinit var binding: FragmentMarkdownEditingBinding private val viewModel: CreatePostViewModel by activityViewModels() + private val linkCreatorViewModel: LinkCreatorViewModel by viewModels() private val imageChooserLauncher = registerForActivityResult(ImageChooserContract()) { image -> Log.d("MarkdownEditingFragment", "${image?.markdown}") @@ -56,15 +60,29 @@ class MarkdownEditingFragment : Fragment(){ binding.addImageButton.setOnClickListener { insertImage() } + binding.addLinkButton.setOnClickListener { + insertLink() + } } private fun setupObservers(){ viewModel.postToEdit.observe(viewLifecycleOwner) { binding.filledTextField.editText?.setText(it.content) } + linkCreatorViewModel.inserted.observe(viewLifecycleOwner) { + if(it) { + viewModel.content += " ${linkCreatorViewModel.markdown}" + binding.filledTextField.editText?.setText(viewModel.content) + linkCreatorViewModel.inserted.value = false + } + } } private fun insertImage() { imageChooserLauncher.launch(ImageChooserContract.Requester.UserPost) } + + private fun insertLink() { + LinkCreatorFragment().show(childFragmentManager, null) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_dialog_link_creator.xml b/app/src/main/res/layout/fragment_dialog_link_creator.xml new file mode 100644 index 0000000..692433a --- /dev/null +++ b/app/src/main/res/layout/fragment_dialog_link_creator.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_markdown_editing.xml b/app/src/main/res/layout/fragment_markdown_editing.xml index 4e50a8d..cf148cc 100644 --- a/app/src/main/res/layout/fragment_markdown_editing.xml +++ b/app/src/main/res/layout/fragment_markdown_editing.xml @@ -33,12 +33,12 @@ android:layout_height="wrap_content" style="@style/Widget.Material3.Button.IconButton" app:icon="@drawable/baseline_image_24" /> - - - - - - + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e3ae501..ae714ce 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -129,4 +129,7 @@ Preview Add image here Choose image + Url + Text + Insert url \ No newline at end of file diff --git a/build.gradle b/build.gradle index 1b8b9a9..60de2e7 100644 --- a/build.gradle +++ b/build.gradle @@ -12,8 +12,8 @@ buildscript { } } plugins { - id 'com.android.application' version '8.2.0' apply false - id 'com.android.library' version '8.2.0' apply false + id 'com.android.application' version '8.2.1' apply false + id 'com.android.library' version '8.2.1' apply false id 'org.jetbrains.kotlin.android' version '1.8.0' apply false id 'com.google.dagger.hilt.android' version '2.47' apply false } \ No newline at end of file