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