* creador de links

This commit is contained in:
erik-everardo 2024-01-04 16:20:38 -06:00
parent dd6c981b02
commit 8c8219f5d8
7 changed files with 202 additions and 8 deletions

View File

@ -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<String> = MutableLiveData()
val markdown: String get() = liveMarkdown.value ?: ""
val inserted: MutableLiveData<Boolean> = MutableLiveData()
fun generateMarkdown(text: String, url: String) {
liveMarkdown.value = Generators.generateLink(text, url)
}
}

View File

@ -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()
}
}

View File

@ -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)
}
}

View File

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.google.android.material.bottomsheet.BottomSheetDragHandleView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toTopOf="@+id/card"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/card"
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginEnd="24dp"
android:layout_marginBottom="16dp"
android:padding="8dp"
app:layout_constraintBottom_toTopOf="@+id/text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<TextView
android:id="@+id/markdown_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="3"
android:layout_margin="8dp"/>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginEnd="24dp"
android:layout_marginBottom="16dp"
android:hint="@string/text"
app:layout_constraintBottom_toTopOf="@+id/url"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginEnd="24dp"
android:layout_marginBottom="16dp"
android:hint="@string/url"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="@string/insert_url"
style="@style/Widget.Material3.Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -33,12 +33,12 @@
android:layout_height="wrap_content"
style="@style/Widget.Material3.Button.IconButton"
app:icon="@drawable/baseline_image_24" />
<!-- <com.google.android.material.button.MaterialButton-->
<!-- android:id="@+id/add_link_button"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- style="@style/Widget.Material3.Button.IconButton"-->
<!-- app:icon="@drawable/baseline_add_link_24" />-->
<com.google.android.material.button.MaterialButton
android:id="@+id/add_link_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.Material3.Button.IconButton"
app:icon="@drawable/baseline_add_link_24" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -129,4 +129,7 @@
<string name="preview">Preview</string>
<string name="add_image_here">Add image here</string>
<string name="choose_image">Choose image</string>
<string name="url">Url</string>
<string name="text">Text</string>
<string name="insert_url">Insert url</string>
</resources>

View File

@ -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
}