WIP editor de publicaciones y agregar imagen en publicacion

This commit is contained in:
erik-everardo 2023-12-28 23:16:53 -06:00
parent 5a26cdbfb9
commit 08d6791410
11 changed files with 131 additions and 2 deletions

View File

@ -38,6 +38,7 @@
<activity android:name=".images.picture_viewer.ui.PictureViewerActivity" android:theme="@style/Theme.Isolaatti"/>
<activity android:name=".sign_up.ui.SignUpActivity" android:theme="@style/Theme.Isolaatti"/>
<activity android:name=".images.image_maker.ui.ImageMakerActivity" android:theme="@style/Theme.Isolaatti"/>
<activity android:name=".images.image_chooser.ui.ImageChooserActivity" android:theme="@style/Theme.Isolaatti"/>
<provider
android:authorities="com.isolaatti.provider"
android:name="androidx.core.content.FileProvider"

View File

@ -0,0 +1,6 @@
package com.isolaatti.images.image_chooser.presentation
import androidx.lifecycle.ViewModel
class ImageChooserViewModel : ViewModel() {
}

View File

@ -0,0 +1,22 @@
package com.isolaatti.images.image_chooser.ui
import android.os.Bundle
import android.os.PersistableBundle
import androidx.appcompat.app.AppCompatActivity
import com.isolaatti.databinding.ActivityImageChooserBinding
class ImageChooserActivity : AppCompatActivity() {
private lateinit var binding: ActivityImageChooserBinding
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
binding = ActivityImageChooserBinding.inflate(layoutInflater)
setContentView(binding.root)
}
companion object {
const val INPUT_EXTRA = "requester"
const val OUTPUT_EXTRA_IMAGE = "output_image"
}
}

View File

@ -0,0 +1,30 @@
package com.isolaatti.images.image_chooser.ui
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.activity.result.contract.ActivityResultContract
import com.isolaatti.images.common.domain.entity.Image
class ImageChooserContract : ActivityResultContract<ImageChooserContract.Requester, Image?>() {
enum class Requester {
UserPost, SquadPost
}
override fun createIntent(context: Context, input: Requester): Intent {
return Intent(context, ImageChooserActivity::class.java).apply {
putExtra(ImageChooserActivity.INPUT_EXTRA, input)
}
}
override fun parseResult(resultCode: Int, intent: Intent?): Image? {
if(resultCode != Activity.RESULT_OK) { return null }
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
intent?.getSerializableExtra(ImageChooserActivity.OUTPUT_EXTRA_IMAGE) as Image?
} else {
intent?.getSerializableExtra(ImageChooserActivity.OUTPUT_EXTRA_IMAGE, Image::class.java)
}
}
}

View File

@ -0,0 +1,14 @@
package com.isolaatti.markdown
object Generators {
fun generateImage(url: String): String {
// TODO: normalize input text to avoid conflicts with markdown syntax
return "![]($url)"
}
fun generateLink(text: String, url: String): String {
// TODO: normalize input text to avoid conflicts with markdown syntax
return "[${text}]($url)"
}
}

View File

@ -0,0 +1,5 @@
package com.isolaatti.markdown
interface Wrapper {
val symbol: String
}

View File

@ -0,0 +1,13 @@
package com.isolaatti.markdown
object Wrappers {
val boldWrapper = object: Wrapper {
override val symbol: String
get() = "**"
}
val italicsWrapper = object: Wrapper {
override val symbol: String
get() = "*"
}
}

View File

@ -1,16 +1,21 @@
package com.isolaatti.posting.posts.ui
import android.os.Bundle
import android.util.Log
import android.view.ActionMode
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
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.R
import com.isolaatti.databinding.FragmentMarkdownEditingBinding
import com.isolaatti.images.image_chooser.ui.ImageChooserActivity
import com.isolaatti.images.image_chooser.ui.ImageChooserContract
import com.isolaatti.posting.posts.presentation.CreatePostViewModel
import dagger.hilt.EntryPoint
@ -18,6 +23,10 @@ class MarkdownEditingFragment : Fragment(){
private lateinit var binding: FragmentMarkdownEditingBinding
private val viewModel: CreatePostViewModel by activityViewModels()
private val imageChooserLauncher = registerForActivityResult(ImageChooserContract()) { image ->
Log.d("MarkdownEditingFragment", "$image")
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -32,6 +41,7 @@ class MarkdownEditingFragment : Fragment(){
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.filledTextField.editText?.setText(viewModel.content)
binding.filledTextField.requestFocus()
binding.filledTextField.editText?.doOnTextChanged { text, _, _, _ ->
// make better validation :)
@ -49,7 +59,7 @@ class MarkdownEditingFragment : Fragment(){
}
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
return true
return false
}
override fun onDestroyActionMode(mode: ActionMode?) {
@ -59,6 +69,7 @@ class MarkdownEditingFragment : Fragment(){
binding.filledTextField.editText?.customInsertionActionModeCallback = object: ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
MenuInflater(requireContext()).inflate(R.menu.contextual_menu_post_content, menu)
return true
}
@ -67,9 +78,15 @@ class MarkdownEditingFragment : Fragment(){
}
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
if(item?.itemId == R.id.add_image_here_menu_item) {
insertImage()
mode?.finish()
return true
}
return false
}
override fun onDestroyActionMode(mode: ActionMode?) {
}
@ -80,4 +97,8 @@ class MarkdownEditingFragment : Fragment(){
binding.filledTextField.editText?.setText(it.content)
}
}
private fun insertImage() {
imageChooserLauncher.launch(ImageChooserContract.Requester.UserPost)
}
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_image_here_menu_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:title="@string/add_image_here" />
</menu>

View File

@ -127,4 +127,5 @@
<string name="deleting_please_wait">Deleting, please wait…</string>
<string name="markdown">Markdown</string>
<string name="preview">Preview</string>
<string name="add_image_here">Add image here</string>
</resources>