WIP editor de publicaciones y agregar imagen en publicacion
This commit is contained in:
parent
5a26cdbfb9
commit
08d6791410
@ -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"
|
||||||
|
|||||||
@ -0,0 +1,6 @@
|
|||||||
|
package com.isolaatti.images.image_chooser.presentation
|
||||||
|
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
|
||||||
|
class ImageChooserViewModel : ViewModel() {
|
||||||
|
}
|
||||||
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
14
app/src/main/java/com/isolaatti/markdown/Generators.kt
Normal file
14
app/src/main/java/com/isolaatti/markdown/Generators.kt
Normal 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 ""
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun generateLink(text: String, url: String): String {
|
||||||
|
// TODO: normalize input text to avoid conflicts with markdown syntax
|
||||||
|
return "[${text}]($url)"
|
||||||
|
}
|
||||||
|
}
|
||||||
5
app/src/main/java/com/isolaatti/markdown/Wrapper.kt
Normal file
5
app/src/main/java/com/isolaatti/markdown/Wrapper.kt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package com.isolaatti.markdown
|
||||||
|
|
||||||
|
interface Wrapper {
|
||||||
|
val symbol: String
|
||||||
|
}
|
||||||
13
app/src/main/java/com/isolaatti/markdown/Wrappers.kt
Normal file
13
app/src/main/java/com/isolaatti/markdown/Wrappers.kt
Normal 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() = "*"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
7
app/src/main/res/layout/activity_image_chooser.xml
Normal file
7
app/src/main/res/layout/activity_image_chooser.xml
Normal 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>
|
||||||
9
app/src/main/res/menu/contextual_menu_post_content.xml
Normal file
9
app/src/main/res/menu/contextual_menu_post_content.xml
Normal 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>
|
||||||
@ -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>
|
||||||
Loading…
x
Reference in New Issue
Block a user