From 5a26cdbfb96d49618e49ad324eb0c2940cf2cd59 Mon Sep 17 00:00:00 2001 From: erik-everardo Date: Wed, 27 Dec 2023 00:31:54 -0600 Subject: [PATCH] =?UTF-8?q?WIP=20redise=C3=B1o=20pantalla=20de=20publicar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/assetWizardSettings.xml | 20 +-- .idea/navEditor.xml | 34 +++++ .../posts/presentation/CreatePostViewModel.kt | 5 +- .../posting/posts/ui/CreatePostActivity.kt | 44 ++++-- .../posts/ui/MarkdownEditingFragment.kt | 83 ++++++++++++ .../posts/ui/MarkdownPreviewFragment.kt | 61 +++++++++ .../main/res/layout/activity_create_post.xml | 125 ++++++++++-------- .../res/layout/fragment_markdown_editing.xml | 22 +++ .../res/layout/fragment_markdown_preview.xml | 16 +++ .../navigation/post_creator_navigation.xml | 15 +++ app/src/main/res/values/strings.xml | 2 + 11 files changed, 341 insertions(+), 86 deletions(-) create mode 100644 app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownEditingFragment.kt create mode 100644 app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownPreviewFragment.kt create mode 100644 app/src/main/res/layout/fragment_markdown_editing.xml create mode 100644 app/src/main/res/layout/fragment_markdown_preview.xml create mode 100644 app/src/main/res/navigation/post_creator_navigation.xml diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index 1941e44..e8056bb 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -301,25 +301,11 @@ - diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml index a77cb68..bda1095 100644 --- a/.idea/navEditor.xml +++ b/.idea/navEditor.xml @@ -181,6 +181,40 @@ + + + + + + + diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt index 63b6092..4193fd4 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt @@ -27,8 +27,9 @@ class CreatePostViewModel @Inject constructor(private val makePost: MakePost, pr val error: MutableLiveData = MutableLiveData() val loading: MutableLiveData = MutableLiveData(false) val postToEdit: MutableLiveData = MutableLiveData() + var content: String = "" - fun postDiscussion(content: String) { + fun postDiscussion() { viewModelScope.launch { makePost(EditPostDto.PRIVACY_ISOLAATTI, content, null, null).onEach { when(it) { @@ -48,7 +49,7 @@ class CreatePostViewModel @Inject constructor(private val makePost: MakePost, pr } } - fun editDiscussion(postId: Long, content: String) { + fun editDiscussion(postId: Long) { viewModelScope.launch { editPost(postId, EditPostDto.PRIVACY_ISOLAATTI, content, null, null).onEach { when(it) { diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostActivity.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostActivity.kt index 467ba15..a4c3eb7 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostActivity.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/ui/CreatePostActivity.kt @@ -9,6 +9,8 @@ import androidx.core.widget.doOnTextChanged import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.findNavController +import com.google.android.material.tabs.TabLayout import com.isolaatti.R import com.isolaatti.common.IsolaattiBaseActivity import com.isolaatti.databinding.ActivityCreatePostBinding @@ -69,9 +71,9 @@ class CreatePostActivity : IsolaattiBaseActivity() { } if(mode == EXTRA_MODE_EDIT && postId != 0L) { - viewModel.editDiscussion(postId, binding.filledTextField.editText?.text.toString()) + viewModel.editDiscussion(postId) } else { - viewModel.postDiscussion(binding.filledTextField.editText?.text.toString()) + viewModel.postDiscussion() } } } @@ -81,25 +83,45 @@ class CreatePostActivity : IsolaattiBaseActivity() { private fun setupUI() { binding.toolbar.setTitle(if(mode == EXTRA_MODE_EDIT && postId != 0L) R.string.edit else R.string.new_post) - binding.filledTextField.requestFocus() + } private fun setListeners() { binding.toolbar.setNavigationOnClickListener { exit() } - binding.filledTextField.editText?.doOnTextChanged { text, _, _, _ -> - // make better validation :) - viewModel.validation.postValue(!text.isNullOrEmpty()) - } + binding.postButton.setOnClickListener { if(mode == EXTRA_MODE_EDIT && postId != 0L) { - viewModel.editDiscussion(postId, binding.filledTextField.editText?.text.toString()) + viewModel.editDiscussion(postId) } else { - viewModel.postDiscussion(binding.filledTextField.editText?.text.toString()) + viewModel.postDiscussion() } } + + binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + + override fun onTabSelected(tab: TabLayout.Tab?) { + + when(tab?.position) { + 0 -> /*editing*/ { + findNavController(binding.fragmentContainerView.id).navigate(R.id.markdownEditingFragment) + } + 1 -> /*preview*/ { + findNavController(binding.fragmentContainerView.id).navigate(R.id.markdownPreviewFragment) + } + } + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + // Handle tab reselect + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + // Handle tab unselect + } + }) } private fun setObservers() { @@ -121,10 +143,6 @@ class CreatePostActivity : IsolaattiBaseActivity() { viewModel.loading.observe(this@CreatePostActivity) { binding.progressBarLoading.visibility = if(it) View.VISIBLE else View.GONE } - - viewModel.postToEdit.observe(this) { - binding.filledTextField.editText?.setText(it.content) - } } private fun exit() { 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 new file mode 100644 index 0000000..48efb7d --- /dev/null +++ b/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownEditingFragment.kt @@ -0,0 +1,83 @@ +package com.isolaatti.posting.posts.ui + +import android.os.Bundle +import android.view.ActionMode +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import androidx.core.widget.doOnTextChanged +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import com.isolaatti.databinding.FragmentMarkdownEditingBinding +import com.isolaatti.posting.posts.presentation.CreatePostViewModel +import dagger.hilt.EntryPoint + +class MarkdownEditingFragment : Fragment(){ + private lateinit var binding: FragmentMarkdownEditingBinding + private val viewModel: CreatePostViewModel by activityViewModels() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + + binding = FragmentMarkdownEditingBinding.inflate(layoutInflater) + + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.filledTextField.requestFocus() + binding.filledTextField.editText?.doOnTextChanged { text, _, _, _ -> + // make better validation :) + viewModel.validation.postValue(!text.isNullOrEmpty()) + viewModel.content = text.toString() + } + + binding.filledTextField.editText?.customSelectionActionModeCallback = object: ActionMode.Callback { + override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean { + return true + } + + override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean { + return true + } + + override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean { + return true + } + + override fun onDestroyActionMode(mode: ActionMode?) { + + } + } + + binding.filledTextField.editText?.customInsertionActionModeCallback = object: ActionMode.Callback { + override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean { + return true + } + + override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean { + return true + } + + override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean { + return true + } + + override fun onDestroyActionMode(mode: ActionMode?) { + + } + + } + + viewModel.postToEdit.observe(viewLifecycleOwner) { + binding.filledTextField.editText?.setText(it.content) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownPreviewFragment.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownPreviewFragment.kt new file mode 100644 index 0000000..aba1e1c --- /dev/null +++ b/app/src/main/java/com/isolaatti/posting/posts/ui/MarkdownPreviewFragment.kt @@ -0,0 +1,61 @@ +package com.isolaatti.posting.posts.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.Fragment +import androidx.fragment.app.activityViewModels +import com.isolaatti.common.CoilImageLoader +import com.isolaatti.databinding.FragmentMarkdownEditingBinding +import com.isolaatti.databinding.FragmentMarkdownPreviewBinding +import com.isolaatti.posting.posts.presentation.CreatePostViewModel +import dagger.hilt.EntryPoint +import io.noties.markwon.AbstractMarkwonPlugin +import io.noties.markwon.Markwon +import io.noties.markwon.MarkwonConfiguration +import io.noties.markwon.image.coil.CoilImagesPlugin +import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute +import io.noties.markwon.linkify.LinkifyPlugin + +class MarkdownPreviewFragment : Fragment() { + private lateinit var binding: FragmentMarkdownPreviewBinding + private val viewModel: CreatePostViewModel by activityViewModels() + private var markwon: Markwon? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + markwon = Markwon.builder(requireContext()) + .usePlugin(object: AbstractMarkwonPlugin() { + override fun configureConfiguration(builder: MarkwonConfiguration.Builder) { + builder + .imageDestinationProcessor( + ImageDestinationProcessorRelativeToAbsolute + .create("https://isolaatti.com/")) + } + }) + .usePlugin(CoilImagesPlugin.create(requireContext(), CoilImageLoader.imageLoader)) + .usePlugin(LinkifyPlugin.create()) + .build() + } + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentMarkdownPreviewBinding.inflate(layoutInflater) + return binding.root + } + + override fun onDestroy() { + super.onDestroy() + + markwon = null + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + markwon?.setMarkdown(binding.textView, viewModel.content) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_create_post.xml b/app/src/main/res/layout/activity_create_post.xml index ecc640a..4d8e306 100644 --- a/app/src/main/res/layout/activity_create_post.xml +++ b/app/src/main/res/layout/activity_create_post.xml @@ -5,66 +5,83 @@ android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> - - + - - - - - - - - + + app:navigationIcon="@drawable/baseline_close_24" + app:navigationIconTint="@color/on_surface" + app:title="@string/new_post" + app:titleCentered="true"> + - - - + - - + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..afa34ae --- /dev/null +++ b/app/src/main/res/layout/fragment_markdown_editing.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_markdown_preview.xml b/app/src/main/res/layout/fragment_markdown_preview.xml new file mode 100644 index 0000000..57cc45f --- /dev/null +++ b/app/src/main/res/layout/fragment_markdown_preview.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/post_creator_navigation.xml b/app/src/main/res/navigation/post_creator_navigation.xml new file mode 100644 index 0000000..fd68410 --- /dev/null +++ b/app/src/main/res/navigation/post_creator_navigation.xml @@ -0,0 +1,15 @@ + + + + + + \ 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 5a69fb4..6031f4b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -125,4 +125,6 @@ Yes, discard image Discard image? Deleting, please wait… + Markdown + Preview \ No newline at end of file