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=".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=".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_maker.ui.ImageMakerActivity" android:theme="@style/Theme.Isolaatti"/>
<activity android:name=".images.image_chooser.ui.ImageChooserActivity" android:theme="@style/Theme.Isolaatti"/>
<provider <provider
android:authorities="com.isolaatti.provider" android:authorities="com.isolaatti.provider"
android:name="androidx.core.content.FileProvider" 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 package com.isolaatti.posting.posts.ui
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.ActionMode import android.view.ActionMode
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup 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 com.isolaatti.R
import com.isolaatti.databinding.FragmentMarkdownEditingBinding 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 com.isolaatti.posting.posts.presentation.CreatePostViewModel
import dagger.hilt.EntryPoint import dagger.hilt.EntryPoint
@ -18,6 +23,10 @@ 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 imageChooserLauncher = registerForActivityResult(ImageChooserContract()) { image ->
Log.d("MarkdownEditingFragment", "$image")
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@ -32,6 +41,7 @@ class MarkdownEditingFragment : Fragment(){
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.filledTextField.editText?.setText(viewModel.content)
binding.filledTextField.requestFocus() binding.filledTextField.requestFocus()
binding.filledTextField.editText?.doOnTextChanged { text, _, _, _ -> binding.filledTextField.editText?.doOnTextChanged { text, _, _, _ ->
// make better validation :) // make better validation :)
@ -49,7 +59,7 @@ class MarkdownEditingFragment : Fragment(){
} }
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean { override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
return true return false
} }
override fun onDestroyActionMode(mode: ActionMode?) { override fun onDestroyActionMode(mode: ActionMode?) {
@ -59,6 +69,7 @@ class MarkdownEditingFragment : Fragment(){
binding.filledTextField.editText?.customInsertionActionModeCallback = object: ActionMode.Callback { binding.filledTextField.editText?.customInsertionActionModeCallback = object: ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean { override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
MenuInflater(requireContext()).inflate(R.menu.contextual_menu_post_content, menu)
return true return true
} }
@ -67,9 +78,15 @@ class MarkdownEditingFragment : Fragment(){
} }
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean { override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
if(item?.itemId == R.id.add_image_here_menu_item) {
insertImage()
mode?.finish()
return true return true
} }
return false
}
override fun onDestroyActionMode(mode: ActionMode?) { override fun onDestroyActionMode(mode: ActionMode?) {
} }
@ -80,4 +97,8 @@ class MarkdownEditingFragment : Fragment(){
binding.filledTextField.editText?.setText(it.content) 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="deleting_please_wait">Deleting, please wait…</string>
<string name="markdown">Markdown</string> <string name="markdown">Markdown</string>
<string name="preview">Preview</string> <string name="preview">Preview</string>
<string name="add_image_here">Add image here</string>
</resources> </resources>