* creador de links
This commit is contained in:
parent
dd6c981b02
commit
8c8219f5d8
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -8,13 +8,17 @@ import android.view.ViewGroup
|
|||||||
import androidx.core.widget.doOnTextChanged
|
import androidx.core.widget.doOnTextChanged
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import androidx.fragment.app.viewModels
|
||||||
import com.isolaatti.databinding.FragmentMarkdownEditingBinding
|
import com.isolaatti.databinding.FragmentMarkdownEditingBinding
|
||||||
import com.isolaatti.images.image_chooser.ui.ImageChooserContract
|
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
|
import com.isolaatti.posting.posts.presentation.CreatePostViewModel
|
||||||
|
|
||||||
class MarkdownEditingFragment : Fragment(){
|
class MarkdownEditingFragment : Fragment(){
|
||||||
private lateinit var binding: FragmentMarkdownEditingBinding
|
private lateinit var binding: FragmentMarkdownEditingBinding
|
||||||
private val viewModel: CreatePostViewModel by activityViewModels()
|
private val viewModel: CreatePostViewModel by activityViewModels()
|
||||||
|
private val linkCreatorViewModel: LinkCreatorViewModel by viewModels()
|
||||||
|
|
||||||
private val imageChooserLauncher = registerForActivityResult(ImageChooserContract()) { image ->
|
private val imageChooserLauncher = registerForActivityResult(ImageChooserContract()) { image ->
|
||||||
Log.d("MarkdownEditingFragment", "${image?.markdown}")
|
Log.d("MarkdownEditingFragment", "${image?.markdown}")
|
||||||
@ -56,15 +60,29 @@ class MarkdownEditingFragment : Fragment(){
|
|||||||
binding.addImageButton.setOnClickListener {
|
binding.addImageButton.setOnClickListener {
|
||||||
insertImage()
|
insertImage()
|
||||||
}
|
}
|
||||||
|
binding.addLinkButton.setOnClickListener {
|
||||||
|
insertLink()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupObservers(){
|
private fun setupObservers(){
|
||||||
viewModel.postToEdit.observe(viewLifecycleOwner) {
|
viewModel.postToEdit.observe(viewLifecycleOwner) {
|
||||||
binding.filledTextField.editText?.setText(it.content)
|
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() {
|
private fun insertImage() {
|
||||||
imageChooserLauncher.launch(ImageChooserContract.Requester.UserPost)
|
imageChooserLauncher.launch(ImageChooserContract.Requester.UserPost)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun insertLink() {
|
||||||
|
LinkCreatorFragment().show(childFragmentManager, null)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
84
app/src/main/res/layout/fragment_dialog_link_creator.xml
Normal file
84
app/src/main/res/layout/fragment_dialog_link_creator.xml
Normal 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>
|
||||||
@ -33,12 +33,12 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
style="@style/Widget.Material3.Button.IconButton"
|
style="@style/Widget.Material3.Button.IconButton"
|
||||||
app:icon="@drawable/baseline_image_24" />
|
app:icon="@drawable/baseline_image_24" />
|
||||||
<!-- <com.google.android.material.button.MaterialButton-->
|
<com.google.android.material.button.MaterialButton
|
||||||
<!-- android:id="@+id/add_link_button"-->
|
android:id="@+id/add_link_button"
|
||||||
<!-- android:layout_width="wrap_content"-->
|
android:layout_width="wrap_content"
|
||||||
<!-- android:layout_height="wrap_content"-->
|
android:layout_height="wrap_content"
|
||||||
<!-- style="@style/Widget.Material3.Button.IconButton"-->
|
style="@style/Widget.Material3.Button.IconButton"
|
||||||
<!-- app:icon="@drawable/baseline_add_link_24" />-->
|
app:icon="@drawable/baseline_add_link_24" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</androidx.core.widget.NestedScrollView>
|
</androidx.core.widget.NestedScrollView>
|
||||||
@ -129,4 +129,7 @@
|
|||||||
<string name="preview">Preview</string>
|
<string name="preview">Preview</string>
|
||||||
<string name="add_image_here">Add image here</string>
|
<string name="add_image_here">Add image here</string>
|
||||||
<string name="choose_image">Choose image</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>
|
</resources>
|
||||||
@ -12,8 +12,8 @@ buildscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
plugins {
|
plugins {
|
||||||
id 'com.android.application' version '8.2.0' apply false
|
id 'com.android.application' version '8.2.1' apply false
|
||||||
id 'com.android.library' version '8.2.0' apply false
|
id 'com.android.library' version '8.2.1' apply false
|
||||||
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
|
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
|
||||||
id 'com.google.dagger.hilt.android' version '2.47' apply false
|
id 'com.google.dagger.hilt.android' version '2.47' apply false
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user